[英]ANTLR4 Token recognition at whitespace
我是使用 ANTLR 解析器的新手。
這是我的語法:
grammar Commands;
file_ : expression EOF;
expression : Command WhiteSpace Shape ;
WhiteSpace : [\t]+ -> skip;
NewLine : ('\r'?'\n'|'\r') -> skip;
Shape : ('square'|'triangle'|'circle'|'hexagon'|'line');
Command : ('fill'|'draw'|'delete');
我正在嘗試解析句子列表,例如:
draw circle;
draw triangle;
delete circle;
我越來越
token recognition error at:' '
誰能告訴我有什么問題? PS:我在 java 15 工作
file_ : expressions EOF;
expressions
: expressions expression
| expression
;
expression : Command WhiteSpace Shape NewLine ;
WhiteSpace : [\t]+ -> skip;
NewLine : ('\r'?'\n'|'\r') -> skip;
Shape : ('square'|'triangle'|'circle'|'hexagon'|'line');
Command : ('fill'|'draw'|'delete');
添加了對多個表達式的支持。 我遇到了同樣的錯誤。
grammar Commands;
file_ : expressions EOF;
expressions
: expressions expression
| expression
;
expression : Command Shape;
WhiteSpace : [\t]+ -> skip;
NewLine : ('\r'?'\n'|'\r') -> skip;
Shape : ('square'|'triangle'|'circle'|'hexagon'|'line');
Command : ('fill'|'draw'|'delete');
即使我不包括 WhiteSpace,我也會收到相同的令牌識別錯誤。
好的,錯誤:
line 3:6 token recognition error at: ' '
line 3:13 token recognition error at: ';'
表示詞法分析器遇到了空白字符(或分號),但沒有匹配任何這些字符的詞法分析器規則。 您必須將它們包含在您的語法中。 假設您像這樣添加它們(注意:仍然不正確:):
Semi : ';';
WhiteSpace : [ \t]+ -> skip;
嘗試使用上述規則時,您會收到錯誤消息:
line 1:5 missing WhiteSpace at 'circle'
這意味着解析器無法匹配規則expression: Command WhiteSpace Shape;
到輸入draw circle;
. 這是因為在詞法分析器中,您將skip
ping 所有空白字符。 這意味着這些標記在解析器規則中不可用。 從解析器中刪除它們。
您還會看到錯誤:
line 1:11 mismatched input ';' expecting <EOF>
這意味着輸入包含一個Semi
標記,而解析器沒有預料到這一點。 在expression
規則中包含Semi
標記:
grammar Commands;
file_ : expression EOF;
expression : Command Shape Semi;
Semi : ';';
WhiteSpace : [ \t]+ -> skip;
NewLine : ('\r'?'\n'|'\r') -> skip;
Shape : ('square'|'triangle'|'circle'|'hexagon'|'line');
Command : ('fill'|'draw'|'delete');
上面的語法適用於單個表達式。 如果你想匹配多個表達式,你可以這樣做:
expressions
: expressions expression
| expression
;
但鑒於 ANTLR 生成LL 解析器(不是 ANTLR 名稱所暗示的 LR) ,這樣做更容易(並使解析樹更容易在以后遍歷):
expressions
: expression+
;
如果您要跳過所有空白字符,您不妨刪除NewLine
規則並執行以下操作:
WhiteSpace : [ \t\r\n]+ -> skip;
還有一件事,詞法分析器現在創建了具有相同類型的Shape
和Command
標記。 我會做這樣的事情:
shape : Square | Triangle | ...;
Square : 'square';
Triangle : 'triangle';
...
當您想要評估輸入時(如果這是您要做的),這將使您在遍歷解析樹時更輕松。
我想 go 是這樣的:
grammar Commands;
file_ : expressions EOF;
expressions : expression+;
expression : command shape Semi;
shape : Square | Traingle | Circle | Hexagon | Line;
command : Fill | Draw | Delete;
Semi : ';';
WhiteSpace : [ \t\r\n]+ -> skip;
Square : 'square';
Traingle : 'triangle';
Circle : 'circle';
Hexagon : 'hexagon';
Line : 'line';
Fill : 'fill';
Draw : 'draw';
Delete : 'delete';
您的空白標記規則WhiteSpace
僅允許制表符。 給它加一個空格。
WhiteSpace : [ \t]+ -> skip;
(通常,空格規則不止於此,但它應該可以解決您的直接問題。
你也沒有考慮到';' 在您的輸入中。 要么將其添加到規則中,要么暫時從測試輸入中刪除。
expression : Command Shape ';' ;
這可以解決它,但似乎它可能不是你真正需要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.