У меня есть эта простая грамматика для синтаксиса, подобного 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