Создание AST с помощью Bison

Я работаю с 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; }
  ;

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

Я могу придумать два способа сделать это без изменения грамматики.

  1. Сделайте нетерминальный модификатор типа Поле, создайте здесь новое Поле, заполните все, что я могу, и передайте его в поле, чтобы заполнить остальное.
  2. Пусть модификатор имеет свой собственный тип, который содержит два логических значения, и передает его вверх, извлекая данные при создании нового поля в правиле поля.

Как лучше поступить в подобных ситуациях?

5
задан mcorley 24 March 2012 в 17:14
поделиться