ANTLR v3 C # пространства имен - PullRequest
3 голосов
/ 25 ноября 2008

Надеюсь, это действительно быстро;) Я написал спецификацию лексера / парсера в ANTLR3 и нацеливаюсь на цель CSharp2. Сгенерированный код работает правильно, но я не могу заставить ANTLR поместить вывод C # в пространство имен.

Соответствующий раздел файла грамматики выглядит следующим образом:

grammar MyGrammar;

options
{
    language = CSharp2;
    output = AST;
    ASTLabelType = CommonTree;
}

Чтобы создать правильное пространство имен, я попытался:

@namespace { MyNamespace }

и

@lexer::namespace { MyNamespace }
@parser::namespace { MyNamespace }

, но оба они генерируют ошибки, утверждая, что файл не имеет правил.

Любая помощь приветствуется.

Ответы [ 3 ]

5 голосов
/ 25 ноября 2008

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

grammar Test;

options
{
    language=CSharp2;
}

@lexer::namespace {
    My.Name.Space
}

@parser::namespace {
    My.Name.Space
}


DIGIT   :   '0'..'9';

simple  :    DIGIT EOF;

Так что мне интересно, почему ваша версия не работает - может быть, вы хотите попробовать этот простой пример и посмотреть, работает ли он для вас.

4 голосов
/ 26 ноября 2008

Кажется, что директива @namespace должна быть помещена ПОСЛЕ блока токенов {}. Все хорошо сейчас ...

2 голосов
/ 18 сентября 2012

С language = 'CSharp3'; (и CSharp2 также) вы можете сделать:

@lexer::namespace {
    My.Name.Space
}

@parser::namespace {
    My.Name.Space
}

, который генерирует:

} // namespace 
 My.Name.Space <-- compile error here

в конце кода лексера и парсера. Если я напишу:

@lexer::namespace {My.Name.Space}

@parser::namespace {My.Name.Space}

работает нормально и генерирует:

} // namespace My.Name.Space <-- within the line comment, no error of course
...