我已经开始使用ANTLR,并注意到它的lexer规则非常易变。一个极其令人沮丧的例子如下:
grammar output;
test: FILEPATH NEWLINE TITLE ;
FILEPATH: ('A'..'Z'|'a'..'z'|'0'..'9'|':'|'\\'|'/'|' '|'-'|'_'|'.')+ ;
NEWLINE: '\r'? '\n' ;
TITLE: ('A'..'Z'|'a'..'z'|' ')+ ;
此语法不会匹配以下内容:
c: \测试。txt
x
奇怪的是,如果我将TITLE
更改为TITLE:'x';
这次它仍然失败,给出一条错误消息说“不匹配的输入'x'期待'x'”,这非常令人困惑。更奇怪的是,如果我将test
中TITLE
的用法替换为FILEPATH
,整个事情都可以正常工作(尽管FILEPATH
会比我希望匹配的更多,所以一般来说,它对我来说不是一个有效的解决方案)。
我非常困惑,为什么ANTLR会出现如此奇怪的错误,然后在处理事情时突然无缘无故地工作。
这不是OP的直接问题,但对于那些有相同错误消息的人,这里有一些您可以检查的内容。
当我引入一个新关键字时,我有相同的不匹配的Input'x'期望'x'
模糊的错误消息。我的原因是我将新关键字放在了我的VARNAME
lexer规则之后,该规则将其分配为变量名而不是新关键字。我通过将关键字放在VARNAME
规则之前来修复它。
这似乎是对ANTLR的常见误解:
ANTLR中的语言处理:
语言处理分为两个严格分离的阶段:
由于词法分析必须先于解析,因此有一个后果:词法分析器独立于解析器,解析器不能影响词法分析。
乐行
ANTLR中的弯曲工作如下:
你的语法有什么问题吗
您的语法有两条至关重要的规则:
FILEPATH: ('A'..'Z'|'a'..'z'|'0'..'9'|':'|'\\'|'/'|' '|'-'|'_'|'.')+ ;
TITLE: ('A'..'Z'|'a'..'z'|' ')+ ;
TITLE匹配的每个匹配也将由FILEPATH匹配。FILEPATH在TITLE之前定义:因此您期望成为标题的每个标记都将是FILEPATH。
有两个提示:
问题内容: 作为一个初学者,当我从《权威的ANTLR 4参考》一书中学习ANTLR4时,我尝试从第7章运行修改后的练习版本: 由于Java属性只是键值对,因此我用来匹配eveything除外(我不希望它仅支持双引号中的字符串)。运行以下句子时,我得到: 当我改用它时,它可以工作。 我想知道我错在哪里,以便将来避免类似的错误。 请给我一些建议,谢谢! 问题答案: 由于ID和STRING都可以匹配以“
我能够成功地设置parse(InputStream,DefaultHandler)方法签名的期望,但是当我试图模拟parse(InputSource,DefaultHandler)签名时,JMockit永远看不到调用,并抛出MissingInvocation异常。 下面的示例显示了两个测试用例,一个模拟InputSource风格,一个模拟InputStream风格: 运行testcase的结果是:
以下语法在Antlr4.5和Java 1.8.45(IDE:IntelliJ Ultimate 14.1.4)中无法正常工作: 让正在评估的生成lexer和parser结果: 行1:22不匹配的输入“随机”期望方向 在使用的数据(文本文件)中,第二行已正确处理,但与上述错误消息一样,不是第一行。以下是正在使用的文本文件: 删除“行”定义中的那些空间不会发生错误。为什么?
我是ANTLR的新手。我想写一个语法来解析下面的输入: 语法如下:: 当我尝试使用语法解析上述输入时,它会引发以下异常:: 第1行:0不匹配的输入'commit a1b2c3d4',应为'commit' 我已经引用了ANTLR4:不匹配的输入链接,但仍然不清楚发生了什么。
我正在从版本2升级板条箱数据库。当我尝试升级在版本2中创建的表时,根据建议将x升级到3.1.6。x使用文档, https://crate.io/docs/crate/reference/en/latest/admin/system-information.html#tables-需要升级 在步骤5中, 质疑-
投入:123.45.