antlr 规则上下文是否可以独立于目标

Can antlr rule contexts be target independent

本文关键字:于目标 目标 独立 规则 上下文 是否 antlr      更新时间:2023-10-16

我想知道是否有任何方法可以使以下antlr语法片段目标独立:

ifstatement locals [long condition = 0, long branch = 0, long end = 0]: ifpart[_localctx] thenpart[_localctx] (elifpart[_localctx] thenpart[_localctx])* (elsepart[_localctx])? 'fi';
ifpart [IfstatementContext base] : 'if' boolexpr ;
thenpart [IfstatementContext base] : 'then' statements ;
elifpart [IfstatementContext base] : 'elif' boolexpr ;
elsepart [IfstatementContext base] : 'else' statements ;

这似乎在 Java 中工作正常,但是使用 Cpp 目标时,antlr 生成的代码无法编译。 我在语法中没有任何动作或谓词。

我的预期目标是C++,但我打算让侦听器实现每个规则的操作,而不是直接将它们放在语法中,以便语法仍然可以被 antlr 附带的基于 java 的开发工具分析和使用,并且我不想维护两个单独的语法文件。 在上述语法片段的 Cpp 目标上,需要将每个其他规则的参数类型更改为IfstatementContext *这对于 Java 来说不是有效的语法。

在意图和设计方面,如果理解我正在尝试做什么是相关的,是让解析器的侦听器具有 if 语句的各个组件的预置和后置方法,在 ifstatement 上下文中更新本地字段,以便输出正确的代码以在一次传递中正确处理流控制。 我将使用长值作为代码中点的引用,这些点稍后需要使用更新的地址信息进行修补,因为每个不同的 if 语句片段都已完成。 请注意,我不是在问如何编写侦听器代码

但是,如果可能的话,我非常想知道如何以与目标无关的方式在antlr语法中引用这些上下文。

如果需要任何进一步的细节,请在评论部分注明,我将尽力解决任何和所有具体问题。

操作和谓词代码始终以目标语言编写。这是没有办法的。如果您需要与平台无关的行为,请不要使用操作或谓词。

话虽如此,有一种方法可以只使用所有可能的目标语言支持的表达式。例如,简单的变量名称,带有大括号if-then-else结构,函数调用以及类似的东西在C++,Java和C#等语言中几乎相同。Python/PHP/Swift 明显不同,Javascript/Typescript 通常需要this前缀(但在其他方面是兼容的(。