我写一个简单的语法来识别一些表达式。 在这里,我发布了一个更简单的版本,我写的只是为了简化我的解释。这个更简单的版本可以识别如下表达式:
我的问题是当我总结一个表达式时: [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 : ~(' '|'['|']')*;
我该如何解决?
答案 0 :(得分:6)
word匹配空字符串,因为在
中word
: ESPACE* TEXT ESPACE*
;
TEXT匹配导致
的空字符串rawText
: word+
;
无限循环。
更改
TEXT : ~(' '|'['|']')*;
到
TEXT : ~(' '|'['|']')+;
考虑这个问题的方法是rawText可以在很多方面匹配空字符串
当您遇到语法错误([i]
)时会出现这种情况,因为它会尝试其中每个替代方案,以查看是否有任何错误解决了错误。
要摆脱任何二次行为,你应该真正使它完全明确。
rawText : ign (word (ign word)*)? ign;
ign : ESPACE*;
word : TEXT;
天真修复的问题是rawText可以通过多种方式匹配"foo"
:
TEXT("foo")
TEXT("fo"), ESPACE(""), TEXT("o")
TEXT("f"), ESPACE(""), TEXT("oo")
TEXT("f"), ESPACE(""), TEXT("o"), ESPACE(""), TEXT("o")
答案 1 :(得分:1)
为什么不这样做:
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]
进入以下解析树:
(点击图片放大)