SCALA:如何将 Parser Combinator 结果转换为 Scala List[String]?

SCALA: How to convert a Parser Combinator result to Scala List[String]?

我正在尝试为一种与 Milner 的 CCS 非常相似的语言编写解析器。到目前为止我正在解析的基本上是以下类型的表达式:

表达式必须以字母(不包括 t)开头,第一个字母后可以有任意数量的字母(以“.”分隔)。表达式必须以数字结尾(为简单起见,我现在选择 0 到 2 之间的数字)。我想为 Scala 使用 Parser Combinators,但这是我第一次使用它们。这是我目前所拥有的:

import scala.util.parsing.combinator._

class SimpleParser extends RegexParsers {
  def alpha: Parser[String] = """[^t]{1}""".r ^^ { _.toString }
  def digit: Parser[Int] = """[0-2]{1}""".r ^^ { _.toInt }

  def expr: Parser[Any] = alpha ~ "." ~ digit ^^ {
    case al ~ "." ~ di => List(al, di)
  }

  def simpleExpression: Parser[Any] = alpha ~ "." ~ rep(alpha ~ ".") ~ digit //^^ {  }
}

正如您在 def expr :Parser[Any] 中看到的那样,我正在尝试 return 作为列表的结果,因为 Scala 中的列表非常易于使用(在我看来)。这是将 Parser[Any] 结果转换为列表的正确方法吗?谁能给我一些关于如何为 def simpleExpression:Parser[Any].

做这件事的提示

我想使用列表的主要原因是因为在解析和表达式之后我希望能够使用它。例如,给定表达式 a.b.1,如果给我一个 'a',我想消费以新表达式结尾的表达式:b.1(即 a.b.1 ->(a)-> b.1).这背后的想法是模拟有限状态自动机。任何有关我如何改进我的实施的提示都将受到赞赏。

为了保证类型安全,我推荐一个解析器,它生成一个字符串列表和一个 int 的元组。也就是说,输入 a.b.a.1 将被解析为 (List("a", "b", "a"), 1)。另请注意,alpha 的正则表达式已修改为排除任何非小写字母(除了 t)。

class SimpleParser extends RegexParsers {
  def alpha: Parser[String] = """[a-su-z]{1}""".r ^^ { _.toString }
  def digit: Parser[Int] = """[0-2]{1}""".r ^^ { _.toInt }

  def repAlpha: Parser[List[String]] = rep1sep(alpha, ".")

  def expr: Parser[(List[String], Int)] = repAlpha ~ "." ~ digit ^^ {
    case alphas ~ _ ~ num =>
      (alphas, num)
  }
}

使用此 SimpleParser 的实例,这是我得到的输出:

println(parser.parse(parser.expr, "a.b.a.1"))
// [1.8] parsed: (List(a, b, a),1)

println(parser.parse(parser.expr, "a.0"))
// [1.4] parsed: (List(a),0)