gpt4 book ai didi

error-handling - 如何强制 ANTLR 生成 NoViableAltException?

转载 作者:行者123 更新时间:2023-12-04 21:26:42 27 4
gpt4 key购买 nike

我正在使用 antlr 3.2。我有一个简单的语法,它由原子(它们是字符“0”或“1”)组成,以及一个将它们的逗号分隔列表累积到列表中的规则。

当我传入“00”作为输入时,我没有收到错误消息,这让我感到惊讶,因为这不应该是有效的输入:

C:\Users\dan\workspace\antlrtest\test>java -cp antlr-3.2.jar org.antlr.Tool Test.g
C:\Users\dan\workspace\antlrtest\test>javac -cp antlr-3.2.jar *.java
C:\Users\dan\workspace\antlrtest\test>java -cp .;antlr-3.2.jar TestParser
[0]

在这种情况下如何强制生成错误?这特别令人费解,因为当我在 ANTLRWorks 中对此输入使用解释器时,它确实显示了 NoViableAltException。

我发现如果我将语法更改为需要,例如,最后一个分号,则会生成一个错误,但在我正在研究的实际语法中,我无法使用该解决方案。

这是自包含且可运行的语法:
grammar Test;

@parser::members {
public static void main(String[] args) throws Exception {
String text = "00";
ANTLRStringStream in = new ANTLRStringStream(text);
TestLexer lexer = new TestLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
System.out.println(new TestParser(tokens).mainRule());
}
}

mainRule returns [List<String> words]
@init{$words = new ArrayList<String>();}
: w=atom {$words.add($w.text);} (',' w=atom {$words.add($w.text);} )*
;


atom: '0' | '1';

WS
: ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; }
;

最佳答案

在你的 mainRule 之后,你应该添加一个 EOF token ,否则 ANTLR 将在没有要匹配的有效 token 时停止解析。

另外,atom rule 应该是一个词法规则而不是解析器规则(词法规则以大写开头)。

试试这个:

grammar Test;

@parser::members {
public static void main(String[] args) throws Exception {
String text = "0,1 , 1 , 0,1";
ANTLRStringStream in = new ANTLRStringStream(text);
TestLexer lexer = new TestLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
System.out.println(new TestParser(tokens).mainRule());
}
}

mainRule returns [List<String> words]
@init{$words = new ArrayList<String>();}
: w=Atom {$words.add($w.text);} (',' w=Atom {$words.add($w.text);} )* EOF
;

Atom
: '0' | '1'
;

WS
: ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; }
;

编辑

澄清:正如您已经发现的那样, EOF不是强制性的。它只会导致解析器遍历整个输入。 A NoViableAltException仅当词法分析器偶然发现您的词法分析器语法未处理的标记/字符时才会抛出。由于您在语法中定义了三个标记( 01, )和您的输入 "00" , 不包含您的语法未处理的任何字符,没有 NoViableAltException被抛出。如果您将输入更改为类似 "0?0" 的内容,然后是 NoViableAltException会弹出。

由于您的解析器找到第一个 0然后没找到 , ,它只是停止解析,因为您没有“告诉”它一直解析到文件末尾。

希望能澄清事情。如果没有,请告诉我。

关于error-handling - 如何强制 ANTLR 生成 NoViableAltException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2278570/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com