Понимание правила GET-грамматики - PullRequest
0 голосов
/ 03 марта 2019

У меня есть 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;
...