Как добавить атрибут в синтаксический анализатор сгенерированный ANTLR? - PullRequest
1 голос
/ 24 октября 2011

Я использую синтаксический анализатор, сгенерированный ANTLR, в моей программе на C ++, и я хочу использовать свой вспомогательный класс в синтаксическом анализаторе, чтобы написать что-то вроде следующего:

constant_declaration 
:   'const' type_specifier ID ('[' constant_expression ']')? '=' initializer
    {
        parserHelper->addConstant($type_specifier.text, $ID.text);
    }
;

Где parserHelper - мой вспомогательный объект C ++.Но я застрял с передачей этого помощника парсеру Си.В объектно-ориентированных языках проще всего использовать базовый класс синтаксического анализатора.Это невозможно в C. Единственное решение, к которому я пришел сейчас, - это определить глобальную переменную в секции @members и инициализировать ее перед синтаксическим анализом:

@members
{
    ParserHelper* parserHelper;
}

По некоторым причинам это неудобно для меня.Разве нет способа поместить эту переменную в структуру синтаксического анализатора C, созданную ANTLR?

1 Ответ

2 голосов
/ 02 декабря 2011

Одним из возможных решений является использование именованных областей ANTLR вместо глобального раздела-члена.

Следующая реализация должна соответствовать тому, что вы ищете:

scope GlobalScope
{
    ParserHelper* parserHelper;
}

rootRule
scope GlobalScope
@init {
  // Initialize the scope attributes
  // Somehow retrieve or create a PointerHelper (you can eventually pass it by an argument of the rootRule)
  $GlobalScope::parserHelper = ...;
}
:
...
;

constant_declaration 
:   'const' type_specifier ID ('[' constant_expression ']')? '=' initializer
    {
        $GlobalScope::parserHelper->addConstant($type_specifier.text, $ID.text);
    }
;
...