3

这是我第一次在伦敦帝国理工学院与 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)”不符合我的语法定义,有人知道吗?

非常感谢

4

1 回答 1

5

词法分析器很高兴地标记了您的格式错误的输入,并且您向解析器提供了解析 (valid) 的指令execution。这就是它所做的。如果要强制解析器使用整个令牌流,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();

您将获得以下输出:

第 1:72 行在输入 '(T4 AND T7) 处没有可行的替代方案;T5 ; ( (WF23 OR WF2) OR (T3 AND WF4) AND T4) AND (T5;OR'
第 1:15 行无关输入 ')' 期待 {, OPERATOR}
...
于 2014-07-23T19:35:38.820 回答