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:
create
numbertoken consisting of 1 or more digits.number : digit+ ;mark
digitfragment 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
Post a Comment