2
我停留在ANTLR的一個非常基礎的層面。通過Parr博士的「最終ANTLR 4參考」。在4.2節,「建立一個計算器使用訪問者以下語法列出:ANTLR4書,計算器鍛鍊
grammar LabeledExpr; // rename to distinguish from Expr.g4
prog: stat+ ;
stat: expr NEWLINE # printExpr
| ID '=' expr NEWLINE # assign
| NEWLINE # blank
;
expr: expr op=('*'|'/') expr # MulDiv
| expr op=('+'|'-') expr # AddSub
| INT # int
| ID # id
| '(' expr ')' # parens
;
MUL : '*' ; // assigns token name to '*' used above in grammar
DIV : '/' ;
ADD : '+' ;
SUB : '-' ;
ID : [a-zA-Z]+ ; // match identifiers
INT : [0-9]+ ; // match integers
NEWLINE:'\r'? '\n' ; // return newlines to parser (is end-statement signal)
WS : [ \t]+ -> skip ; // toss out whitespace
我想clear
語句添加到上面,從書:
移動之前,你可能需要花一些時間嘗試通過添加clear
語句來擴展此表達式語言。該clear
命令應該清除掉memory
地圖,你會需要在規則stat
一個新的選擇承認它。用# clear
標記備選方案,然後在文法上運行ANTLR
以獲得增強的訪問者界面。
這是我的嘗試:
grammar LabeledExpr;
prog: stat+ ;
stat: expr NEWLINE # printExpr
| ID '=' expr NEWLINE # assign
| clear NEWLINE # clearMem
| NEWLINE # blank
;
expr: expr op=('*'|'/') expr # MulDiv
| expr op=('+'|'-') expr # AddSub
| INT # int
| ID # id
| '(' expr ')' # parens
;
clear: CLEAR
;
MUL: '*' ; // assigns token name to '*' used above in grammar
DIV: '/' ;
ADD: '+' ;
SUB: '-' ;
ID : [a-zA-Z]+ ;
INT : [0-9]+ ;
NEWLINE: '\r'?'\n' ;
WS : [ \t]+ -> skip ;
CLEAR: 'clear';
然而,visitClearMem
不會被調用:
@Override
public Integer visitClearMem(LabeledExprParser.ClearMemContext ctx) {
String text = ctx.getText();
if (text.equalsIgnoreCase("clear")) {
memory.clear();
}
return 0;
}
我知道這是超過3歲,但你可以發佈你是如何解決的呢? –