想知道为什么表达式" 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());
}
答案 0 :(得分:1)
@
字符实际上根本不匹配任何内容。词法分析器到达该字符时,按顺序发生以下情况:
@
字符匹配。_input.consume()
跳过坏字符。为确保尽可能轻松地报告错误,请始终将以下规则添加为词法分析器中的最后一条规则。
ErrChar
: .
;
解析器在到达ErrChar
时会报告错误,因此您不需要向词法分析器添加错误侦听器。