質問

以下のように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

パーサーが戻ってくると思います 文字列ノード しかし、パーサーのように見えます 理解できませんでした 入力。どんなアイデアも感謝しています。

役に立ちましたか?

解決

ツリートップ(および一般的にペグ)では、選択オペレーターは 順序付けられました, 、他のほとんどの解析形式とは異なります。

だから、で

rule value
  number / string
end

あなたはツリートップにあなたを言っています 好む number 以上 string.

あなたの入力は始まります 1, 、一致します 両方とも numberstring (終えた word)、しかし、あなたはTreetopにそれを好むように言った number 解釈、それがそれをaとして解析します number. 。それが来るとき a 入力には、適用するルールがなく、何も返されません(nil)、TreeTopでは、入力ストリーム全体を消費しないことはエラーだからです。

選択の順序を単純に逆転させると、入力全体が string aの代わりに 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"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top