'How the define parser rule for empty array in Antlr 4.0
I have the following set of rules in my Antlr grammar file:
//myidl.g4
grammar myidl;
integerLiteral:
value = DecimalLiteral # decimalNumberExpr
| value = HexadecimalLiteral # hexadecimalNumberExpr
;
DecimalLiteral: DIGIT+;
HexadecimalLiteral: ('0x' | '0X') HEXADECIMALDIGIT+;
fragment DIGIT: [0-9];
fragment HEXADECIMALDIGIT: [0-9a-fA-F];
array:
'[' ( integerLiteral ( ',' integerLiteral )* )* ']' // how to allow empty arrays like "[]"?
;
The resulting parser works fine for arrays with elements, for example "[0x00]".
But when defining an empty array "[]", i get the error:
no viable alternative at input '[]'
The funny thing is that when defining the empty array with a space, like "[ ]", the parser eats it without error. Can somebody tell me whats wrong with my rules, and how to adjust the rules to allow empty arrays definition without spaces, "[]"?
I use ANTLR Parser Generator Version 4.9.2
EDIT: It turns out that I was using an old version of the parser due to configuration issue. |=( The above rules work just fine.
Solution 1:[1]
You probably have defined a token in your lexer grammar that matches []:
SOME_RULE
: '[]'
;
remove that rule.
Solution 2:[2]
The grammar copied above works correctly in my opinion. must match [] and not [ ] (with space).
As already suggested check the tokens and if you have imported other lexer check that you don't have token like '[]'.
The following grammar:
grammar myidl;
integerLiteral: DecimalLiteral | HexadecimalLiteral;
DecimalLiteral: DIGIT+;
HexadecimalLiteral: ('0x' | '0X') HEXADECIMALDIGIT+;
fragment DIGIT: [0-9];
fragment HEXADECIMALDIGIT: [0-9a-fA-F];
array:
'[' ( integerLiteral ( ',' integerLiteral )* )* ']';
WS : [ \t] -> skip ;
match:
- [0x00]
- []
- [ ]
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 |
