Ruby 树梢忽略语法规则

Ruby 树梢忽略语法规则,ruby,grammar,peg,treetop,Ruby,Grammar,Peg,Treetop,Treetop似乎忽略了第一条规则之后的turther规则,并且无法解析与语法文件上的第一条规则不匹配的任何内容。 我已经尝试交换规则的顺序,但仍然只考虑第一个 # grammar_pov.treetop grammar Pov rule numeric '-'? [0-9]+ ('.' [0-9]+)? <::PovFabric::Nodes::NumericLiteral> end rule comma ',' en

Treetop似乎忽略了第一条规则之后的turther规则,并且无法解析与语法文件上的第一条规则不匹配的任何内容。 我已经尝试交换规则的顺序,但仍然只考虑第一个

# grammar_pov.treetop
grammar Pov
    rule numeric
        '-'? [0-9]+ ('.' [0-9]+)? <::PovFabric::Nodes::NumericLiteral>
    end
    rule comma
        ','
    end
    rule space
        [\s]+
    end
end
#语法#pov.treetop
语法视角
规则数字
'-'? [0-9]+ ('.' [0-9]+)? 
结束
规则逗号
','
结束
规则空间
[\s]+
结束
结束
此语法文件匹配所有整数和浮点,但不匹配“123、456”或“123456” parser failure_reason属性表示“预期-在第1行第1列(字节1)后面”


我遗漏了什么吗?

你的
逗号和
空格规则没有在任何地方使用。所以,它们只是死代码。

就像Jörg提到的那样,您需要在语法中使用
逗号
空格
规则。我在下面构建了一个简单的示例,我认为您正试图实现以下目标。它应该匹配
“100”
“1000”
“1000000”
,等等

如果你看数字规则,首先我测试减法符号
“-”?
,然后测试一到三个数字,然后测试零个或多个
逗号和三个数字的组合

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

你能详细说明一下吗?逗号规则不应该匹配“123456”和“123456”?不,逗号规则匹配“code>”、“
”和其他规则。但无论如何,这是完全不相关的,因为这条规则甚至没有在任何地方使用。这与定义一个子例程而从不调用它是一样的。没问题,很高兴我能帮上忙:)