0

Я пишу 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(); 

Какое правило грамматики я должен добавить для этого? Я думал о добавлении функции вызова к «выражение» правила, но я не был уверен, что, если вызов функции следует рассматривать как выражение ..

Благодарности

+0

Я предлагаю вам постепенно выполнять свою грамматику по частям и проверять каждое правило. Например, для вас будет указано, что у вас есть оба идентификатора IDENT и IDENTIFIER. –

+0

@TheANTLRGuy Спасибо за ответ. Можете ли вы подробнее рассказать о разных между IDENT и IDENTIFIER ..? Почему я должен их разделять? – user2436815

+0

Ну, ты имеешь в виду две разные формы идентификатора? IDENTIFIER и IDENT? Наверняка нет. –

ответ

1

Эта грамматика выглядит хорошо для меня. Я предполагаю, что IDENT и IDENTIFIER одинаковы, и что у вас есть дополнительные производные для остальных терминалов.

Это произведение, как представляется, определяет вызов функции.

| IDENT '(' actualParameters ')' 

Вам нужна продукция для реальных параметров, что-то вроде этого.

actualParameters : nothing | expression (',' expression)* 
Смежные вопросы