У меня есть antlr v4-грамматика, и я пытаюсь понять GET-правило этой грамматики, но я не понимаю, где я ошибаюсь. Я думаю, что я должен использовать JSON вместо MAP, но когда я использую JSON, программабросает слишком много исключений.
Не могли бы вы мне помочь?
Вот программа, которую я сгенерировал.
PROGRAM aa{
MAP m;
m = '{"aaaa":"17"}' ;
PRINT GET (m , "aaaa") ;
}
Вот грамматика для языка выше.
grammar program;
prule: PROGRAM VARIABLE block;
WS: [ \t\r\n]+ -> skip;
NUMBER: '-'? '0'..'9'+([.,]'0'..'9'+)?;
TEXT: '"' .* '"';
JSON: '\'' .* '\'';
OPEN_BLOCK: '{';
CLOSE_BLOCK: '}';
ASSIGNMENT: '=';
MAPDECL: 'MAP';
DOUBLEDECL: 'DOUBLE';
TEXTDECL: 'TEXT';
BOOLDECL: 'BOOLEAN';
PRINT: 'PRINT';
OPEN_BRACKET: '(';
CLOSE_BRACKET: ')';
COMMA: ',';
PROGRAM: 'PROGRAM';
SMALLER: '<';
GREATER: '>';
TRUE: 'TRUE';
FALSE: 'FALSE';
GET: 'GET';
SEMICOLON: ';';
VARIABLE: ('a'..'z'|'A'..'Z')+;
block: OPEN_BLOCK statement+ CLOSE_BLOCK;
statement: (assignment |
mapdecl |
booldecl |
doubledecl |
textdecl |
print
) SEMICOLON;
mapdecl: MAPDECL VARIABLE;
booldecl: BOOLDECL VARIABLE;
doubledecl: DOUBLEDECL VARIABLE;
textdecl: TEXTDECL VARIABLE;
print: PRINT (expression | logexpression);
assignment: VARIABLE ASSIGNMENT (expression | logexpression);
expression: factor ((OPERATOR_ADD|OPERATOR_SUB) expression)?;
factor: (NUMBER |
TEXT |
TRUE |
FALSE |
JSON |
get |
VARIABLE (OPEN_BRACKET (expression (COMMA expression)*)? CLOSE_BRACKET)? |
OPEN_BRACKET op=expression CLOSE_BRACKET)
((OPERATOR_MULT | OPERATOR_DIV) factor)?;
get: GET OPEN_BRACKET expression COMMA TEXT CLOSE_BRACKET;