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