【问题标题】:Treetop ignore grammar rules树顶忽略语法规则
【发布时间】:2013-09-22 11:51:43
【问题描述】:

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

我错过了什么吗?

【问题讨论】:

    标签: ruby grammar peg treetop


    【解决方案1】:

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

    【讨论】:

    • 您能详细说明一下吗?逗号规则不应该匹配 '123,456' 和 '123, 456' 吗?
    • 不,comma 规则与 ',' 匹配,仅此而已。但这无论如何都完全无关紧要,因为该规则甚至没有在任何地方使用。这和定义一个子程序,从不调用它是一样的。
    【解决方案2】:

    就像 Jörg 提到的,您需要在语法中使用 commaspace 规则。我在下面构建了一个我认为您正在尝试完成的简单示例。它应该匹配"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
    

    【讨论】:

    • 没问题,很高兴能帮上忙 :)
    猜你喜欢
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多