2

如何在词法分析器中构建一个可以处理内部递归的标记作为这个字符串:

${*anything*${*anything*}*anything*}

?

4

2 回答 2

2

是的,您可以在词法分析器规则中使用递归。

举个例子:

${a ${b} ${c ${ddd} c} a}

这将被以下语法正确解析:

parse
  : DollarVar
  ;

DollarVar
  : '${' (DollarVar | EscapeSequence | ~Special)+ '}'
  ;

fragment 
Special
  :  '\\' | '$' | '{' | '}'
  ;

fragment
EscapeSequence
  :  '\\' Special
  ;

正如 ANTLRWorks 内部的解释器所示:

替代文字 http://img185.imageshack.us/img185/5471/recq.png

于 2010-03-31T21:06:40.317 回答
0

正如@BartK 在他的帖子中巧妙地指出的那样,ANTLR 的词法分析器确实支持递归,但您只会在解析器中看到一个标记。如果您需要解释该令牌中的各个部分,您可能希望在解析器中处理它。

IMO,你最好在解析器中做一些事情:

variable: DOLLAR LBRACE id variable id RBRACE;

通过执行上述操作,您将看到所有必要的部分,并可以构建 AST 或以其他方式进行相应处理。

于 2010-03-31T19:39:29.997 回答