Antlr4 新手:2.4@被接受为浮动。是'@';一个特殊的角色?

Antlr4 新手:2.4@被接受为浮动。是'@';一个特殊的角色?,antlr4,Antlr4,考虑到我的语法/访问者,我想知道为什么lexer(和解析器)乐于接受表达式“setvalue(2@)”。我肯定我做错了什么 下面是一个小样本,可以说明这个问题 非常感谢您的帮助 grammar ExpressionEvaluator; parse : block EOF ; block : stat* ; stat : assignment ; assignment : SETVALUE OPAR expr CPAR ; expr : atom

考虑到我的语法/访问者,我想知道为什么lexer(和解析器)乐于接受表达式“setvalue(2@)”。我肯定我做错了什么

下面是一个小样本,可以说明这个问题

非常感谢您的帮助

grammar ExpressionEvaluator;

parse
 : block EOF
 ;

block
 : stat*
 ;

stat
 : assignment
 ;

assignment
: SETVALUE OPAR expr CPAR
;


expr
 : atom                       #atomExpr
 ;

atom
 : OPAR expr CPAR #parExpr
 | (INT | FLOAT)  #numberAtom
 | ID             #idAtom
 ;

OPAR : '(';
CPAR : ')';
SETVALUE : 'setvalue';

ID
 : [a-zA-Z_] [a-zA-Z_0-9]*
 ;

INT
 : [0-9]+
 ;

FLOAT
 : [0-9]+ '.' [0-9]* 
 | '.' [0-9]+
 ;


STRING
 : '"' (~["\r\n] | '""')* '"'
 ;


SPACE
 : [ \t\r\n] -> skip
 ;
代码段:

public override object VisitParse(ExpressionEvaluatorParser.ParseContext context)
    {
        return this.Visit(context.block());
    }

    public override object VisitAssignment(ExpressionEvaluatorParser.AssignmentContext context)
    {
    // TODO - Set ID Value
        return Convert.ToDouble(this.Visit(context.expr()));
    }

    public override object VisitIdAtom(ExpressionEvaluatorParser.IdAtomContext context)
    {
        string id = context.GetText();

        // TODO - Lookup ID value
        return id;
    }


    public override object VisitNumberAtom(ExpressionEvaluatorParser.NumberAtomContext context)
    {
        return Convert.ToDouble(context.GetText());
    }

    public override object VisitParExpr(ExpressionEvaluatorParser.ParExprContext context)
    {
        return this.Visit(context.expr());
    }

@
字符实际上根本不匹配任何内容。当lexer到达该字符时,以下情况按顺序发生:

  • lexer确定没有lexer规则可以匹配
    @
    字符
  • lexer报告有关故障的错误
  • lexer调用
    \u input.consume()
    跳过坏字符
  • 为了确保尽可能容易地报告错误,请始终在lexer中添加以下规则作为最后一条规则

    ErrChar
      : .
      ;
    

    解析器在到达
    ErrChar
    时会报告错误,因此您不需要向lexer添加错误侦听器。

    啊,明白了!非常感谢您的帮助。顺便说一句,ANTLR4真的非常酷。