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

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

这个语法有什么问题?

提前致谢。

4

1 回答 1

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
于 2012-10-20T22:50:30.043 回答