Treetop似乎在第一个之后忽略了其他规则,并且无法解析与语法文件中的第一个规则不匹配的任何内容。 我已经尝试交换规则的顺序,但仍然只考虑第一个。
# grammar_pov.treetop
grammar Pov
rule numeric
'-'? [0-9]+ ('.' [0-9]+)? <::PovFabric::Nodes::NumericLiteral>
end
rule comma
','
end
rule space
[\s]+
end
end
此语法文件匹配所有整数和浮点数,但不匹配'123,456'或'123,456' 解析器的failure_reason属性表示'预期 - 在第1行,第1列(第1列)之后'
我错过了什么吗?
答案 0 :(得分:1)
您的comma
和space
规则不会在任何地方使用。所以,它们只是死代码。
答案 1 :(得分:0)
与Jörg提到的一样,您需要在语法中使用comma
和space
规则。我建立了一个简单的例子,说明我认为你在下面要完成的事情。它应与"100"
,"1,000"
,"1,000,000"
等匹配
如果您查看数字规则,首先我测试一个减法符号'-'?
,然后我测试一到三个数字,然后我测试comma
和0的零个或多个组合三位数。
require 'treetop'
Treetop.load_from_string DATA.read
parser = PovParser.new
p parser.parse('1,000,000')
__END__
grammar Pov
rule numeric
'-'? digit 1..3 (comma space* (digit 3..3))*
end
rule digit
[0-9]
end
rule comma
','
end
rule space
[\s]
end
end