Antlr4 新手:2.4@被接受为浮动。是'@';一个特殊的角色?
考虑到我的语法/访问者,我想知道为什么lexer(和解析器)乐于接受表达式“setvalue(2@)”。我肯定我做错了什么 下面是一个小样本,可以说明这个问题 非常感谢您的帮助Antlr4 新手:2.4@被接受为浮动。是'@';一个特殊的角色?,antlr4,Antlr4,考虑到我的语法/访问者,我想知道为什么lexer(和解析器)乐于接受表达式“setvalue(2@)”。我肯定我做错了什么 下面是一个小样本,可以说明这个问题 非常感谢您的帮助 grammar ExpressionEvaluator; parse : block EOF ; block : stat* ; stat : assignment ; assignment : SETVALUE OPAR expr CPAR ; expr : atom
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到达该字符时,以下情况按顺序发生:
@
字符\u input.consume()
跳过坏字符ErrChar
: .
;
解析器在到达
ErrChar
时会报告错误,因此您不需要向lexer添加错误侦听器。啊,明白了!非常感谢您的帮助。顺便说一句,ANTLR4真的非常酷。