Использование Scala встроенного синтаксического анализатора для разбора базового c кода MIPS - PullRequest
1 голос
/ 15 апреля 2020

Я пытаюсь использовать scala.util.parsing.combinator для анализа некоторого кода MIPS, и мой код работает для каждого элемента (например, метка, инструкция, директива и т. Д. c), но он не работает для нескольких элементов / строк. Я думаю, что регулярное выражение-разделитель, которое я передаю функции 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")
    }
  }

URL репозитория

1 Ответ

1 голос
/ 15 апреля 2020

Похоже, вы используете scala.util.parsing.combinator.RegexParsers, и по умолчанию пропускаются пробелы. Вы должны переопределить это

  override def skipWhitespace = false
...