2

ruby Treetop ライブラリを使用してスクリプトを開発していますが、正規表現の構文で問題が発生しています。まず、他の設定で機能する正規表現の多くは、treetop では同じようには機能しません。

これは私の文法です: (myline.treetop)

文法マイライン
    罫線
        文字列空白条件
    終わり
    ルール文字列
        [\S]*
    終わり
    ルール空白
        [\s]*
    終わり
    ルール条件
        「新しい」/「古い」/「中古」
    終わり
終わり

これは私の使用法です: (usage.rb)

「ルビジェム」が必要
「梢」が必要
「多言語」が必要
「マイライン」が必要

パーサー = MyLineParser.new
p parser.parse("新しいランダム文字列"​​)

これにより、新しい単語が確実に検出されるはずです。入力文字列が「randomstring anotherstring new yetanother andanother」になり、ルール条件の正規表現の前後に任意の数の文字列の後に空白 (タブを含む) が続く場合に新しいものを見つけることができるように拡張するつもりはありません。つまり、「new」などの単語を含む文を渡すと、一致するはずです。

では、文法を次のように変更するとします。

罫線
    文字列空白条件空白文字列
終わり

次に、次の一致を見つけることができるはずです。

p parser.parse("randomstring new anotherstring")

では、条件の前後に文字列の空白を繰り返せるようにするにはどうすればよいでしょうか? これを書き込もうとすると:

罫線
    (文字列空白)* 条件 (空白文字列)*
終わり

、無限ループに入ります。上記の () を [] に置き換えると、nil が返されます。一般に、正規表現は上記を使用すると一致を返しますが、ツリートップの正規表現は一致しません。これについてのヒントやポイントはありますか?さらに、treetop のドキュメントはあまりなく、例は単純すぎるか複雑すぎるため、treetop のより完全なドキュメント/ガイドを知っている人はいますか?

4

2 に答える 2

1

あなたが求めていることをするのに文法さえ必要ないようです。この場合、単純な正規表現で十分です。

line.match(/(.*)\s(new|old|used)\s(.*)/)

(例: http://rubular.com/r/Kl8rUifxeu )

条件の前後のものを含む配列を取得するには、次のようにします。

Regexp.last_match(1).split + Regexp.last_match(3)

そして、次の条件をテストします。

return "Sweet, it's new!" if Regexp.last_match(2) == "new"
于 2010-03-15T11:23:11.887 に答える
0

これはツリートップとは何の関係もなく、あなたの文法と関係があります。条件ルールは文字列ルールと完全に一致するため、(string whitespace)*繰り返しから条件を破るとあいまいになります。行の規則を整理して、明確な文法を使用すれば問題ありません。条件のようなもの/属性がそのようにタグ付けされるようにしたいかもしれません:

cond:new

これは文字列規則とは字句的に異なります。

于 2010-03-09T09:53:48.507 に答える