2016-09-23 4 views
0

LOLCODEスクリプトをScalaパーサーコンビネータを使用して解析します。ここで私はこれまでで得たものである:スカラパーサーコンビネータ:失敗 - eol(行末)が必要です

class ValuePT(val value: String) extends ExpressionPT { 
    override def toString = value 
    } 

    def value: Parser[ValuePT] = (numericLit | stringLit) ^^ { 
    case a => new ValuePT(a) 
    } 
    def expression: Parser[ExpressionPT] = (...| id | value) ^^ { 
    case a => a 
    } 

    def statement: Parser[StatementPT] = (...|expression|...|loop) <~ eol ^^ {case a => a} 

    def condition: Parser[LoopConditionPT] = (value <~ "YR") ~ id ~ opt(("TIL"|"WILE") ~ expression) ^^ { 
    case a ~ b ~ Some(c ~ d) => new LoopConditionPT(a toString, b, Option(c -> d)) 
    case a ~ b ~ None => new LoopConditionPT(a toString, b, Option("None" -> new IdentPT("-1"))) 
    } 

    def loop: Parser[LoopPT] = ("IM IN YR" ~> id ~ opt(condition) <~ eol) ~ rep(statement) <~ "IM OUTTA YR" <~ id ^^ { 
    case a ~ b ~ c => new LoopPT(a, b, c) 
    } 

私のテストケースは次のようになります。

HAI 1.2 
    IM IN YR UntilLoop UPPIN YR Var TIL BOTH SAEM Var AN 3 
     VISIBLE "UntilLoop " Var 
    IM OUTTA YR UntilLoop 

    IM IN YR WhileLoop bla YR Var 
     VISIBLE "WhileLoop " Var 
    IM OUTTA YR WhileLoop 

    I HAS A x ITZ 1 
    I HAS A y ITZ 1 
    IM IN YR NestedLoop 
     IM IN YR InnerLoop 
      VISIBLE "NestedLoop " x " " y 
      GTFO 
     IM OUTTA YR InnerLoop 
     GTFO 
    IM OUTTA YR NestedLoop 
KTHXBYE 

しかし、私の機能は動作しません、それはエラーが発生します:

[2.24] failure: eol expected 

    IM IN YR UntilLoop UPPIN YR Var TIL BOTH SAEM Var AN 3 

        ^

私は理解していないと私は何が原因でエラーが発生するのかわからない、それは私が行方不明だったと言うのですUPPINの前にeol

答えて

0

コードから明らかなのはconditionが一致しないことです。これはパーサーの観点からはうまくいきません。opt(condition)です。しかし、それが失敗すると、それは次にeolを予期しています。

あなたが行の残りの部分と一致するようにconditionを期待しているように見えます。 eolにエラーが発生するため、最初のトークンでconditionが失敗することになります。それ以外の場合、Scalaはさらに進捗したブランチからエラーを報告していたはずです。 valueの定義がなければ、失敗している正確に何を伝えることは不可能ですが、optパーサをデバッグするための一般的なルールは例をテストするときoptを削除することです。この方法では、optを静かに何も一致させるのではなく、常にoptの内部からエラーが発生します。

関連する問題