我用antlr 4.4编写了这样的语法:
grammar CSV;
file
: row+ EOF
;
row
: value (Comma value)* (LineBreak | EOF)
;
value
: SimpleValueA
| QuotedValue
;
Comma
: ','
;
LineBreak
: '\r'? '\n'
| '\r'
;
SimpleValue
: ~(',' | '\r' | '\n' | '"')+
;
QuotedValue
: '"' ('""' | ~'"')* '"'
;
然后我使用antlr 4.4生成解析器和词法分析器,此过程成功
生成类后,我编写了一些使用语法的Java代码
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
public class Main {
public static void main(String[] args)
{
String source = "\"a\",\"b\",\"c";
CSVLexer lex = new CSVLexer(new ANTLRInputStream(source));
CommonTokenStream tokens = new CommonTokenStream(lex);
tokens.fill();
CSVParser parser = new CSVParser(tokens);
CSVParser.FileContext file = parser.file();
}
}
以上所有代码都是CSV字符串的解析器,例如:““ a”,“ b”,c“
窗口输出:
line 1:8 token recognition error at: '"c'
line 1:10 missing {SimpleValue, QuotedValue} at '<EOF>'
我想知道如何从代码背后的方法(getErrors()或…)中获取此错误,而不是由于输出窗口的结果
谁能帮我 ?
使用ANTLR进行CSV解析是一种恕我直言的选择,但是既然您在做…
ANTLRErrorListener
。您可以BaseErrorListener
为此扩展。收集错误并将它们附加到列表中。parser.removeErrorListeners()
以删除默认侦听器parser.addErrorListener(yourListenerInstance)
添加自己的听众现在,对于词法分析器,您可以做同样的事情removeErrorListeners
/ addErrorListener
,或者在末尾添加以下规则:
UNKNOWN_CHAR : . ;
有了这个规则,词法分析器将永远不会失败(它将UNKNOWN_CHAR
在无法执行其他任何操作时生成令牌),并且所有错误将由解析器生成(因为它将不知道如何处理这些UNKNOWN_CHAR
令牌)。我推荐这种方法。
我希望看到一条消息说“xyz行的语法错误”,“预期的。但相反,对于每一个由我丢失的逗号引起的后续错误,在xyz处都有一个获得一百个不可行的替代方案的列表。 有没有一种方法可以得到一个错误,这是由缺少逗号造成的?如果它会抱怨意外的var2令牌,也是完全可以的。
问题内容: 我正在构建用于学习的编程laguange的简单语法。 我遇到了奇怪的错误,对我来说毫无意义。 我正在使用此语法的预构建词法分析器和解析器: 我正在解析此Java代码: 最后是我要解析的字符串: 问题答案: 错误消息表示包含值“ void”的预期令牌类型与通过使用输入中的字符串“ void”产生的实际令牌类型不匹配。查看您的词法分析器规则,表明IDENTIFIER规则正在使用输入字符串’
我正在编写一种类似SQL的语言。假设正确的语法是 但我把它打到 默认行为是Antlr将停止解析,我丢失了语法高亮显示和大纲视图。错误消息是“US”处缺少EOF。我将IParser重新绑定到RuntimeModule中的自定义解析器 重写 并重写方法handle this part以使用所有令牌直到分号 在这个匹配符号之后是,但是语法高亮仍然消失,antlr停止解析。我如何才能实现我的目标? ===
5.3 将代码解析成错误消息 {#toc_3} 在之前我们已经谈论了数据绑定和验证,最后一件值得讨论的事情是输出对应于验证错误的消息。在我们上面展示的例子里,我们拒绝了name和age字段。如果我们要使用MessageSource来输出错误消息,我们将会使用我们在拒绝该字段(这个情况下是’姓名’和’年龄’)时给出的错误代码。当你调用(不管是直接调用还是间接通过使用ValidationUtils类调
我可以使用以下方法获取第一个
从上下文菜单中选择: 谢谢