1

首先,我知道标题可能听起来有点奇怪,但我不知道该怎么称呼它。如果有人比我有更好的想法,请编辑。

现在,问题:

  • 我有一个很老的语法,我需要适应一个新的请求
  • 旧形式如下所示:

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

这基本上是在做一些文本操作。没关系。假设它连接了文本。这正在生成一个非常基本的树,其中文本为叶子,运算符为根

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

    "第一个文本" *(3) "第二个文本";

这意味着它必须从 the 中获取前 3 个字符,从 thefirst text中获取前 3 个字符second text

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

  • 语法如下所示:

    语法 QGrammar;

    令牌 { COMPUTEOP = '*'; }

    ...
    

    public topexpr : expr SEMI -> ^(ROOT expr) ;

    expr:暴击(计算^暴击)*;

    片段 CRIT : '"' ('a'..'z'|'A'..'Z'|'0'..'9')+ '"' ;

    COMPUTE : (COMPUTEOP | COMPUTEOP LPAREN! INT RPAREN!) ;

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

所以,我的问题是,我怎样才能使 COMPUTE 定义中的 INT 参数“消失”,并自动将move其添加到标准节点(QNodeStar

更新:我想如何获得树木的例子:

1: “a”*“b”

    *
   / \
 "a" "b"
  • 这就是树现在的样子。有了这个,事情就很简单了:值总是叶子;

2: “c”*(3)“d”?

    *
   / \
 “c” “d”
  • 我知道这棵树看起来与“旧的”(#1)相同。我想要这样的原因有两个:向后兼容(参数的默认值为 1),并且我不想仅为此运算符更改树执行方法,以避免if (node == 'star') traverse1() else traverse2()在树中迭代节点时出现类似情况。我在想有某种方法——我还不能确定——“吃”参数(3)并以类似的方式将其作为值传递给QNodeStar根中的对象验证方法。我成功地让这棵树看起来像一棵愚蠢的树,但这对我没有太大帮助:
     *
   / | \
 "c" 3 "d"
4

0 回答 0