Компиляция и запуск функций по имени в 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. Таким образом, ошибка, скорее всего, в вашей локальной конфигурации.