// Define a grammar called Hello
grammar Hello;
r : element* ;
element
: number Whitespace
| string Whitespace
;
string
: '(' Charactor* ')'
;
Charactor
: [a-zA-Z] |'!' | '"'| '#' | '$' | '%' | '&' | '\'' | '\\(' | '\\)' | '*' | '+' | ',' | '-' | '.' | '/' | ':' | ';' | '<' | '=' | '>' | '?' | '@' | '[' | '\\' | ']' | '^' | '`' | '{' | '|' | '}' | '~' | '_'
;
number
: '-'? integer ('.' integer)?
;
integer
: digit+
;
digit
: D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9
;
Whitespace
: ' ' | '\n'
;
D1 : '1';
D2 : '2';
D3 : '3';
D4 : '4';
D5 : '5';
D6 : '6';
D7 : '7';
D8 : '8';
D9 : '9';
D0 : '0';
//WS : [ \t\r\n]+ -> skip ; skip spaces, tabs, newlines
I used the above .g4 grammar file to parse the following sequence of characters.
➜ Hello antlr4 Hello.g4 ➜ Hello javac Hello*.java ➜ Hello grun Hello r -tree 1.1 -1.2 333 -222 (((*&^%$#@!~
<>,?"'\|[[]]{}~) (r (element (number (integer (digit 1)) . (integer (digit 1))) ) (element (number - (integer (digit 1)) . (integer (digit 2))) ) (element (number (integer (digit 3) (digit 3) (digit 3))) ) (element (number - (integer (digit 2) (digit 2) (digit 2))) ) (element (string ( \( \( * & ^ % $ # @ ! ~< > , ? " ' \ | [ [ ] ] { } ~ )) ))
This case works well.
But when I input the string "1.1 -1.2 333 -222 (-.#$?)", it doesn't parse it correctly.
➜ Hello grun Hello r -tree 1.1 -1.2 333 -222 (-.#$?) line 1:19 mismatched input '-' expecting {')', Charactor} line 1:20 mismatched input '.' expecting {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'} line 1:21 mismatched input '#' expecting {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'} (r (element (number (integer (digit 1)) . (integer (digit 1))) ) (element (number - (integer (digit 1)) . (integer (digit 2))) ) (element (number (integer (digit 3) (digit 3) (digit 3))) ) (element (number - (integer (digit 2) (digit 2) (digit 2))) ) (element (string () ) (element (number - integer . (integer # $ ? ))) )) ➜ Hello
This special sequence of characters is an array that includes numbers or strings. The number can come with these ways like 1.1, -1.2, -222, 222 The string starts with '(', and ends with ')', if '(' or ')' appear in it, it could be escaped. It's noted that the string can include the character '-' or '.'. So when '-' or '.' appears in the numbers and strings at the same time, it seems Antlr cannot parse it correctly.
Does anyone know how to fix this issue? Thanks!