首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLR4中基于目标的成员

ANTLR4中基于目标的成员
EN

Stack Overflow用户
提问于 2020-12-17 14:06:38
回答 1查看 79关注 0票数 0

有没有办法区分语言目标,并在语法文件中提供@members的适当版本?不同的语言目标使用不同的注释和语法。我想为不同的目标语言维护相同的语法文件。

对于Cpp (C++)目标:

代码语言:javascript
复制
@members {
  // C++ target:
  bool a_boolean = 0;
}

对于Python3目标:

代码语言:javascript
复制
@members {
  # Python target:
  a_boolean: bool = True
}

对于Java目标:

代码语言:javascript
复制
@members {
  /** Java target:
   */
  Boolean a_boolean = true;
}

或者有没有可以检查目标语言的ANTLR4元条件?这是我自己的语法,但是这行有什么东西吗?

代码语言:javascript
复制
@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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-17 16:01:33

这一切都是不可能的。这是一个简单的复制-粘贴操作,ANTLR4在解析器生成时执行,包括所有空格,如缩进+换行符。

您唯一的选择就是区分C++和所有其他目标,因为对于C++,我引入了additional named actions,比如@parser::definitions

但是,如果您向出现在所有目标中的@members之类的命名操作中添加了一些内容,那么在结果文件中(当使用C++作为目标时),您最终会得到非C++代码。

因此,总而言之,您的方法将不起作用,您最好使用不同的解决方案,比如解析器和词法分析器的基类,它们包含您需要的成员变量。有关详细信息,请搜索:

代码语言:javascript
复制
options {
    superClass = ...;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65335454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档