微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 ANTLR4.8 C++ 目标

如何解决在 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 举报,一经查实,本站将立刻删除。