我正在为下面的计算器程序创建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
;
我不确定如何表达“阅读ID |写expr'。当我尝试编译时,出现以下错误-
warning(105):Calculator.g:29:19:没有与标记对应的词法分析器规则:WRITE 警告(105):计算器。g:28:19:没有与令牌对应的词法分析器规则:READ
我是ANTLR的新手,请分享您的想法。
答案 0 :(得分:1)
READ
和WRITE
可能是关键字,因此您也必须在语法中对其进行定义(就像您对ID
所做的那样):
READ: 'READ';
WRITE: 'WRITE';
和
LITERAL: (LETTER | DIGIT)+;
作为LITERAL
规范的示例。