带参数的ANTLR3运算符

时间:2012-07-19 12:45:03

标签: parameters antlr operator-keyword antlr3

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

现在,问题是:

  • 我有一个非常古老的语法,我需要添加到新的请求
  • 旧表格看起来像这样:

    “first text”*“second text”;

基本上是做一些文本操作。什么都没关系。我们只是说它连接文本。这产生了一个非常基本的树,其中文本为叶子,操作符为根

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

    “first text”*(3)“second text”;

意味着必须从first text获取前3个字符,并从second text

获取前3个字符
  • 另外,新语法也需要与旧格式兼容(参数/ paranthesis不是强制性的)
  • 我已经实现了一个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"
  • 我知道树看起来与'旧树'相同(#1)。我想这样做有两个原因:向后兼容(参数的默认值是1)并且我不想仅为此运算符更改树执行方法以避免在迭代树中的节点时if (node == 'star') traverse1() else traverse2()之类的条件。我认为有一些方法 - 我还无法识别 - 要“吃掉”参数(3)并将其作为值传递给根中的QNodeStar对象,方式类似于验证方法。我成功地使树看起来像是一个愚蠢的树,但这对我没有多大帮助:
     *
   / | \
 "c" 3  "d"

0 个答案:

没有答案