gpt4 book ai didi

antlr4 - 保持 ANTLR4 语法目标独立的方法

转载 作者:行者123 更新时间:2023-12-02 01:11:18 25 4
gpt4 key购买 nike

我正在为 C++ 目标编写语法,但是我希望它也能与 Java 一起使用,因为 ANTLR 附带了适用于 Java 目标语法的出色工具。这本书(“The Definitive ANTLR 4 Reference”)说实现目标独立性的方法是使用监听器和/或访问者。但是有一个问题。我可能需要的任何谓词、局部变量、自定义构造函数、自定义标记类等都会引入无法删除的目标语言依赖性,至少根据我从书中获取的信息。由于这本书可能已经过时,因此问题如下:

有没有办法以独立于语言的方式声明原始变量,例如:

item[$bool hasAttr]
:
type ( { $hasAttr }? attr | ) ID
;

哪里 $bool将被翻译为 bool在 C++ 中,但到 boolean在 Java 中(在这种情况下,解决方法是使用 int,但很可能不是在所有潜在目标中)

有没有一种方法可以将某些代码片段声明为仅用于特定目标,例如:
parser grammar testParser;
options
{
tokenVocab=testLexer;
}

@header
<lang=Cpp>{
#include "utils/helper.h"
}
<lang=Java>{
import test.utils.THelper;
}

@members
<lang=Cpp>{
public:
testParser(antlr4::TokenStream *input, utils::THelper *helper);

private:
utils::THelper *Helper;

public:
}
<lang=Java>{
public testParser(TokenStream input, THelper helper) {
this(input);
Helper = helper;
}

private THelper Helper;
}

start
:
(
<lang=Cpp>{ Helper->OnUnitStart(this); }
<lang=Java>{ Helper.OnUnitStart(this); }
unit
<lang=Cpp>{ _localctx = Helper->OnUnitEnd(this); }
<lang=Java>{ _localctx = Helper.OnUnitEnd(this); }
)*
EOF
;

...

目前,我将保留两个单独的语法,更改 Java 一个,一旦我对结果感到满意,将更改合并到 C++ 一个,但如果可能的话
我宁愿把它保存在一个文件中。

最佳答案

这种目标依赖是一个真正的麻烦,我已经考虑了一段时间如何以一种好的方式摆脱它。还没有找到完全可用的东西。

您可以做的是使用 Java 和 C++ 都可以理解的语法(例如编写一个像函数调用一样的谓词:a: { isValid() }? b c; 并在您派生解析器的基类中实现这些函数(ANTLR 允许指定这样的一个基类通过语法选项 superClass )。

C++ 目标还获得了许多额外的 named actions您只能使用它来指定 C++ 特定的东西。

关于antlr4 - 保持 ANTLR4 语法目标独立的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45196413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com