首先,我知道标题可能听起来有点奇怪,但我不知道该怎么称呼它。如果有人比我有更好的想法,请编辑。
现在,问题:
- 我有一个很老的语法,我需要适应一个新的请求
旧形式如下所示:
“第一个文本”*“第二个文本”;
这基本上是在做一些文本操作。没关系。假设它连接了文本。这正在生成一个非常基本的树,其中文本为叶子,运算符为根
现在,新的请求是通过指定我需要连接的字母数量来“参数化”连接操作。新表单应如下所示:
"第一个文本" *(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"