user2436815
user2436815

Reputation: 3895

Context-Free-Grammar for assignment statements in ANTLR

I'm writing an ANTLR lexer/parser for context free grammar.

This is what I have now:

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');

So my assignment statement is identified by the form

IDENTIFIER = expression;

However, assignment statement should also take into account cases when the right hand side is a function call (the return value of the statement). For example,

items = getItems();

What grammar rule should I add for this? I thought of adding a function call to the "expression" rule, but I wasn't sure if function call should be regarded as expression..

Thanks

Upvotes: 0

Views: 1251

Answers (1)

david.pfx
david.pfx

Reputation: 10868

This grammar looks fine to me. I am assuming that IDENT and IDENTIFIER are the same and that you have additional productions for the remaining terminals.

This production seems to define a function call.

|   IDENT '(' actualParameters ')'

You need a production for the actual parameters, something like this.

actualParameters : nothing | expression ( ',' expression )*

Upvotes: 1

Related Questions