単純なSQLのような文字列を解析できるscalaでパーサーを構築しようとしています。基本が機能していて、次のように解析できます。
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仕様全体を実装していません;)