Parameters 带参数的ANTLR3运算符

Parameters 带参数的ANTLR3运算符,parameters,antlr,operator-keyword,antlr3,Parameters,Antlr,Operator Keyword,Antlr3,首先,我知道这个名字听起来有点奇怪,但我不知道怎么称呼它。如果有人比我有更好的想法,请编辑 现在,问题是: 我有一个相当旧的语法,我需要适应一个新的要求 旧表格如下所示: “第一文本”*“第二文本” 基本上就是做一些文本操作。不管发生什么事。让我们假设它连接文本。这将生成一个非常基本的树,其中文本作为叶子,操作符作为根 现在,新的请求是通过指定需要连接的字母数来“参数化”连接操作。新表单应如下所示: “第一文本”*(3)“第二文本” 这意味着它必须从第一个文本中提取前3个字符,从第二个文

首先,我知道这个名字听起来有点奇怪,但我不知道怎么称呼它。如果有人比我有更好的想法,请编辑

现在,问题是:

  • 我有一个相当旧的语法,我需要适应一个新的要求
  • 旧表格如下所示:

    “第一文本”*“第二文本”

基本上就是做一些文本操作。不管发生什么事。让我们假设它连接文本。这将生成一个非常基本的树,其中文本作为叶子,操作符作为根

  • 现在,新的请求是通过指定需要连接的字母数来“参数化”连接操作。新表单应如下所示:

    “第一文本”*(3)“第二文本”

这意味着它必须从
第一个文本
中提取前3个字符,从
第二个文本
中提取前3个字符

  • 此外,新语法还需要与旧格式兼容(参数/语法不是强制性的)
  • 我实现了一个
    CommonTreeAdaptor
    类,该类为每个节点生成我自己的类的实例(
    QNode
    )。有点像工厂。我可以向指定用于处理运算符的对象添加新属性。假设它是
    QNodeStar

  • 语法如下所示:

    语法

    代币{ COMPUTEOP='*'; }

    公开的 topexpr :expr SEMI->^(根expr) ;

    expr :CRIT(计算^CRIT)* ;

    碎片暴击 :“‘’(‘a’、‘z’|‘a’、‘z’|‘0’、‘9’)+’” ;

    计算 :(COMPUTEOP | COMPUTEOP LPAREN!INT RPAREN!) ;

当然,它比这更复杂,只是在这里放一些东西,让你对我所拥有的东西有一个想法。

因此,我的问题是,我如何使'dissapear'成为COMPUTE definition中的INT参数,并自动
将其移动到criteria节点(
QNodeStar
),而无需更改树布局和语法定义文件

更新:有关如何获取树的示例:

1:“a”*“b”


好吧,如果我扔掉参数(
3
),我将无法告诉如何“执行”操作符,对吗?操作员
*(3)
将与操作员
*
相同,并且不会有任何收益。表达式可能更复杂(例如:
“a”*(1)(“c”*(7)“d”);
),因此我需要以某种方式将其绑定到节点。是的,我需要扩展当前功能,语法非常复杂,我希望尽可能保持一致。
...
* / \ "a" "b" * / \ "c" "d" * / | \ "c" 3 "d"