[英]Antlr4 picks up wrong tokens and rules
我有一些伴隨而來的東西:
method_declaration : protection? expression identifier LEFT_PARENTHESES (method_argument (COMMA method_argument)*)? RIGHT_PARENTHESES method_block;
expression
: ...
| ...
| identifier
| kind
;
identifier : IDENTIFIER ;
kind : ... | ... | VOID_KIND; // void for example there are more
IDENTIFIER : (LETTER | '_') (LETTER | DIGIT | '_')*;
VOID_KIND : 'void';
fragment LETTER : [a-zA-Z];
fragment DIGIT : [0-9];
* method_declaration
的其他規則與這個問題無關
發生的事情是,當我輸入諸如void Start() { }
之類的內容並查看 ParseTree 時,它似乎認為void
是一個identifier
而不是一個kind
,並將其視為這樣。
我嘗試更改在.g4
文件中寫入kind
和identifier
的順序......但它似乎並沒有什么區別......為什么會發生這種情況,我該如何解決?
定義解析器規則的順序在 ANTLR 中沒有區別。 不過,令牌規則的定義順序確實如此。 具體來說,當多個標記規則匹配當前輸入並產生相同長度的標記時,ANTLR 將應用語法中第一個定義的那個。
因此,在您的情況下,您需要在IDENTIFIER
之前移動VOID_KIND
(以及您可能擁有的任何其他詞法分析器規則)。 除了使用詞法分析器規則而不是解析器規則之外,您已經嘗試過的幾乎都是如此。
PS:我有點驚訝 ANTLR 在這種情況下沒有發出關於VOID_KIND
無法匹配的警告。 我很確定其他詞法分析器生成器在這種情況下會產生這樣的警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.