我正在寻找一个成熟的解析器库,用于Scala或Haskell.最重要的一点是,库可以处理歧义.如果表达式不明确,我想要每个可能的抽象语法树,它与表达式匹配.简单的例子:表达式a⊗b⊗c可以看作是(a⊗b)⊗c或⊗(b⊗c),我需要两种变体.谢谢!
所以我有这样的事情:
abstract class Term
case class App(f:Term,x:Term) extends Term
case class Var(s:String) extends Term
case class Amb(a:Term, b:Term) extends Term //ambiguity
Run Code Online (Sandbox Code Playgroud)
一个术语可能如下所示:
App(Var(f),Amb(Var(x),Amb(Var(y),Var(z))))
Run Code Online (Sandbox Code Playgroud)
所以我需要的是Amb类所指示的所有变体.这用于表示模糊的解析林,我想键入检查每个可能的变体并选择正确的变体.在这个例子中我需要:
App(Var(f),Var(x))
App(Var(f),Var(y))
App(Var(f),Var(z))
Run Code Online (Sandbox Code Playgroud)
什么是在scala中创建这些变体的最佳方法?效率会很好,但并不是真正的要求.如果可能的话,我喜欢不使用反射.
我在scala中为我的解析器编写了一个新的组合子.
它是^^组合子的变体,它传递位置信息.但访问输入元素的位置信息确实是性价比.
在我的情况下,解析一个大的例子需要大约3秒没有位置信息,它需要超过30秒.
我编写了一个可运行的示例,其中运行时在访问位置时大约多50%.
这是为什么?我怎样才能获得更好的运行时间?
例:
import scala.util.parsing.combinator.RegexParsers
import scala.util.parsing.combinator.Parsers
import scala.util.matching.Regex
import scala.language.implicitConversions
object FooParser extends RegexParsers with Parsers {
var withPosInfo = false
def b: Parser[String] = regexB("""[a-z]+""".r) ^^@ { case (b, x) => b + " ::" + x.toString }
def regexB(p: Regex): BParser[String] = new BParser(regex(p))
class BParser[T](p: Parser[T]) {
def ^^@[U](f: ((Int, Int), T) => U): Parser[U] = Parser { in =>
val source = in.source
val offset = in.offset
val start = handleWhiteSpace(source, offset) …
Run Code Online (Sandbox Code Playgroud) 我希望在网页中以自然演绎的方式显示证明树.我将从JSON文件中获取数据.
什么是显示这样的东西的最佳方式?它只能用css吗?或者有一个库可以做这样的事情吗?渲染为图像是不可能的,因为最终它应该是交互式的.我还应该提到这棵树可以变得相当大.
例:
更新:最终结果的最佳示例:
我在scala中寻找一个从抽象语法树生成JavaScript的库.我想在最终生成JavaScript的编译器中使用它,我不想自己实现漂亮的打印部分.
scala ×4
javascript ×2
parsing ×2
case-class ×1
css ×1
haskell ×1
performance ×1
proof ×1
tree ×1