次のようなパーサーの例を考えてみましょう:
object TestParser extends RegexParsers {
override protected val whiteSpace = """[ \t]*""".r
def eol = """(\r?\n)+""".r
def item = "[a-zA-Z][a-zA-Z0-9-]*".r
def list = "items:" ~> rep1sep(item,",")
def constraints = "exclude:" ~> item
def itemsDefinition = (rep1sep(list, eol) ~ repsep(constraints,eol))
}
この入力を解析しようとすると (2 行が含まれていない場合、exclude は正常に動作します):
items: item1, item2, item3, item3, item4
items: item2, item3, item3, item5, item4
items: item4, item5, item6, item10
items: item1, item2, item3
exclude: item1
exclude: item2
次のエラーが表示されます。
[5.5] failure: `items:' expected but `e' found
exclude: item1
^
問題は次の行で明らかです。
def itemsDefinition = (rep1sep(list, eol) ~ repsep(constraints,eol))
うまくいかない理由とは。バックトラックと何か関係がありますか?それを機能させるには、どのような代替手段が必要ですか?