[英]ANTLR doesn't match correct parser rule
我正在嘗試為舊 ELIZA 聊天機器人程序的 DOCTOR 腳本創建一個解析器。
DOCTOR 腳本在此處簡化為一個簡單的歡迎行,后跟一行定義“The Doctor”如何響應用戶輸入“如果我更瘦的話”:
(I AM THE DOCTOR.)
(IF 3 ((0 IF 0)(DO YOU 3)(YOU WISH THAT 3)))
這是詞法分析器:
ALL_CHARS: [0-9A-Z, .];
KEY_CHARS: [A-Z];
LPAREN: '(';
RPAREN: ')';
NUM: [0-9];
SPACE: ' ';
WS: ('\n')+ -> skip;
和解析器:
main: item* EOF;
item: (rWelcome | rKeyDecompReAssy );
rKeyDecompReAssy: LPAREN rKeyPri rDecompReAssy RPAREN;
rKeyPri: rKey SPACE rPri;
rKey: KEY_CHARS+;
rPri: NUM+;
rDecompReAssy: LPAREN rDecomp rReAssyList RPAREN;
rDecomp: LPAREN ALL_CHARS+ RPAREN;
rReAssyList: (rReAssy)+;
rReAssy: LPAREN reAssy RPAREN;
reAssy: ALL_CHARS+;
rWelcome: LPAREN reAssy RPAREN;
它為歡迎行 ( rWelcome ) 和IF行 ( rDecompReAssy ) 定義了一個規則,它試圖匹配 4 個組件:Key、Pri、Decomp 和 ReAssyList。
我使用 Android Studio 的 ANTLR Preview。
問題是這兩行都與 rWelcome 匹配。
歡迎行當然沒問題,但第二行的錯誤消息是:
line 2:6 missing ')' at '('
line 2:45 mismatched input ')' expecting {<EOF>, '('}
如何使這兩個規則明確無誤?
如評論中所述,您的詞法分析器從不創建KEY_CHARS
-、 SPACE
- 和NUM
-令牌。 這是因為ALL_CHARS
標記也匹配那些標記中定義的字符。 當 2 個或多個詞法分析器規則匹配相同的字符時,第一個定義的規則“獲勝”。 無論解析器規則是否試圖匹配KEY_CHARS
令牌,詞法分析器都只是創建一個ALL_CHARS
令牌:詞法分析器獨立於解析器工作。
你可以做的是這樣的:
main : item* EOF;
item : (rWelcome | rKeyDecompReAssy );
rKeyDecompReAssy : LPAREN rKeyPri rDecompReAssy RPAREN;
rKeyPri : rKey SPACE rPri SPACE; // Note: I added the last `SPACE`
rKey : KEY_CHARS+;
rPri : NUM+;
rDecompReAssy : LPAREN rDecomp rReAssyList RPAREN;
rDecomp : LPAREN all_chars+ RPAREN;
rReAssyList : (rReAssy)+;
rReAssy : LPAREN reAssy RPAREN;
reAssy : all_chars+;
rWelcome : LPAREN reAssy RPAREN;
all_chars : NUM | KEY_CHARS | SPACE | OTHER_CHAR;
KEY_CHARS : [A-Z];
LPAREN : '(';
RPAREN : ')';
NUM : [0-9];
SPACE : ' ';
WS : ('\n')+ -> skip;
OTHER_CHAR : [.,];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.