I wrote rule in Expr.g4 Like this.
grammar Expr;
// parser rules
prog : ((decl)* expr?';' ?NEWLINE)*;
decl : 'def' func=FUNC_NAME (param=ID)* '=' e=expr 'endef';
expr : '~(' expr ')' # negateExpr
| '(' expr ')' # parensExpr
| left=expr op=('*'|'/') right=expr # infixExpr
| left=expr op=('+'|'-') right=expr # infixExpr
| 'let' var=ID '=' e1=expr 'in' e2=expr # letinExpr
| func=FUNC_NAME '(' (expr ','?)* ')' # callExpr
| value=num # numberExpr
| ID # varExpr
;
num : '-'? INT #INT
| '-'? REAL #REAL
;
OP_ADD: '+';
OP_SUB: '-';
OP_MUL: '*';
OP_DIV: '/';
OP_ASSIGN: '=';
// lexer rules
NEWLINE: [\r\n]+ ;
INT: [0-9]+ ; // should handle negatives
REAL: [0-9]+'.'[0-9]* ; // should handle signs(+/-)
ID: '_'?[a-zA-Z]+'_'?[a-zA-Z]* ;
FUNC_NAME: [a-zA-Z][a-zA-Z0-9]* ;
WS: [ \t\r\n]+ -> skip ;
But the result was not I wanted.
I thought ID was preceding rule of FUNC_NAME so, I changed the order.
// lexer rules
NEWLINE: [\r\n]+ ;
INT: [0-9]+ ; // should handle negatives
REAL: [0-9]+'.'[0-9]* ; // should handle signs(+/-)
FUNC_NAME: [a-zA-Z][a-zA-Z0-9]* ;
ID: '_'?[a-zA-Z]+'_'?[a-zA-Z]* ;
WS: [ \t\r\n]+ -> skip ;
Like above. However, it wasn't worked that I looked for.
How can I resolve this problem?
Desirable output that I want is like below screenshot :
(The screenshot is edited using MS Paint)