我是ANTL4的新手,我似乎无法弄清楚如何让lexer动作正常执行。
我有一个代码片段,用于查找输入文本:
SIZE10 : [a-zA-Z]* {getText().length() <= 10}?
我希望它与超过10个字母长的任何字母组合都不匹配,但是它的作用是将10+字母字符串视为两个不同的标记,而不是仅仅取消整个10+个字母的集合。如何让这个动作取消整套字母?
另外,我在哪里可以看到我可以使用的所有不同的令牌功能(除了getText())?有关词法分析器操作的文档非常糟糕。总的来说,我很难搞清楚哪些资源可以为我提供语言中所有内容的明确列表。在这一点上,即使是我阅读的源代码的入口点也会很好。对我来说,文档太笼统/基本。
编辑:我已经弄清楚如何发送RuntimeException,但我不知道从哪里获取正确的RecognitionException所需的元素。
答案 0 :(得分:0)
规则中的谓词以允许仅匹配部分输入(如您的情况)或基本上根据特定条件关闭部分语法的方式指示解析过程。在您的情况下,SIZE10规则匹配,直到谓词返回false。然后返回此事件的所有内容作为SIZE10的匹配项。在此之后,lexing继续在前一个令牌上结束,如果再次是一个字母,只要谓词说它是正确的,它将再次匹配SIZE10。这与您期望的有点不同(例如,将谓词用作全部或全部切换)。
但是,如果您想首先匹配整个字母集,然后检查长度是否为&lt; = 10,您可以在监听器中执行此操作。您可以挂钩exitSIZE10()事件并通过抛出识别异常来拒绝匹配。
有关操作中的可用功能,请参阅ANTLR的API文档。例如here is the one for Token,它显示了getText()旁边的其他可能性。在您的行动中,请考虑您拥有的背景。在词法分析器规则中,您处理令牌,因此getText()等处理令牌。在解析器规则中,您有一个ParserContext,它也有一个getText()函数,但它的工作方式不同(将所有子上下文文本收集到一个以逗号分隔的列表中)。