最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

antlr4 - ANTLR: Why does my grammar throw NoViableAltException? - Stack Overflow

programmeradmin3浏览0评论

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' ;
发布评论

评论列表(0)

  1. 暂无评论