/
EugenyCh7
/
JavaAndScalaLessons
Обзор
Документация
Войти
/
EugenyCh7
/
JavaAndScalaLessons
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
ScalaTest/src/ExPackratParser.scala
70 строк
2 KB
Eugeny Chekmarev
right whiteSpace
20 июн 2021, 21:00
20 июн 2021, 21:00
b6ceb6c
Код
Авторство
О чём код?
import scala.util.matching.Regex import scala.util.parsing.combinator.{PackratParsers, RegexParsers} import scala.util.parsing.input.CharSequenceReader object ExPackratParser extends App { class ExprParser extends RegexParsers with PackratParsers { val number: PackratParser[Double] = "[+-]?[0-9]+".r ^^ (_.toDouble) lazy val atom: PackratParser[Double] = { "(" ~> expr <~ ")" | number } lazy val power: PackratParser[Double] = { atom ~ rep("^" ~> atom) ^^ { case first ~ list => (first :: list).foldRight(1.0)(Math.pow) } } lazy val mul: PackratParser[Double] = { power ~ rep(("*" | "/") ~ power) ^^ { case first ~ list => list.foldLeft(first)((result, next) => { next match { case "*" ~ x => result * x case "/" ~ x => result / x } }) } } lazy val expr: PackratParser[Double] = { mul ~ rep(("+" | "-") ~ mul) ^^ { case first ~ list => list.foldLeft(first)((result, next) => { next match { case "+" ~ x => result + x case "-" ~ x => result - x } }) } } def parseAll[T](p: Parser[T], input: String): ParseResult[T] = { phrase(p)(new PackratReader(new CharSequenceReader(input))) } override val whiteSpace: Regex = "[ \t]".r } List( "10 - 9 + 8 - 7 + 6 - 5", "2 * 3 * 4", "1 / 2 / 3", "100 + (2 + 3) - (12 + 13)", "(1 + 1 + 1) / (2 + 2 + 2) / (4)", "4 ^ 3 ^ 2", "(2 * 4 / 2) ^ ((1 + 1) / 2 * 3) ^ (1 * 1 + 0 + 1)", "-100", "-100 - 100" ).foreach(input => { val parser = new ExprParser val result = parser.parseAll(parser.expr, input) print(s"$input -> ") if (result.successful) println(result.get) else println("<fail>") }) }