antlr грамматика несколько альтернатив - PullRequest
2 голосов
/ 22 апреля 2010

У меня есть эта простая грамматика для синтаксиса, подобного C #. Я не могу придумать способ разделить поля и методы. Все примеры, которые я видел для разбора C #, объединяют поля и методы в одном правиле. Я хотел бы разделить их, так как мой синтаксис довольно прост.

grammar test;

options
{
    language =CSharp2;
    k = 3;
    output = AST;
}

SEMI : ';' ;
LCURLY : '{' ;
RCURLY : '}' ;
LPAREN : '(' ;
RPAREN : ')' ;
DOT :'.';

IDENTIFIER  
    :   ( 'a'..'z' | 'A'..'Z' | '_' )
        ( 'a'..'z' | 'A'..'Z' | '_' | '0'..'9' )*
    ;

 namespaceName 
    : IDENTIFIER (DOT IDENTIFIER)*
    ;

 classDecl
    : 'class' IDENTIFIER LCURLY (fieldDecl | methodDecl)* RCURLY
    ;

 fieldDecl
    : namespaceName IDENTIFIER SEMI;
 methodDecl
    : namespaceName IDENTIFIER LPAREN RPAREN SEMI;

Я всегда заканчиваю этим предупреждением

Decision can match input such as "IDENTIFIER DOT IDENTIFIER" using multiple alternatives: 1, 2

1 Ответ

0 голосов
/ 22 апреля 2010

Поскольку namespaceName может быть IDENTIFIER DOT IDENTIFIER DOT IDENTIFIER ... Я думаю, что у вас есть проблемы с k = 3 в ваших опциях.

Если вы можете удалить опцию K, ANTLR по умолчанию будет K = *.

...