antlr4中基于java的成员

nxagd54h  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(468)

有没有办法区分语言目标并在语法文件中提供适当版本的@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
}
w8ntj3qf

w8ntj3qf1#

这一切都不可能。这是一个简单的复制粘贴操作,由antlr4在解析器生成时执行,包括缩进+换行等所有空格。
唯一的选择是区分c和所有其他目标,因为对于c我引入了额外的命名操作,比如 @parser::definitions .
但是,如果您向命名操作添加了 @members ,它出现在所有目标中,然后结果文件中会出现非c代码(当使用c作为目标时)。
总之,您的方法将不起作用,您最好使用不同的解决方案,比如parser和lexer的基类,其中包含您需要的成员变量。有关详细信息,请搜索:

options {
    superClass = ...;
}

相关问题