我是ANTLR的新手。我想写一个语法来解析下面的输入:
commit a1b2c3d4
语法如下::
grammar commit;
file : 'commit' COMMITHASH NEWLINE;
COMMITHASH : [a-z0-9]+;
DATE : ~[\r\n]+;
NEWLINE : '\r'?'\n';
当我尝试使用语法解析上述输入时,它会引发以下异常::
第1行:0不匹配的输入'commit a1b2c3d4',应为'commit'
我已经引用了ANTLR4:不匹配的输入链接,但仍然不清楚发生了什么。
ANTLR lexer在使用解析器之前完全分配明确的令牌类型。当一个lexer规则比另一个lexer规则匹配更多字符时,ANTLR总是首选匹配更多字符的规则,而不管lexer规则在语法中的出现顺序如何。当两个或多个规则匹配完全相同长度的输入符号时(并且没有其他规则匹配的输入符号超过这个数目),将为语法中首先出现的规则分配标记类型。
您的lexer包含一个规则date
,该规则匹配除换行符之外的所有字符。由于它总是与一行的整个文本匹配,并且没有一个令牌跨越多行,因此结果如下:
commit
匹配,将生成与此输入序列相对应的未命名标记。[a-z0-9]+
匹配,则将为该行的整个文本创建commithash
标记。date
也与此输入匹配,但commithash
首先出现,因此使用它。date
标记。即使该行以commit
或commithash
开头,也将使用date
规则,因为它匹配的字符序列较长。换行符
标记。您需要执行以下操作之一来解决此问题。确切的策略取决于你试图解决的更大的问题。
日期
规则,或重写该规则以匹配更具体的日期格式。date
标记的位置。我刚开始使用ANTLR4。我试图为一个简单的程序编写语法规则,但我很难让它工作。 null 任何帮助都很感激!
我有一个现有的语法,我正在使用C#输出将其转换为Antlr4。它在第一个标记上失败,消息不匹配的输入'BEGIN'需要any_word。奇怪的是,当我打印出令牌以查看它被识别为什么令牌时,它表明它已经正确地识别了它。
我的ANTLR4有问题。我正在尝试从python 3代码打印AST,但有一些错误,我不知道如何修复它们。 我编写了简单的测试代码: 我运行了程序,但出现了以下错误: 我的主要班级: 我有这个网站的语法:https://github.com/antlr/grammars-v4/tree/master/python3
ANTLR4.5给了我一个“不匹配的输入”String[]'期待'String'“,但我不明白为什么'[]'被包含在令牌中。 我已经把语法精简到最低限度,以显示问题: 我就是搞不清楚出了什么问题。
所以我在学习java,两天来我一直在寻找这个问题的解决方案。我尝试了所有的十进制分隔符,并试图设置语言环境,结果发现它不起作用。 代码: 输出和错误