我是ANTL4的新手,我似乎不知道如何让词法分析器的动作正确执行。
我有一个代码片段查找输入文本:
SIZE10 : [a-zA-Z]* {getText().length() <= 10}?
我希望它不匹配长度超过10个字母的任何字母组合,但是这样做的是将10+字母字符串视为两个不同的令牌,而不是仅仅使整个10+字母集合无效。我怎样才能使这个动作使整个字母集合无效呢?
此外,我在哪里可以看到我可以使用的所有不同的令牌函数(除了getText())?关于词法分析器操作的文档非常贫乏。总的来说,我很难找出哪些资源可以为我提供该语言中所有内容的明确列表。在这一点上,甚至在源代码中提供一个供我阅读的入口点也是很好的。这个文档对我来说太笼统/基础了。
编辑:我已经知道如何发送一个RuntimeException,但我不知道在哪里得到一个适当的RecognitionException所需的元素。
规则中的谓词以一种只允许匹配部分输入(如您的情况)或根据某些条件关闭语法的一部分的方式指导解析过程。在您的示例中,SIZE10规则一直匹配到谓词返回false。然后将此事件之前的所有内容作为SIZE10的匹配返回。之后,词法分析继续在前一个标记结束的地方进行,如果它仍然是一个字母,只要谓词说它是正确的,它将再次匹配SIZE10。这与你所期望的有点不同(例如,使用谓词作为全或无开关)。
但是,如果您希望首先匹配完整的字母集,然后检查长度是否为<= 10,则可以在侦听器中执行此操作。您可以挂钩到exitSIZE10()事件,并通过抛出识别异常来拒绝匹配。
有关操作中可用的函数,请参阅ANTLR的API文档。例如,下面是Token的示例,它向您展示了getText()之外的其他可能性。在你的行动中,考虑你所处的环境。在lexer规则中,您处理Token,因此getText()等处理Token。在解析器规则中,您有一个ParserContext,它也有一个getText()函数,但工作方式不同(将所有子上下文文本收集到一个逗号分隔的列表中)。