Я пишу ANTLR lexer/parser для контекстной свободной грамматики.Context-Free-Grammar для операторов присваивания в ANTLR
Это то, что я сейчас:
statement
: assignment_statement
;
assignment_statement
: IDENTIFIER '=' expression ';'
;
term
: IDENT
| '(' expression ')'
| INTEGER
| STRING_LITERAL
| CHAR_LITERAL
| IDENT '(' actualParameters ')'
;
negation
: 'not'* term
;
unary
: ('+' | '-')* negation
;
mult
: unary (('*' | '/' | 'mod') unary)*
;
add
: mult (('+' | '-') mult)*
;
relation
: add (('=' | '/=' | '<' | '<=' | '>=' | '>') add)*
;
expression
: relation (('and' | 'or') relation)*
;
IDENTIFIER : LETTER (LETTER | DIGIT)*;
fragment DIGIT : '0'..'9';
fragment LETTER : ('a'..'z' | 'A'..'Z');
Так что мой оператор присваивания определяется формой
IDENTIFIER = expression;
Однако оператор присваивания следует также принимать во внимание случаи, когда правая рука вызов функции (возвращаемое значение оператора). Например,
items = getItems();
Какое правило грамматики я должен добавить для этого? Я думал о добавлении функции вызова к «выражение» правила, но я не был уверен, что, если вызов функции следует рассматривать как выражение ..
Благодарности
Я предлагаю вам постепенно выполнять свою грамматику по частям и проверять каждое правило. Например, для вас будет указано, что у вас есть оба идентификатора IDENT и IDENTIFIER. –
@TheANTLRGuy Спасибо за ответ. Можете ли вы подробнее рассказать о разных между IDENT и IDENTIFIER ..? Почему я должен их разделять? – user2436815
Ну, ты имеешь в виду две разные формы идентификатора? IDENTIFIER и IDENT? Наверняка нет. –