2010-12-22 51 views
1

我已经定义了简单的语法来解析字符串和数字使用树梢如下。Treetop红宝石分析器 - 无法解析订购选择

grammar Simple 
    rule value 
     number/string 
    end 

    rule string 
     word space string 
     /
     word 
    end 

    rule word 
     [0-9a-zA-Z]+ 
    end 

    rule number 
     [1-9] [0-9]* 
    end 

    rule space 
     ' '+ 
    end 
end 

红宝石:

parser = SimpleParser.new 
parser.parse('123abc wer') # => nil 

我希望解析器返回串节点,但看起来像解析器看不惯输入。任何想法将不胜感激。

回答

4

在Treetop(和实际上一般的PEGs)中,选择运算符是,它与大多数其他解析形式不同,它的顺序是

所以,在

rule value 
    number/string 
end 

你告诉树顶,你喜欢numberstring

您的输入与1开始,它匹配numberstring(通过word),但你告诉树顶更喜欢number解释,所以将其解析为number。当涉及到输入中的a时,它没有更多的规则可以应用,因此它不会返回任何内容(nil),因为在Treetop中,不消耗整个输入流是错误的。

如果单纯反向选择的顺序,整个投入将解释为一个string代替number

SyntaxNode+String0 offset=0, "123abc wer" (word,space,string): 
    SyntaxNode offset=0, "123abc": 
    SyntaxNode offset=0, "1" 
    SyntaxNode offset=1, "2" 
    SyntaxNode offset=2, "3" 
    SyntaxNode offset=3, "a" 
    SyntaxNode offset=4, "b" 
    SyntaxNode offset=5, "c" 
    SyntaxNode offset=6, " ": 
    SyntaxNode offset=6, " " 
    SyntaxNode offset=7, "wer": 
    SyntaxNode offset=7, "w" 
    SyntaxNode offset=8, "e" 
    SyntaxNode offset=9, "r" 

或者,你可以保持这个顺序,因为它是,但允许value规则匹配多次。请插入这样一个新的顶级规则:

rule values 
    value+ 
end 

或修改value规则是这样的:

rule value 
    (number/string)+ 
end 

,这将给你一个AST大致是这样的:

SyntaxNode offset=0, "123abc wer": 
    SyntaxNode+Number0 offset=0, "123": 
    SyntaxNode offset=0, "1" 
    SyntaxNode offset=1, "23": 
     SyntaxNode offset=1, "2" 
     SyntaxNode offset=2, "3" 
     SyntaxNode+String0 offset=3, "abc wer" (word,space,string): 
     SyntaxNode offset=3, "abc": 
      SyntaxNode offset=3, "a" 
      SyntaxNode offset=4, "b" 
     SyntaxNode offset=5, "c" 
    SyntaxNode offset=6, " ": 
     SyntaxNode offset=6, " " 
    SyntaxNode offset=7, "wer": 
     SyntaxNode offset=7, "w" 
     SyntaxNode offset=8, "e" 
     SyntaxNode offset=9, "r" 
+0

谢谢Jörg, 是的,你是对的。我更愿意将数字与值规则中的字符串进行匹配。我怎么能“允许价值规则匹配多次”?为了得到上面的例子工作。 – lchanmann 2010-12-23 00:36:43