Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何在Verilog语法示例中消除左递归_Ruby_Treetop - Fatal编程技术网

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

Ruby 如何在Verilog语法示例中消除左递归,ruby,treetop,Ruby,Treetop,我正在使用Treetop为Verilog语言创建语法,并且遇到了一些情况,其中语言规范涉及一个不转换为Treetop的左递归构造 我对此做了一些阅读,这个答案很好地总结了消除左递归的一般方法: 然而,我不能完全理解它是如何工作的,如果有更了解情况的人能确认我的方法是否正确,我将不胜感激 对于这个原始规则,包括左递归(注释是如何在语言规范中编写的): 在删除左递归的情况下,以下内容是否真的等效 rule constant_expression (constant_primary con

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

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

然而,我不能完全理解它是如何工作的,如果有更了解情况的人能确认我的方法是否正确,我将不胜感激

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

在删除左递归的情况下,以下内容是否真的等效

  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 

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

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

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

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