Scala:自定义语法/解析器组合器

时间:2017-10-18 02:13:33

标签: scala parsing grammar matching parser-combinators

我写了一个Scala程序,它从用户那里读取一个字符串,并使用递归下降解析器或解析器组合器来确定输入字符串是否与下面的语法匹配(即,由a和b组成),同时构建一路上的解析树。然后,如果匹配成功,则输出生成的树。

语法:

S -> E$
E -> C E2
E2 -> E
E2 -> NIL
C -> 'a' | 'b'

我对Scala相当新,所以任何阅读都会非常感激,如果您有任何想法,请告诉我如何实现这一点,谢谢。

这就是我目前的

我已经拥有的代码:

class MPParser extends JavaTokenParsers{
def c[C] = (“a” | “b”) ^^ {case ch => C(ch)}
}

abstract class MatchTree
case class C(s:String) extends MatchTree

输出应该如下所示:

scala> Microproject.main(Array("ababa"))
input : ababa
[1.6] parsed: S(E(C(a),E(C(b),E(C(a),E(C(b),E(C(a),NIL()))))))

 scala> Microproject.main(Array("ababac"))
 input : ababac
[1.6] failure: `b' expected but `c' found

ababac
^

1 个答案:

答案 0 :(得分:1)

制作规则spaces.query()看起来很奇怪。你的意思可能是def c[C] = ...

以下代码将向您展示如何使用def c: Parser[C] = ...定义生产规则和构建自定义分析树:

scala-parser-combinators

Live on Scastie