首先,我知道标题可能听起来有点奇怪,但我不知道怎么称呼它。如果有人比我更好,请编辑。
现在,问题是:
旧表格看起来像这样:
“first text”*“second text”;
基本上是做一些文本操作。什么都没关系。我们只是说它连接文本。这产生了一个非常基本的树,其中文本为叶子,操作符为根
现在,新请求是通过指定我需要连接的字母数来“参数化”连接操作。新表单应如下所示:
“first text”*(3)“second text”;
意味着必须从first text
获取前3个字符,并从second text
我已经实现了一个CommonTreeAdaptor
类,为每个节点生成一个我自己的类(QNode
)的实例。一种工厂。我可以向指定用于处理运算符的对象添加新属性。我们说它是QNodeStar
。
语法如下所示:
语法QGrammar;令牌{ COMPUTEOP ='*'; }
...
公共 topexpr :expr SEMI - > ^(ROOT expr) ;
EXPR :CRIT(COMPUTE ^ CRIT)* ;
片段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"
if (node == 'star') traverse1() else traverse2()
之类的条件。我认为有一些方法 - 我还无法识别 - 要“吃掉”参数(3
)并将其作为值传递给根中的QNodeStar
对象,方式类似于验证方法。我成功地使树看起来像是一个愚蠢的树,但这对我没有多大帮助:* / | \ "c" 3 "d"