我正在使用 ANTLR4 來 lex 和決議一個字串。字串是這樣的:
alpha at 3
語法是這樣的:
access: IDENTIFIER 'at' INT;
IDENTIFIER: [A-Za-z] ;
INT: '-'? ([1-9][0-9]* | [0-9]);
但是,這個 ANTLR 給了我line 1:6 mismatched input 'at' expecting 'at'. 我發現這是因為IDENTIFIER是 的超集'at',如
第二:
access: identifier AT INT;
identifier: NAME | ~AT;
NAME: [A-Za-z] ;
INT: '-'? ([1-9][0-9]* | [0-9]);
AT: 'at';
確實產生了錯誤。這是因為NAME和 AT都匹配文本"at"。并且因為NAME是在之前定義的AT,所以NAME會創建一個令牌。
始終小心這種重疊的標記:將關鍵字始終放在NAME或識別符號標記上方:
access: IDENTIFIER AT INT;
AT: 'at';
IDENTIFIER: [A-Za-z] ;
INT: '-'? ([1-9][0-9]* | [0-9]);
請注意,當規則匹配相同數量的字符時,ANTLR 只會查看首先定義的規則。因此,對于像這樣的輸入"atat",IDENTIFIER將創建一個(不是2 個AT令牌!)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/364370.html
