0

次のような単純な文法設定があります。

文法テスト
   罫線
      (形容詞/形容詞ではない)* {
         定義内容
             elements.map{|e| e.コンテンツ}
         終わり
      }
   終わり
   ルール形容詞
      (「良い」/「悪い」/「素晴らしい」) {
          定義内容
              [:形容詞, テキスト値]
          終わり
      }
   終わり
   ルール not_adjective
      !形容詞 {
          定義内容
              [:not_adjective, text_value]
          終わり
      }
   終わり
終わり

私の入力が「これはいいボールだ。使おう」だとしましょう。これによりエラーが発生しますが、最初になぜそれが間違っているのかについての理論を理解したいので、今は言及していません。では、ルールの形容詞に一致しないものすべてに一致するようにルール not_adjective を作成するにはどうすればよいでしょうか? 一般に、別の名前付きルールと「一致しない」ルールを (具体的には Treetop で) どのように記述すればよいですか?

4

2 に答える 2

1

Treetop は、Parsing Expression Grammars または PEGと呼ばれる特別なクラスの文法からパーサーを生成するパーサー ジェネレーターです。 の操作上の解釈は、失敗した場合は成功し、成功した場合は失敗しますが、入力を消費しません。 ルールが一致しないものに一致させるには、ドット演算子 (すべてに一致する) を否定演算子と組み合わせて使用​​して、特定の「単語」を回避します。
!expressionexpressionexpression
expression

( !expression . )* ie. "match anything BUT expression"
于 2010-03-09T20:08:29.463 に答える
1

前の回答は、形容詞までの個々の文字の任意のシーケンスに一致するため、OP の質問には正しくありません。したがって、文字列 xyzgood が表示された場合、それは xyz と一致し、次のルールは形容詞としての「良い」部分と一致します。同様に、OP の形容詞ルールは、「badge」の最初の 3 文字を形容詞「bad」と一致させますが、これは彼らが望んでいるものではありません。

代わりに、形容詞規則は次のようになります。

rule adjective
  a:("good" / "bad" / "excellent") ![a-z] {
    def content
      [:adjective, a.text_value]
    end
  }
end

そして、次のような not_adjective ルール:

rule not_adjective
  !adjective w:([a-z]+) {
    def content
      [:not_adjective, w.text_value]
    end
  }
end

必要に応じて、大文字、ハイフネーション、アポストロフィなどの処理を含めます。もちろん、空白の処理も必要です。

于 2015-05-06T01:59:48.540 に答える