我有以下树梢语法:
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规则,因为当我删除它时,表达式会被解析。
这个语法有什么问题?
提前致谢。
答案 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