正規表現を超えて文字の内容を確認する場合は、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))
私はまったく同じ問題を抱えており、パーザを明示的に失敗させたいと思います。 Nothing-typeが何にも対応していない場合、どのように失敗を使用するのでしょうか? – hotzen