【问题标题】:Antlr4 - Match empty set in lexerAntlr4 - 匹配词法分析器中的空集
【发布时间】:2016-06-05 07:46:48
【问题描述】:

我刚刚升级了一个使用 ANTLR4 的 alpha 版本并匹配一个空集的项目工作正常。所发生的只是 ANTLR4 会抛出一个警告,说它是匹配的并且是空集。

现在使用 ANTLR 语言支持 1.2.1 和解析器生成器 4.3.0 现在会引发错误: “在匹配词法分析器规则时,错误 1 ​​'->' 让我大吃一惊” 在这两个地方我都要求它匹配一个空集。

它所中断的一些代码:

mode FILE_MODE;
     ASCII: FASCII           -> mode( PATH_MODE );
     UTF8: FUTF8             -> mode( PATH_MODE );
     UTF16: FUTF16           -> mode( PATH_MODE );
     EMPTY_FILE_TYPE:        -> skip, mode( PATH_MODE );  // Throws the error on this line

现在如何匹配一个空规则?

特里

【问题讨论】:

    标签: set antlr4


    【解决方案1】:

    一个没有。

    之前的警告表明 Antlr 可能没有为该行生成功能代码。如果该语法以前有效,则可能是由于该特定 Antlr 版本中未定义的行为。

    现在只需删除该行。无论检测到需要将模式切换到FILE_MODE,都应该确定只有在有一些文件模式内容要匹配时才这样做。如果没有,则继续考虑是否有路径模式内容。

    确定最佳模式计划/保护条件非常棘手。有时唯一的解决方案是使用前瞻的谓词。为了进一步提供帮助,需要示例性来源和完整的相关规则集。

    【讨论】:

    • 我想我已经解决了所示示例的空集,但由于另一种更复杂的模式也需要一个空集来解决,所以目前我无法编译。我也许可以将模式分解为一系列片段,然后将片段重新粘合在一起作为更大的片段,然后使用“?”操作员。但这需要一个片段有能力改变它的类型。 ** 片段 MODIFIER_ID: FIDENT -> type( IDENT ); **。编译器接受语法,但我从未在任何地方看到它记录在案。那么在我开始修改之前,语法是否合法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多