Я создаю грамматику ANTLR для программы калькулятора ниже.
1 program -> stmt_list $$
2 stmt_list -> stmt_list stmt | E
3 stmt -> ID := expr | READ ID | WRITE expr
4 expr -> term | expr add_op term
5 term -> factor | term mult_op factor
6 factor -> ( expr ) | ID | LITERAL
7 add_op -> + | -
8 mult_op -> * | /
Но я застрял при создании версии грамматики ANTLR. Я написал ниже -
grammar Calculator;
// Lexer specification
fragment LETTER
: 'a'..'z' | 'A'..'Z';
fragment DIGIT
: '0'..'9';
ID : LETTER (LETTER | DIGIT)*;
NUM : DIGIT+;
ADD : '+';
SUB : '-';
MUL : '*';
DIV : '/';
LPAR : '(';
RPAR : ')';
ASSIGN : '=';
NEWLINE : '\r'?'\n';
WS : (' ' | '\t' | '\n' | '\r')+ { skip(); };
// Parser specification
program : stmt_list NEWLINE* EOF;
stmt_list
: stmt
;
stmt : ID ASSIGN expr
| READ ID
| WRITE expr
;
expr : term (ADD term | SUB term)*
;
term : factor (MUL factor | DIV factor)*
;
factor : LPAR expr RPAR
| ID
| NUM
;
Я не уверен, каквыразить эту часть 'READ ID |НАПИСАТЬ expr '.Когда я пытаюсь скомпилировать, выдает следующее сообщение об ошибке -
предупреждение (105): Calculator.g: 29: 19: нет правила лексера, соответствующего токену: WRITE предупреждение (105): Calculator.g: 28: 19: нет правила лексера, соответствующего токену: READ
Я новичок в ANTLR. Пожалуйста, поделитесь своими мыслями.