我想要使用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
未声明。我可以处理这个问题?
答案 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 ~ ...