Компиляция и запуск функций по имени в Scala?

Продолжая в этой магистерской диссертации[1] изучить синтаксический анализ в Scala, но не может понять, как заставить этот пример работать (см. стр. 28-29):

import util.parsing.combinator.JavaTokenParsers

trait ArithParser extends JavaTokenParsers {
    def expr: Parser[Any] = term ~ rep("+" ~ term | "-" ~ term)
    def term              = factor ~ rep("*" ~ factor | "/" ~ factor)
    def factor            = floatingPointNumber ^^ {_.toDouble} | "(" ~> expr <~ ")"
}

object ArithParserCLI extends ArithParser {
    def main(args: Array[String]) {
        for (arg <- args) {
            println("Input: " + arg)
            println("Output: " + parseAll(expr, arg))
        }
    }
}

[1] Э. Лабун, "Разбор комбинатора в Scala", Technische Hochschule Mittelhessen, 2012.

К сожалению, я не могу заставить его работать ни в Scala 2.9.3, ни в Scala 2.11.0-M4:

> scala29 ArithParserCLI "10.5 - 4*2"
Exception in thread "main" java.lang.RuntimeException: Cannot figure out how to
run target: ArithParserCLI
        at scala.sys.package$.error(package.scala:27)
        at scala.tools.nsc.GenericRunnerCommand.scala$tools$nsc$GenericRunnerCommand$$guessHowToRun(GenericRunnerCommand.scala:38)
        at scala.tools.nsc.GenericRunnerCommand$$anonfun$2.apply(GenericRunnerCommand.scala:48)
        at scala.tools.nsc.GenericRunnerCommand$$anonfun$2.apply(GenericRunnerCommand.scala:48)
        at scala.Option.getOrElse(Option.scala:108)
        at scala.tools.nsc.GenericRunnerCommand.<init>(GenericRunnerCommand.scala:48)
        at scala.tools.nsc.GenericRunnerCommand.<init>(GenericRunnerCommand.scala:17)
        at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:33)

        at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:89)
        at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

Итак, попробуем с 2.11 скаляр и скала:

> scala ArithParserCLI "10.5 - 4*2"
No such file or class on classpath: ArithParserCLI

2 ответа

В вашем коде нет ничего плохого - вы действительно его компилируете scalac перед запуском?

 scalac ArithParserCLI.scala  # or whatever your source file is named
 scala ArithParserCLI "10.5 - 4*2"

Кроме того, если вы планируете заняться каким-либо значительным кодированием в Scala theb sbt настоятельно рекомендуется. Вы можете запустить следующий код в sbt также:

 # Assuming the current directory contains only one scala source file with a 
 # main method:
 sbt 'run "10.5 - 4*2"'

На самом деле, я просто взял исходный код без каких-либо изменений и сделал следующее:

[root@centos scala]# scalac parser.scala
[root@centos scala]# scala ArithParserCLI "10.5 - 4*2"
Input: 10.5 - 4*2
Output: [1.11] parsed: ((10.5~List())~List((-~(4.0~List((*~2.0))))))

Scala версия 2.9.2. Таким образом, ошибка, скорее всего, в вашей локальной конфигурации.

Другие вопросы по тегам