Я работаю с Bison над созданием AST для компилятора, который я пишу. Как лучше всего создавать узлы в AST? Мой вопрос может быть более ясным с примером.
Учитывая следующий фрагмент:
field
: modifier type TOK_IDENT TOK_SEMICOLON
{
// I want to return a pointer to a node of type Field
// i.e. $$ = new Field(name, isVisible, isStatic, type);
}
;
modifier
: visibility_opt static_opt
{
// Should I make the new Field here and pass it up?
// Or a new type that contains both vis and static options?
}
;
visibility_opt
: /* default */ { $$ = true; }
| TOK_PUBLIC { $$ = true; }
| TOK_PRIVATE { $$ = false; }
;
static_opt
: /* default */ { $$ = false; }
| TOK_STATIC { $$ = true; }
;
В приведенном выше примере я хочу, чтобы правило поля возвращало узел поля, но мне нужны некоторые атрибуты правила модификатора, которые будут переданы во время синтаксического анализа (т. е. это синтезированные атрибуты). ).
Я могу придумать два способа сделать это без изменения грамматики.
Как лучше поступить в подобных ситуациях?