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

时间:2014-07-31 17:53:51

标签: antlr4

想知道为什么表达式" 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());
    }

1 个答案:

答案 0 :(得分:1)

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

  1. 词法分析器确定没有词法分析器规则可以与@字符匹配。
  2. 词法分析器报告有关失败的错误。
  3. 词法分析器调用_input.consume()跳过坏字符。
  4. 为确保尽可能轻松地报告错误,请始终将以下规则添加为词法分析器中的最后一条规则。

    ErrChar
      : .
      ;
    

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