簡體   English   中英

ANTLR 不匹配正確的解析器規則

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

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