Парсер в C# и печать AST
Я реализую AST (Абстрактное синтаксическое дерево) в C# для сложной грамматики, однако, чтобы упростить этот вопрос, я буду использовать очень простую грамматику.
Рассмотрим эту грамматику:
rules Expr ::= Term "+" Term
| Term ;
rules Term ::= Ident
| Integer ;
Я использовал bnfc, сгенерировал парсер / лексер и дошел до того, что могу разобрать кусок кода и распечатать дерево разбора. Теперь я хочу сопоставить его с AST и распечатать абстрактное синтаксическое дерево. вот что я сделал до сих пор в примере проекта.
Однако в настоящее время, когда я тестирую программу, мой AST возвращается как NULL.
var astGen = new gplex.VisitSkeleton.ExprVisitor<Expr1, gplex.Absyn.Expr1>();
var ast = astGen.Visit((gplex.Absyn.Expr1)parse_tree, (gplex.Absyn.Expr1)parse_tree);
Здесь ast - это ноль. Может ли кто-то с опытом в C# помочь мне справиться с этим?
1 ответ
В вашем проекте я заметил, что все ваши общие методы Visit в конечном итоге возвращают один и тот же постоянный результат, независимо от того, что остальные части этих методов делали до этого:
return default(R);
Для конкретных типов R, которые являются ссылочными типами, это возвращаемое значение "по умолчанию (R)" действительно всегда будет нулевым.
"НТН,