2016-03-26 2 views
0

Я внедряю AST (абстрактное синтаксическое дерево) в C# для сложной грамматики, однако, чтобы этот вопрос был прост, я буду использовать очень простую грамматику.Parser in C# и печать AST

Рассмотрим грамматику:

rules Expr ::= Term "+" Term 
     | Term ; 

rules Term ::= Ident 
     | Integer ; 

я использовал bnfc и генерироваться парсер/лексера и попал в точку, что я могу разобрать фрагмент кода и может напечатать дерево синтаксического разбора. Теперь я хочу сопоставить его с AST и напечатать абстрактное дерево синтаксиса. here - это то, что я сделал до сих пор в примерном проекте.

Однако в настоящее время, когда я тестирую программу, мой АСТ возвращается как 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 is null. Может ли кто-нибудь с опытом работы в C# помочь мне справиться с этим?

ответ

1

В своем проекте я заметил, что все ваши общие методы посещения в конечном итоге не возвращаясь в тот же постоянный результат независимо от того, что остальная часть тела этих методов сделал до этого:

return default(R); 

Для конкретных типов R, которые являются ссылочными типами, это возвращаемое значение «default (R)» всегда будет всегда нулевым.

HTH,

+0

Спасибо @YSharp ... пожалуйста, помогите мне понять. Что бы я тогда вернулся? – 2D3D4D