Расшифровка Scala ошибок при возврате функций из функций - PullRequest
1 голос
/ 29 апреля 2020

Я пытаюсь создать синтаксический анализатор basi c в Scala и при попытке скомпилировать с ним самый базовый синтаксический анализатор c (синтаксический анализатор буквы 'A') получаю три синтаксические ошибки от scalac которого я не понимаю. Я смотрю на свой код и не могу понять, какие части синтаксиса являются неправильными, даже при сравнении с примерами в Интернете. Может кто-нибудь объяснить, какие части моего Scala кода неправильны здесь?

Код:

import lexer
import scala.Option

object Main {
  def main(args: Array[String]) {
    val Lexer = new lexer.Lexer
    val tokens = Lexer.lex(args(0))
    val parseA = satsify(t => t.key == "A")
    println(parseA(tokens))
  }

  def satsify(predicate: Token => Bool): List(Token) => Option[(Token, List(Token))] = {
    tl: List(Token) => match tl { 
        case tl.isEmpty => None 
        case predicate(tl(0)) => Some(tl(0), tl.tail)
        case _ => None
    }
  }
}

Ошибки:

combParser.scala:2: error: '.' expected but ';' found.
import scala.Option
^
combParser.scala:12: error: '=' expected but '(' found.
  def satsify(predicate: Token => Bool): List(Token) => Option[(Token, List(Token))] = {
                                             ^
combParser.scala:19: error: illegal start of simple expression
}
^
three errors found

1 Ответ

2 голосов
/ 29 апреля 2020

Синтаксических ошибок довольно много, в основном

  • конструктор типа принимает параметры типа в квадратных скобках, поэтому List[Token] вместо List(Token)
  • защищает внутри сопоставления с образцом не может использоваться напрямую, поэтому case v if predicate(tl(0)) => вместо case predicate(tl(0)) =>

Принимая во внимание вышесказанное, попробуйте

  def satsify(predicate: Token => Boolean): List[Token] => Option[(Token, List[Token])] = {
    (tl: List[Token]) => tl match {
      case Nil => None
      case head :: tail if predicate(head) => Some(head, tail)
      case _ => None
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...