2011-02-08 17 views
8

に失敗します入力。しかし、今起こるのは、値が見つからないときにマップがスローされるということです。ので、私はこのようなものを持っている

私はこのようなstored_valを実装してみました:

def stored_val = ident => { 
    case k => if (m.contains(k)) m(k) else failure("identifier not found") 
} 

しかし、それに伴う問題は、障害が文字列とは異なるタイプであるパー​​サ[何も]を返します。

+1

私はまったく同じ問題を抱えており、パーザを明示的に失敗させたいと思います。 Nothing-typeが何にも対応していない場合、どのように失敗を使用するのでしょうか? – hotzen

答えて

3

正規表現を超えて文字の内容を確認する場合は、StandardTokenParserをチェックしてください。特に、入力p(e)が真である要素e'で始まる場合 elem(kind, p)が成功した所定の述語を満たす入力要素に一致

def elem (kind: String, p: (Elem) ⇒ Boolean) : Parser[Elem] 

パーサ。

編集:標準のトークンパーサの例については 、Scala Parser CombinatorsのジムMcBeathの記事をチェックしてください。 elemを実証するために、最初の例を簡単に修正しました。これは、奇数のみの合計を取る簡単なパーサです:

import scala.util.parsing.combinator.syntactical._ 
import scala.util.parsing.combinator._ 

trait Expression 
case class EConstant(value: Int) extends Expression 
case class EAdd(lhs: Expression, rhs: Expression) extends Expression 

object ExpressionParser extends StandardTokenParsers { 
    lexical.delimiters ++= List("+") 

    def oddValue = elem("odd", { x => x.toString.toInt % 2 == 1 }) ^^ { 
    x => EConstant(x.toString.toInt) } 
    def value = numericLit ^^ { x => EConstant(x.toInt) } 

    def sum = oddValue ~ "+" ~ oddValue ^^ { case left ~ "+" ~ right => 
      EAdd(left, right) } 

    def expr = (sum | value) 

    def parse(s:String) = { 
    val tokens = new lexical.Scanner(s) 
    phrase(expr)(tokens) 
    } 

    def apply(s:String): Expression = parse(s) match { 
    case Success(tree, _) => tree 
    case e: NoSuccess => 
     throw new IllegalArgumentException("Bad syntax: "+s) 
    } 
} 

保存ExpressionParser.scala上記のように、次のようにREPLにロード:

あなたは部分関数を受け入れる ^?コンビネータを使用することができます
scala> :l ExpressionParser.scala  
Loading ExpressionParser.scala... 
import scala.util.parsing.combinator.syntactical._ 
import scala.util.parsing.combinator._ 
defined trait Expression 
defined class EConstant 
defined class EAdd 
defined module ExpressionParser 

scala> ExpressionParser("2 + 2") 
java.lang.IllegalArgumentException: Bad syntax: 2 + 2 
    at ExpressionParser$.apply(<console>:42) 
    at .<init>(<console>:24) 
    at .<clinit>(<console>) 
    at RequestResult$.<init>(<console>:9) 
    at RequestResult$.<clinit>(<console>) 
    at RequestResult$scala_repl_result(<console>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$17.apply(Interpreter.scala:988) 
    at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$17.apply(Interpreter.scala:988) 
    at scala.util.con... 
scala> ExpressionParser("1 + 1") 
res3: Expression = EAdd(EConstant(1),EConstant(1)) 
+0

@ケビンは言った - 私はその方法を見ましたが、私はそれをどのように使うべきか正確には分かりませんでした。あなたは小さな例を挙げることができますか?基本的には、m.contains(k)== trueの場合、述語がtrueを返すようにします。 – jjnguy

+0

私はその方法を見ましたが、私はそれをどう使うべきか正確には分かりませんでした。あなたは小さな例を挙げることができますか?基本的には、m.contains(k)== trueの場合、述語がtrueを返すようにします。 –

関連する問題