1

私はこれを機能させようとしています:

def emptyCond: Parser[Cond] = ("if" ~ "(") ~> regularStr <~ ")" ^^ { case s => Cond("",Nil,Nil) }

ここで、regularStrは、")" を含む多くのものを受け入れるように定義されています。もちろん、これを受け入れ可能な入力にしたい: if(foo())。しかし、任意のif(x)については、 regularStrの一部として ")" を使用しているため、このパーサーは決して成功しません。

私は何が欠けていますか?

編集

regularStr は正規表現ではありません。次のように定義されます。

  def regularStr = rep(ident | numericLit | decimalLit | stringLit | stmtSymbol) ^^ { case s => s.mkString(" ") }

記号は次のとおりです。

  val stmtSymbol = "*" | "&" | "." | "::" | "(" | ")" | "*" | ">=" | "<=" | "=" | 
               "<" | ">" | "|" | "-" | "," | "^" | "[" | "]" | "?" | ":" | "+" |
               "-=" | "+=" | "*=" | "/=" | "&&" | "||" | "&=" | "|="

徹底的な言語チェックは必要ありません。制御構造だけが必要です。したがって、if() の "()" の内容はあまり気にしません。識別子、記号などの任意のシーケンスを受け入れたいと考えています。 " は if の "条件" です。

4

2 に答える 2

7

(...)正規表現は、[...]、 、などのネストされたバランスのとれた構造を持つ言語を認識できません。そのため、その部分{...}を一致させるには、(正規表現ではなく) コンテキストフリーのプロダクションをさらに使用する必要があります。regularStr

于 2010-05-23T21:32:36.407 に答える
0

OK、if()))を受け入れることは実際には要件ではなく、制御構造のキャプチャについて心配するだけで、解析を可能な限り安価にするために受け入れることをいとわない例にすぎません。

しかし、私はそれほど安くはなく、それでも機能しているようです。したがって、if()構造には括弧が付いているので、私がしなければならないのは、内部にあるものがバランスの取れた括弧を持つことを期待することだけです。予期されていない終了")"は、条件の一部にすることはできません。

これは私がしました:

  val regularNoParens = ident | numericLit | decimalLit | stringLit | stmtSymbol 
  def regularParens: Parser[String] = "(" ~ rep(regularNoParens | regularParens) ~ ")" ^^ { case l ~ s ~ r => l + s.mkString(" ") + r } 
  def regularStr = rep(regularNoParens | regularParens) ^^ { case s => s.mkString(" ") }

そして、stmtSymbolから「(」と「)」を取り出しました。動作します!

編集:ネストをサポートしていなかったので、修正しました。

于 2010-05-25T20:15:47.197 に答える