gpt4 book ai didi

评估不符合我的语法定义的字符串时,ANTLR 不会报告错误

转载 作者:行者123 更新时间:2023-12-01 11:38:24 24 4
gpt4 key购买 nike

这是我第一次在伦敦帝国理工学院的项目中使用 ANTLR,直到现在它一直非常有用。我已经定义了一个简单的递归语法如下

grammar Hello;      

execution: workflow;

workflow : Task
| workflow OPERATOR workflow
|'(' workflow OPERATOR workflow ')'
|'(' workflow OPERATOR workflow ')' (OPERATOR workflow)*
;


Task : 'T' ('0'..'9')+ | 'WF' ('0'..'9')+;

OPERATOR: 'AND' | 'OR' | 'XOR' |';' ;

WS : [ \t\n\r]+ -> channel(HIDDEN) ;

评估像这样的字符串:

T6 ; (T4 AND T7) ; T5 ; ( (WF23 OR WF2) OR (T3 AND WF4) AND T4) AND T5 OR T11

它工作得很好,当我尝试评估一个不正确的字符串时,我的问题就来了

T6 ; (T4 AND T7) ; T5 ; ( (WF23 OR WF2) OR (T3 AND WF4) AND T4) AND (T5;OR() T2) 

根据我在最后一个 AND 之后的规则,字符串“(T5;OR() T2)”无效,因为它不符合我的语法定义,但是在测试时我得到了字符串的树

   T6 ; (T4 AND T7) ; T5 ; ( (WF23 OR WF2) OR (T3 AND WF4) AND T4)

最后一部分“(T5;OR() T2)”是不正确的,将被忽略。

我的问题是我错过了什么,我应该怎么做才能得到并错误地说"(T5;OR() T2) "不符合我的语法定义,有人知道吗??

非常感谢

最佳答案

词法分析器愉快地标记了您格式错误的输入,并且您向解析器提供了解析(有效)执行 的指令。这就是它所做的。如果您想强制解析器使用整个标记流,请在语法入口点的末尾放置一个 EOF:

execution: workflow EOF;

如果您现在解析您的输入:

String source = "T6 ; (T4 AND T7) ; T5 ; ( (WF23 OR WF2) OR (T3 AND WF4) AND T4) AND (T5;OR() T2)";
HelloLexer lexer = new HelloLexer(new ANTLRInputStream(source));
HelloParser parser = new HelloParser(new CommonTokenStream(lexer));
parser.execution();

您将获得以下输出:

line 1:72 no viable alternative at input '(T4 AND T7) ; T5 ; ( (WF23 OR WF2) OR (T3 AND WF4) AND T4) AND (T5;OR'line 1:15 extraneous input ')' expecting {, OPERATOR}...

关于评估不符合我的语法定义的字符串时,ANTLR 不会报告错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24919008/

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