簡體   English   中英

Antlr4 拾取錯誤的令牌和規則

[英]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文件中寫入kindidentifier的順序......但它似乎並沒有什么區別......為什么會發生這種情況,我該如何解決?

定義解析器規則的順序在 ANTLR 中沒有區別。 不過,令牌規則的定義順序確實如此。 具體來說,當多個標記規則匹配當前輸入並產生相同長度的標記時,ANTLR 將應用語法中第一個定義的那個。

因此,在您的情況下,您需要在IDENTIFIER之前移動VOID_KIND (以及您可能擁有的任何其他詞法分析器規則)。 除了使用詞法分析器規則而不是解析器規則之外,您已經嘗試過的幾乎都是如此。

PS:我有點驚訝 ANTLR 在這種情況下沒有發出關於VOID_KIND無法匹配的警告。 我很確定其他詞法分析器生成器在這種情況下會產生這樣的警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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