0

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)之后”

我错过了什么吗?

4

2 回答 2

1

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

于 2013-09-22T23:56:57.030 回答
0

就像 Jörg 提到的,你需要在语法中使用你的comma和规则。space我在下面构建了一个我认为您正在尝试完成的简单示例。它应该匹配"100", "1,000","1,000,000"等。

如果您查看数字规则,首先我测试减号'-'?,然后测试一到三位数字,然后测试零个或多个comma' 和三位数字的组合。

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
于 2013-09-25T14:41:49.883 回答