使用Scala的解析器组合器匹配带有值的标记

时间:2014-08-13 19:14:07

标签: scala parsing parser-combinators

我想要使用Scala util.parsing.combinator.Parsers解析一种令牌。我的代币 class看起来像这样:

abstract class Token ()

case class T_Semicolon () extends Token {} // represents ;                                                                                                                            
case class T_LeftBracket () extends Token {} // represents (                                                                                                                          
....                                                                                                          
case class T_Identifier ( s : String ) extends Token {}
case class T_Integer ( n : Int ) extends Token {}

我想用通常的~ ~> <~ | ...组合器构建一个Scala解析器 如下。

object StandAloneParser extends Parsers {

   import Token._
   override type Elem = Token

   val prog = rep1 ( dec )
   val dec = T_Def () ~> T_Identifier ( id ) ~ ...

但是模式匹配不允许我匹配T_Identifier ( id )因为变量 id未声明。我可以处理这个问题?

1 个答案:

答案 0 :(得分:1)

你的例子不是很清楚,但我认为你想要这样的事情:

lazy val identifier: Parser[String] =
  acceptMatch("identifier", { case T_Identifier(id) => id })

另请注意,我使用lazy val而非val。由于解析器往往具有很多相互依赖性,甚至可能是递归的,因此这通常是一个好主意。

然后您在identifier解析器中使用dec解析器:

lazy val dec = T_Def () ~> identifier ~ ...