admin管理员组文章数量:1356926
I'm not seeing an explanation anywhere for what is triggering this exception. (I added EOF while looking, but it didn't help.) What's going on?
(I'm using C# and Antlr.Runtime.Standard from NuGet. Is that the same as antlr4cs? I wasn't sure whether to use the tag.)
Exception of type 'Antlr4.Runtime.NoViableAltException' was thrown.
at Antlr4.Runtime.Atn.ParserATNSimulator.ExecATN(DFA dfa, DFAState s0, ITokenStream input, Int32 startIndex, ParserRuleContext outerContext)
at Antlr4.Runtime.Atn.ParserATNSimulator.AdaptivePredict(ITokenStream input, Int32 decision, ParserRuleContext outerContext)
at testParser.root() in <project>\Grammar\testParser.cs:line 159
Input:
false || true
The output, before I defined VisitRoot
, was a list of all tokens.
Line 159 has the last opening curly bracket here:
public override string VisitIntCompExpression([NotNull] IntCompExpressionContext context)
{
var left = context.children[0] switch
{
IntExpressionContext i => VisitIntExpression(i),
_ => throw new Exception(),
};
var oper = context.children[1].GetText();
var right = context.children[2] switch
{
IntExpressionContext i => VisitIntExpression(i),
_ => throw new Exception(),
};
return $"({left} {oper} {right})";
}
Grammar:
grammar test;
root : (intExpression | doubleExpression | boolExpression | stringExpression)* EOF
;
boolExpression : boolOrExpression # boolOrExpression_
| boolAndExpression # boolAndExpression_
| boolBaseExpression # boolBaseExpression_
| boolParenthetical # boolParenthetical_
| intCompExpression # intCompExpression_
| doubleCompExpression # doubleCompExpression_
| boolExpression ( EQ | NEQ ) boolExpression # boolCompExpression
| stringCompExpression # stringCompExpression_
| boolUnaryExpression # boolUnaryExpression_
| BOOL_LITERAL # boolLiteral
;
boolUnaryExpression : NOT boolParenthetical
;
boolParenthetical : '(' boolExpression ')'
;
boolBaseExpression : boolParenthetical | boolUnaryExpression | BOOL_LITERAL
;
boolOrExpression : boolBaseExpression OR boolBaseExpression
;
boolAndExpression : ( boolOrExpression | boolBaseExpression ) AND ( boolOrExpression | boolBaseExpression )
;
intCompExpression : intExpression ( EQ | NEQ | LT | GT | LTE | GTE ) intExpression
;
doubleCompExpression : doubleExpression ( EQ | NEQ | LT | GT | LTE | GTE ) doubleExpression
;
stringCompExpression : stringExpression ( EQ | NEQ ) stringExpression
;
stringExpression : stringExpression_
;
stringExpression_ : '(' stringExpression ')' # stringParenthetical
| stringExpression_ PLUS stringExpression_ # stringConcatExpression
| STRING_LITERAL # stringLiteral
;
doubleExpression : doubleBinExpression2 | doubleBaseExpression2
;
doubleUnaryExpression : math1 doubleBaseExpression1
;
doubleParenthetical : '(' doubleExpression ')'
;
doubleBaseExpression1 : doubleParenthetical
;
doubleBaseExpression2 : doubleBaseExpression1
| doubleUnaryExpression
| DOUBLE_LITERAL
| intExpression
;
doubleBinExpression1 : doubleBaseExpression2 math1 doubleBaseExpression2
;
doubleBinExpression2 : ( doubleBinExpression1 | doubleBaseExpression2 ) math2 ( doubleBinExpression1 | doubleBaseExpression2 )
| ID math2 ( doubleBinExpression1 | doubleBaseExpression2 )
| ( doubleBinExpression1 | doubleBaseExpression2 ) math2 ID
;
intExpression : intBinExpression2 | intBaseExpression2
;
intUnaryExpression : math1 intBaseExpression1
;
intParenthetical : '(' intExpression ')'
;
intBaseExpression1 : intParenthetical
;
intBaseExpression2 : intBaseExpression1 | intUnaryExpression | INT_LITERAL
;
intBinExpression1 : intBaseExpression2 math1 intBaseExpression2
;
intBinExpression2 : ( intBinExpression1 | intBaseExpression2 ) math2 ( intBinExpression1 | intBaseExpression2 )
;
math1 : FORESLASH | ASTERISK | PERCENT
;
math2 : PLUS | MINUS
;
LT : '<' ;
GT : '>' ;
LTE : '<=' ;
GTE : '>=' ;
NEQ : '!=' ;
EQ : '==' ;
ASN : '=' ;
FORESLASH : '/' ;
ASTERISK : '*' ;
PERCENT : '%' ;
PLUS : '+' ;
MINUS : '-' ;
NOT : '!' ;
OR : '||' ;
AND : '&&' ;
ID : [A-Za-z][A-Za-z0-9]* ;
WS : [ \t\r\n]+ -> skip ;
STRING_LITERAL : '"' ( '\\"' | [^"]+ )* '"' | '\'' ( '\\\'' | [^']+ )* '\'' ;
DOUBLE_LITERAL : [-+]? [0-9]+ ( '.' [0-9]+ | [eE] [-+]? [0-9]+ | '.' [0-9]+ [eE] [-+]? [0-9]+ ) ;
INT_LITERAL : [-+]? [0-9]+ ;
BOOL_LITERAL : 'true' | 'false' ;
本文标签: antlr4ANTLR Why does my grammar throw NoViableAltExceptionStack Overflow
版权声明:本文标题:antlr4 - ANTLR: Why does my grammar throw NoViableAltException? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744063341a2584534.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论