簡體   English   中英

ANTLR4 空白處的令牌識別

[英]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;

還有一件事,詞法分析器現在創建了具有相同類型的ShapeCommand標記。 我會做這樣的事情:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM