antlr4 - Struggling to parse array notation -


i have simple grammar parse statements.

here examples of type of statements need parsed:

a.b.c   a.b.c == "88"  

the issue having array notation not matching. example, things not working:

a.b[0].c  a[3][4]  

i hope can point out doing wrong here. (i testing in antlrworks)

here grammar (generationunit entry point):

grammar ratbinding;  generationunit: teststatement | statement;  arrayaccesor : identifier arraynotation+; arraynotation:  '[' number ']';  teststatement:      (statement | string | number | bool )       (greaterthanandequal          | lessthanorequal           | greaterthan         | lessthan | notequals | equals)      (statement | string | number | bool )  ;  part: identifier | arrayaccesor;   statement:  part  ('.' part )*;  string: ('"' identifier '"') | ('\'' identifier '\'');  greaterthanandequal: '>='; lessthanorequal: '<='; greaterthan: '>'; lessthan: '<'; notequals : '!='; equals: '=='; identifier:   letter (letter|digit)*;   bool : 'true' | 'false';  arrayleft: '\u005b'; arrayright: '\u005d';  letter     :  '\u0024' |        '\u0041'..'\u005a' |        '\u005f '|        '\u0061'..'\u007a' |        '\u00c0'..'\u00d6' |        '\u00d8'..'\u00f6' |        '\u00f8'..'\u00ff' |        '\u0100'..'\u1fff' |        '\u3040'..'\u318f' |        '\u3300'..'\u337f' |        '\u3400'..'\u3d2d' |        '\u4e00'..'\u9fff' |        '\uf900'..'\ufaff'       ;  digit     :  '\u0030'..'\u0039' |        '\u0660'..'\u0669' |        '\u06f0'..'\u06f9' |        '\u0966'..'\u096f' |        '\u09e6'..'\u09ef' |        '\u0a66'..'\u0a6f' |        '\u0ae6'..'\u0aef' |        '\u0b66'..'\u0b6f' |        '\u0be7'..'\u0bef' |        '\u0c66'..'\u0c6f' |        '\u0ce6'..'\u0cef' |        '\u0d66'..'\u0d6f' |        '\u0e50'..'\u0e59' |        '\u0ed0'..'\u0ed9' |        '\u1040'..'\u1049'    ;  ws  :   [ \r\t\u000c\n]+ -> channel(hidden)  ; 

you referenced non-existent rule number in arraynotation parser rule.

a digit rule exist in lexer, match single-digit number. example, 1 digit, 10 2 separate digit tokens a[10] won't match arrayaccesor rule. want resolve in 2 parts:

  1. create number token consisting of 1 or more digits.

    number   : digit+   ; 
  2. mark digit fragment rule indicate doesn't form tokens on own, merely intended referenced other lexer rules.

    fragment // prevents digit token being created on own digit   : ... 

you not need change arraynotation because references number rule created here.


Comments