具有否定规则的树顶无限递归

时间:2012-10-20 07:44:29

标签: ruby treetop

我有以下树梢语法:

grammar TestGrammar

    rule body
        text / expression
    end 

    rule text
        not_delimiter*
    end 

    rule expression
        delimiter text delimiter
    end 

    rule delimiter
        '$' 
    end 

    rule not_delimiter
        !delimiter
    end 

end

当我尝试解析表达式时,例如'hello world $ test $',脚本进入无限循环。
问题似乎来自not_delimiter规则,因为当我删除它时,表达式会被解析。

这个语法有什么问题?

提前致谢。

1 个答案:

答案 0 :(得分:1)

问题似乎是你试图匹配的地方:

rule text
    not_delimiter*
end

由于*也不会匹配,因此您可以匹配[^$]*,我认为这是导致无限循环的原因。

此外,您需要在起始规则中匹配多个bodies,否则它将返回nil,因为您只会匹配text规则或expression但是规则但不是两者。

rule bodies
   body+
end

这将解析:

require 'treetop'
Treetop.load_from_string DATA.read

parser = TestGrammarParser.new

p parser.parse "hello world $test$"

__END__
grammar TestGrammar
   rule bodies
      body+
   end
   rule body
      expression / text
   end
   rule expression
      delimiter text delimiter
   end
   rule text
      not_delimiter+
   end
   rule not_delimiter
      [^$]
   end
   rule delimiter
      '$'
   end
end