2012-10-20 71 views
2

我有以下树梢语法:树顶无限递归

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 

当我试图解析表达式,如“你好世界$ $测试”,剧本进入无限循环。
这个问题似乎来自not_delimiter规则,因为当我将它移除表达式解析。

这个语法有什么问题?

在此先感谢。

+0

什么是你期望的输出,这有什么,当你删除'not_delimiter'输出?另外,为什么这个字符串解析? “hello world $ test $”既不是文本(非$的序列),也不是表达式(以$开头和结尾的文本)。 –

回答

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 
+0

谢谢!的确,这是有道理的。我真的希望树顶有一个更好的文档和错误输出,调试有时会变得麻烦。 – Eric