簡體   English   中英

ANTLR語法中的無限遞歸

[英]Infinite recursion in ANTLR grammar

我寫了一個簡單的語法來識別一些表達。 在這里,我發布了一個更簡單的版本,我寫的只是為了簡化我的解釋。 這個更簡單的版本可以識別如下表達式:

  1. 這是一篇文章
  2. [n]這是另一個文本[/ n]
  3. [n] [n]這是一個復合表達式[/ n] [/ n]

我的問題是當我總結一個表達式時:[i]這應該只生成一個識別異常[/ n]

拋出一個識別異常,但是解析器進入infinte遞歸,因為它匹配'[',但是當它與'i'匹配時,它就會丟失。 我認為這種情況正在發生,因為我的語法文本組件不能包含方括號。 所以,我發布了語法。

grammar ErrorTest;

expression
    :    rawText EOF
    |    command EOF
    ;

rawText
    :    word+
    ;

word
    :    ESPACE* TEXT ESPACE*
    ;

command 
    :    simpleCommand
    |    compoundCommand
    ;

simpleCommand
    :    HELP
    ;

compoundCommand
    :    rawText
    |    BEGIN compoundCommand END
    ;

HELP   : '[help]';

BEGIN  : '[n]';
END    : '[/n]';

ESPACE : ' ';
TEXT   : ~(' '|'['|']')*;

我該如何解決?

word匹配空字符串,因為在

word
    :    ESPACE* TEXT ESPACE*
    ;

TEXT匹配導致的空字符串

rawText
    :    word+
    ;

無限循環。

更改

TEXT   : ~(' '|'['|']')*;

TEXT   : ~(' '|'['|']')+;

這將使你的語法有限模糊。

考慮這個問題的方法是rawText可以在很多方面匹配空字符串

  1. 零TEXT令牌
  2. 一個長度為0的TEXT令牌。
  3. 兩個長度為0的TEXT令牌。
  4. 三個TEXT標記,長度為0。
  5. ...

當您遇到語法錯誤( [i] )時會出現這種情況,因為它會嘗試這些替代方案中的每一個以查看是否有任何錯誤解決了錯誤。


要擺脫任何二次行為,你應該真正使它完全明確。

rawText : ign (word (ign word)*)? ign;
ign     : ESPACE*;
word    : TEXT;

天真修復的問題是rawText可以通過以下幾種方式匹配"foo"

  1. TEXT("foo")
  2. TEXT("fo"), ESPACE(""), TEXT("o")
  3. TEXT("f"), ESPACE(""), TEXT("oo")
  4. TEXT("f"), ESPACE(""), TEXT("o"), ESPACE(""), TEXT("o")

為什么不這樣做:

grammar Test;

expression
 : atom+ EOF
 ;

atom
 : TEXT
 | ESPACE
 | command
 ;

command 
 : simpleCommand
 | compoundCommand
 ;

simpleCommand
 : HELP
 ;

compoundCommand
 : BEGIN atom+ END
 ;

HELP   : '[help]';
BEGIN  : '[n]';
END    : '[/n]';
ESPACE : ' ';
TEXT   : ~(' '|'['|']')+;

哪個會輸入像

this is [n][n]a [help][n]compound[/n] expression[/n][/n]

進入以下解析樹:

在此輸入圖像描述

(點擊圖片放大)

暫無
暫無

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

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