如何在Verilog语法例子中消除左递归

时间:2017-11-07 17:16:46

标签: ruby treetop

我正在使用Treetop为Verilog语言创建语法,并且遇到了一些语言规范涉及左递归构造但不会转换为Treetop的情况。

我已经对此做了一些阅读,这个答案很好地总结了消除左递归的一般方法:Left recursion elimination

然而,我无法理解其实际效果如何,如果有更多知识渊博的人能确认我的方法是否正确,我将不胜感激......

对于这个原始规则,其中包括左递归(注释是如何在语言规范中编写的):

  # constant_expression ::=
  #   constant_primary
  #   | unary_operator { attribute_instance } constant_primary
  #   | constant_expression binary_operator { attribute_instance } constant_expression
  #   | constant_expression ? { attribute_instance } constant_expression : constant_expression
  rule constant_expression
    constant_primary /
    (unary_operator (s attribute_instance)* s constant_primary) /
    (constant_expression s binary_operator (s attribute_instance)* s constant_expression) /
    (constant_expression s "?" (s attribute_instance)* s constant_expression s ":" s constant_expression)
  end 

以下是否真的等同于左递归?

  rule constant_expression
    (constant_primary constant_expression_tail?) /
    (unary_operator (s attribute_instance)* s constant_primary constant_expression_tail?)
  end

  rule constant_expression_tail
    (s binary_operator (s attribute_instance)* s constant_expression constant_expression_tail?) /
    (s "?" (s attribute_instance)* s constant_expression s ":" s constant_expression constant_expression_tail?)
  end 

1 个答案:

答案 0 :(得分:1)

这似乎有道理并且同样的事情。可能有助于理解的一件事是像下面的代码一样重写。关于PEG语法要记住的一件事是,如果规则无法匹配,它将尝试匹配下一个交替。

XOAUTH2