私は単純なSQLのような文字列を解析できるスカラーのパーサを構築しようとしています。私が働いて基礎を持っているし、何かに解析することができますスカラーの再帰構造を解析する
select id from users where name = "peter" and age = 30 order by lastname
をしかし、今私は、ネストされたとクラスを解析する方法を疑問に思い、すなわち
select name from users where name = "peter" and (age = 29 or age = 30)
私の「combinedPredicate」の現在の生産は次のようになります:
def combinedPredicate = predicate ~ ("and"|"or") ~ predicate ^^ {
case l ~ "and" ~ r => And(l,r)
case l ~ "or" ~ r => Or(l,r)
}
combinedPredicateプロダクション自体を再帰的に参照しようとしましたが、その結果スタックオーバーフローが発生します。
ところで、私はちょうど全体のANSI-99仕様を実装していない...ここで実験しています;)
"lazy val"については、明示的な型宣言を ":Parser [Any]"から ":PackratParser [Any]"に変更して新しいpackrat機能を使用することもお勧めします。 (あなたが私の質問で指摘したようにhttp://stackoverflow.com/questions/3343697/scala-parser-combinators-tricks-for-recursive-bnf) – svrist