0

プロジェクトに pegjs パーサー ジェネレーターを使用していますが、一致してはならない単語のコレクションまで、すべての単語に一致する文法を作成するのに苦労しています。文字列 "the door is yellow" の例として、 is までのすべての単語を一致させたいので、単語 is から解析を開始するように pegjs パーサーに指示します。パーサーにブレークさせたい単語のコレクションは、「is」「has」および「of」です。

現在の文法規則は次のとおりです。

subject "sub" = 
s:[a-zA-Z ]+ { return s.join("").trim()}

パーサーが私のコレクションを単語に含めないようにするルックアヘッドを作成するにはどうすればよいですか?

(!of|is|has)
4

2 に答える 2

0

この質問が 5 年前に出されたものであることは知っていますが、[pegjs] タグ内の未回答の質問を片付けているところです。

postfixこれは機能しているようで、さらに処理するルールに置き換えるだけです。

subject "sub" =  prefix:prefix breakWord:breakWord postfix:postfix "\n"? {
  return { prefix: prefix, breakWord, postfix }
}

prefix = $(!breakWord .)* { return text().trim() }
postfix = [^\n]* { return text().trim() }

breakWord
  = "is"
  / "has"
  / "of"

「ドアは黄色です」の入力でこれを生成します。

{ prefix: "the door", breakWord: "is", postfix: "yellow" }

次の点に注意してください。

  • フォーム(!breakWord .)は少し遅いです。breakWordプレフィックスの各文字について、現在の入力が一連の代替語のいずれかで始まっていないことを確認するために先を見越します。
  • 一般的な文字セット (「is」と「isn't」など) で始まるブレーク ワードがある場合は、長い方の単語がbreakWord規則の最初にあることを確認してください。
  • 現在のpostfixルールは、改行が入力を終了する可能性があることを前提としています。
于 2021-12-07T18:53:27.210 に答える
-1

これはうまくいきます

.+(?=\s+(of|is|has))

前に空白がある「of」、「is」、または「has」 (正の先読みによる) に遭遇するまで、1 つ以上の任意の文字 (改行を除く) に一致します。

于 2016-01-05T23:41:23.780 に答える