【发布时间】:2018-06-17 21:41:57
【问题描述】:
我已经搜索了好几个小时,试图弄清楚如何在 Antlr4 侦听器中手动创建语法错误。有可能吗?
我创建了一个运行良好的语法,它的一部分看起来像:
variableExp returns [ BigDecimal value ]
: VARIABLE_PREFIX n = VARIABLE_NAME
;
其中 VARIABLE_PREFIX 是类似“$”的字符。
我正在使用侦听器,在 exitVariableExp() 上,我根据解析器外部的信息设置值(并且它是用户输入的,因此我无法将其放入解析器):
@Override
public void exitVariableExp(ExpressionsParser.VariableExpContext ctx)
{
System.out.println("In exitVariableExp()");
ctx.value = lookupVariable(ctx.getText());
}
我遇到的问题是用户几乎可以键入任何不是变量的内容(例如 $jfjhfjfj),并且解析器会接受。我想在此侦听器成员中创建语法错误,因为我有一个错误侦听器,它存储语法错误位置以向用户显示:
@Override
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) throws ParseCancellationException
{
System.out.println("Got syntax error.");
errorLine = line;
errorColumn = charPositionInLine;
errorMessage = msg;
}
但我不知道该怎么做。也许这是错误的方法?
【问题讨论】:
-
如果一个变量必须以
$开头,你就不能使用你知道的东西吗? -
严格来说,这不是语法错误。语法由您的语法定义。所以只要代码遵守语法,就不会有语法错误。这可能是让您在搜索中望而却步的原因,因为实际上您想要实现运行时或域错误,具体取决于您正在构建的内容。
-
我同意这对解析器来说不是语法错误,但在一般意义上它是给用户的。这是否意味着您无法从侦听器中生成语法错误?
-
@ScottHunter 我不确定你在问什么。我正在解析用户输入的输入,它会有错误(错误的变量名),我想捕捉它——最好使用我已经拥有的错误处理机制。
-
为什么
$jfjhfjfj不是变量名?英文字母部分不是单词,但是很多变量名不是单词。是什么导致了这个错误?