ANTLR4 中基于目标的成员
Target based members in ANTLR4
有没有办法区分语言目标并在语法文件中提供适当版本的@members?不同的语言目标使用不同的注释和语法。我想为不同的目标语言维护相同的语法文件。
对于 Cpp (C++) 目标:
@members {
// C++ target:
bool a_boolean = 0;
}
对于Python3目标:
@members {
# Python target:
a_boolean: bool = True
}
对于Java目标:
@members {
/** Java target:
*/
Boolean a_boolean = true;
}
或者是否有任何可以检查目标语言的 ANTLR4 元条件?这是我自己的语法,但是有什么东西吗?
@members {
$if Cpp
// C++ target:
bool a_boolean = 0;
$fi
$if Python
# Python target:
a_boolean: bool = True
$fi
$if Java
/** Java target:
*/
Boolean a_boolean = true;
$fi
}
这一切都不可能。这是 ANTLR4 在解析器生成时执行的简单复制粘贴操作,包括缩进 + 换行符等所有空格。
您唯一的选择是区分 C++ 和所有其他目标,因为对于 C++,我已经介绍了 additional named actions,例如 @parser::definitions
。
但是,如果您向出现在所有目标中的 @members
之类的命名操作添加一些内容,那么您最终将在结果文件中包含非 C++ 代码(当使用 C++ 作为目标时)。
总之,您的方法行不通,您最好使用不同的解决方案,例如解析器和词法分析器的基 class,其中包含您需要的成员变量。详情搜索:
options {
superClass = ...;
}
有没有办法区分语言目标并在语法文件中提供适当版本的@members?不同的语言目标使用不同的注释和语法。我想为不同的目标语言维护相同的语法文件。
对于 Cpp (C++) 目标:
@members {
// C++ target:
bool a_boolean = 0;
}
对于Python3目标:
@members {
# Python target:
a_boolean: bool = True
}
对于Java目标:
@members {
/** Java target:
*/
Boolean a_boolean = true;
}
或者是否有任何可以检查目标语言的 ANTLR4 元条件?这是我自己的语法,但是有什么东西吗?
@members {
$if Cpp
// C++ target:
bool a_boolean = 0;
$fi
$if Python
# Python target:
a_boolean: bool = True
$fi
$if Java
/** Java target:
*/
Boolean a_boolean = true;
$fi
}
这一切都不可能。这是 ANTLR4 在解析器生成时执行的简单复制粘贴操作,包括缩进 + 换行符等所有空格。
您唯一的选择是区分 C++ 和所有其他目标,因为对于 C++,我已经介绍了 additional named actions,例如 @parser::definitions
。
但是,如果您向出现在所有目标中的 @members
之类的命名操作添加一些内容,那么您最终将在结果文件中包含非 C++ 代码(当使用 C++ 作为目标时)。
总之,您的方法行不通,您最好使用不同的解决方案,例如解析器和词法分析器的基 class,其中包含您需要的成员变量。详情搜索:
options {
superClass = ...;
}