防止;Antlr4.Runtime.NoViableAltException“;与Antlr

防止;Antlr4.Runtime.NoViableAltException“;与Antlr,antlr,antlr4,Antlr,Antlr4,我使用的是Antlr4(C#实现),每当要解析的字符串很复杂时,就会出现以下异常 A first chance exception of type 'Antlr4.Runtime.NoViableAltException' occurred in DataImportClassLibrary.dll 这一个有效: [Pitch Angle] > 5 这一个会产生错误: [Pitch Angle] > 5 AND [Pressure Altitude] < 10000 【俯

我使用的是Antlr4(C#实现),每当要解析的字符串很复杂时,就会出现以下异常

A first chance exception of type 'Antlr4.Runtime.NoViableAltException' occurred in DataImportClassLibrary.dll
这一个有效:

[Pitch Angle] > 5
这一个会产生错误:

[Pitch Angle] > 5 AND [Pressure Altitude] < 10000
【俯仰角】>5和【压力高度】<10000
语法:

grammar EventDetection;

AND : 'AND' ;
OR  : 'OR' ;

GT : '>' ;
GE : '>=' ;
LT : '<' ;
LE : '<=' ;
EQ : '=' ;

LPAREN : '(' ;
RPAREN : ')' ;

DECIMAL : '-'?[0-9]+('.'[0-9]+)? ;
IDENTIFIER : '[' [a-zA-Z_][a-zA-Z_0-9 ]* ']';
SEMI : ';' ;
COMMENT : '//' .+? ('\n'|EOF);// -> skip ;
WS : [ \r\t\u000C\n]+;// -> skip ;

rule_set : single_rule* ;

single_rule : logical_expr ;

logical_expr : logical_expr AND logical_expr  # LogicalExpressionAnd
             | logical_expr OR logical_expr   # LogicalExpressionOr
             | comparison_expr                # ComparisonExpression
             | LPAREN logical_expr RPAREN     # LogicalExpressionInParen
             ;

comparison_expr : IDENTIFIER comp_operator DECIMAL  # ComparisonExpressionWithOperator
            ;

comp_operator : GT
              | GE
              | LT
              | LE
              | EQ
              ;
语法事件检测;
和:'和';
或:‘或’;
GT:“>”;
GE:“>=”;

LT:“由于您将
定义为
逻辑表达式中的第一个备选方案,因此生成的解析器将首先解析
5和[压力高度]
,而不是
[俯仰角]>5

您可能需要在
之前定义
比较\u expr

logical_expr : comparison_expr                # ComparisonExpression
             | logical_expr AND logical_expr  # LogicalExpressionAnd
             | logical_expr OR logical_expr   # LogicalExpressionOr
             | LPAREN logical_expr RPAREN     # LogicalExpressionInParen
             ;

我使用了您的语法文件,能够解析您提供的两个输入字符串

为了让它发挥作用,我取消了规则中的“->跳过;”注释。你能试试吗

COMMENT : '//' .+? ('\n'|EOF) -> skip ;
WS : [ \r\t\u000C\n]+ -> skip ;

原来问题出在空格上。如果我将输入字符串更改为:

[Pitch Angle]>5AND[Pressure Altitude]<10000

感谢那些关注这一问题的人。

谢谢巴特。不幸的是,这并没有什么不同。好的,然后你可以编辑你的问题并发布一个帖子,以便其他人可以重现错误吗?导致此异常的不是优先级,因此你应该花更多的时间调试语法,例如在Visual Studio上调试生成的代码。
WS : [ \r\t\u000C\n]+ -> channel(HIDDEN);