2

私はツリートップを学ぼうとしていて、名前を解析するためにhttps://github.com/survival/lordbishopからほとんどのコードを取得していて、そこから構築するつもりでした。

ruby コマンドラインではなく、Rails でビルドしているため、私の構造は少し異なります。

非常に単純な解析を実行すると、スペースで解析エラーが返されます (これは私の文法ではより単純なものの 1 つです。何が間違っているのでしょうか?

私のモデルでは、私のコードはかなり単純です

「梢」が必要
「多言語」が必要

「文法/名前」が必要

クラス名
      def self.parse(データ)
           パーサー = FullNameParser.new
           ツリー = パーサー.parse(データ)
           もしtree.nilなら?
              return "オフセットでの解析エラー: #{parser.index}"
           終わり
           result_hash = {}
           tree.value.each do |ノード|
              result_hash[node[0] = node[1].strip if node.is_a?(配列) && !node[1].blank?
           終わり
           result_hash を返す
      終わり
終わり

文法のほとんどを削除して、単語とスペースを取得するだけにしました

文法フルネーム
    ルールワード
        [^\s]+ {
        デフォルト値
            テキスト値
        終わり
        }
    終わり

    ルール
        [\s]+ {
        デフォルト値
            ""
        終わり
        }
    終わり
終わり

「john smith」を解析しようとしています。単語とスペースを取得して、そこからロジックを構築することを望んでいましたが、この単純なレベルでも立ち往生しています。助言がありますか??

4

1 に答える 1

3

私の知る限り、treetop は文法の最初のルール (wordあなたの場合はルール!) で解析を開始します。ここで、入力した場合'John Smith'(つまりword、 、sword)、最初にルールに一致した後に解析を停止しますword。そして、最初のssincewordが一致しない場合にエラーを生成しますs

名前全体を説明する規則を文法の先頭に追加する必要があります。つまり、単語の後にスペースが続き、単語が続きます。

grammar FullName

  rule name
    word (s word)* {
      def value
        text_value
      end
    }
  end

  rule word
    [^\s]+ {
      def value
        text_value
      end
    }
  end

  rule s
    [\s]+ {
      def value
        text_value
      end
    }
  end

end

スクリプトによる簡単なテスト:

#!/usr/bin/env ruby

require 'rubygems'
require 'treetop'
require 'polyglot'
require 'FullName'

parser = FullNameParser.new
name = parser.parse('John Smith').value
print name

印刷されます:

John Smith
于 2011-07-22T11:55:06.087 に答える