树顶忽略语法规则

时间:2013-09-22 11:51:44

标签: ruby grammar peg treetop

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列)之后'

我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

您的commaspace规则不会在任何地方使用。所以,它们只是死代码。

答案 1 :(得分:0)

与Jörg提到的一样,您需要在语法中使用commaspace规则。我建立了一个简单的例子,说明我认为你在下面要完成的事情。它应与"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