如何解决在 ANTLR4.8 C++ 目标
我要了
token recognition error at: '°'
对于学位符号,我不知道该怎么做。
在我定义的词法分析器中
学位:'\uC2B0' | '\u00F8';
词法分析器和解析器的 .g4 文件以 UTF-8 格式存储。输入文件也以 UTF-8 格式存储。当我在十六进制编辑器中查看输入文件时,度数符号被编码为 c2 b0。
std::ifstream is(inputFile);
antlr4::ANTLRInputStream antlrIs(is);
TagsLexer lexer(&antlrIs);
antlr4::CommonTokenStream tokens(&lexer);
TagsParser parser(&tokens);
TagsParser::TagsContext* tagsContext = parser.tags();
解决方法
此处可能需要包含完整的词法分析器语法。
识别错误从\uC2B0 之前的\uC382 字符开始。从那个错误中,我假设没有词法分析器规则需要一个 \uC382 字符并且可以跟一个 \uC2B0。
您可以尝试添加以下词法分析器规则作为最后的词法分析器规则。:
BAD_CHAR: . ;
您要确保这是最后一条规则。它只会匹配单个字符,但会匹配任何单个字符,因此 ANTLR 首先查看任何其他单字符词法分析器规则很重要。
词法分析器规则优先考虑与规则匹配的最长输入字符串,如果有多个规则匹配相同数量的字符,则使用语法中的第一条规则。
这应该将 \uC382 字符标记为 BAD_CHAR
标记,然后将 \uC2B0 字符识别为 Degree
标记。 ANTLR 错误恢复可能能够将 BAD_CHAR
标记为无法识别的字符并将其忽略,然后继续进行与 Degree
标记匹配的解析。
当然,这一切都假定 \uC382 对您来说是一个无效字符。如果它有效,那么您需要一个识别它的规则。
,一个简单的例子,将实际的 unicode 符号 \u00B0 与它在 UTF-8 C2 B0 中的编码混合在一起。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。