使用 Scala 内置的解析器组合器解析基本的 MIPS 代码
Using Scala built-in parser combinator to parse basic MIPS code
我正在尝试使用 scala.util.parsing.combinator
来解析一些 MIPS 代码,我的代码适用于每个项目(即标签、指令、指令等),但它不适用于多个 items/lines。我认为我传递给 repsep
函数的分隔符正则表达式不起作用。
例如,我可以解析标签 str:
但我无法解析 str: .asciiz "Hello world!"
def directive: Parser[Token] = Text.parse ||| Word.parse ||| Data.parse ||| Ascii.parse ||| Asciiz.parse
def instruction: Parser[Token] = LoadAddress.parse ||| LoadImmediate.parse ||| Move.parse ||| Label.parse
def misc: Parser[Token] = Label.parse ||| Comment.parse ||| Syscall.parse
def item: Parser[Token] = directive ||| instruction ||| misc
// this line I think is the problem ...
def program: Parser[Seq[Token]] = repsep(item, """[\s\t\n]+""".r) ^^ { _.toList }
def parseCode(code: Reader[Char]): Seq[Token] = {
parse(program, code) match {
case Success(matched, _) => matched
case Failure(msg, _) => throw new Exception(s"FAILURE: $msg")
case Error(msg, _) => throw new Exception(s"ERROR: $msg")
}
}
您似乎在使用 scala.util.parsing.combinator.RegexParsers
,它默认会跳过空格。你应该覆盖它
override def skipWhitespace = false
我正在尝试使用 scala.util.parsing.combinator
来解析一些 MIPS 代码,我的代码适用于每个项目(即标签、指令、指令等),但它不适用于多个 items/lines。我认为我传递给 repsep
函数的分隔符正则表达式不起作用。
例如,我可以解析标签 str:
但我无法解析 str: .asciiz "Hello world!"
def directive: Parser[Token] = Text.parse ||| Word.parse ||| Data.parse ||| Ascii.parse ||| Asciiz.parse
def instruction: Parser[Token] = LoadAddress.parse ||| LoadImmediate.parse ||| Move.parse ||| Label.parse
def misc: Parser[Token] = Label.parse ||| Comment.parse ||| Syscall.parse
def item: Parser[Token] = directive ||| instruction ||| misc
// this line I think is the problem ...
def program: Parser[Seq[Token]] = repsep(item, """[\s\t\n]+""".r) ^^ { _.toList }
def parseCode(code: Reader[Char]): Seq[Token] = {
parse(program, code) match {
case Success(matched, _) => matched
case Failure(msg, _) => throw new Exception(s"FAILURE: $msg")
case Error(msg, _) => throw new Exception(s"ERROR: $msg")
}
}
您似乎在使用 scala.util.parsing.combinator.RegexParsers
,它默认会跳过空格。你应该覆盖它
override def skipWhitespace = false