问题标签 [parser-combinators]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - Scala,树结构数据的解析器组合器
解析器如何用于解析跨越多行的记录?我需要解析树数据(并最终将其转换为树数据结构)。我在下面的代码中遇到了一个难以跟踪的解析错误,但不清楚这是否是 Scala 解析器的最佳方法。问题实际上更多是关于解决问题的方法,而不是调试现有代码。
EBNF-ish 语法是:
尝试实现和测试语法:
parsing - Scala Parser - 消息长度
我在玩 Scala 的 Parser 库。我正在尝试为指定长度后跟该长度消息的格式编写解析器。例如:
我不确定如何使用组合器来做到这一点。我首先想到的是:
但显然身体取决于长度,我不知道该怎么做:p
相反,您可以将消息解析器定义为单个解析器(而不是解析器的组合),我认为这是可行的(尽管我没有查看单个解析器是否可以拉多个 elem?)。
无论如何,我是一个 scala 菜鸟,我只是觉得这太棒了:)
parsing - Scala解析器组合器,解析器由于优先级而失败
我正在尝试为编程语言 Icon 编写解释器。此过程中的步骤之一是为 Icon 编写解析器,我已通过以下方式完成:
但是,当我尝试解析以下表达式时遇到了一些问题:
我收到此错误:
而解析
工作得很好。如果我将 orexp 解析器移动到 fromto 解析器上方的 exp 组,则第一个表达式可以正常工作。但是,这不符合 Icon 给出的规则,也没有解决根本问题。
有人对解决方案有任何想法吗?根据 Scala 文档,混合使用 Packrat 解析器和常规解析器应该没问题。
scala - DSL实现REST服务路由和处理的业务规则
我希望Combinator parsers
( http://debasishg.blogspot.com/2008/04/external-dsls-made-easy-with-scala.html ) 能够用于处理 REST 服务的路由规则的设计用Scalatra
( http://tutorialbin.com/tutorials/80408/infoq-scalatra-a-sinatra-like-web-framework-for-scala ) 实现。
此 REST 服务将用作代理,因此外部应用程序可以访问防火墙内的服务,因为它将具有额外的安全层,可以针对每个 REST 服务的业务需求进行定制。
因此,如果一个人想要访问他们的课程表,那么安全性将低于您想要查看某人的成绩单。
我想要关于去哪里实际获取信息的规则,以及如何返回它,以及在 DSL 中需要什么安全性。
但是,第一个问题是如何基于 DSL 动态更改 REST 服务的路由规则,因为我正在尝试创建一个不需要大量重新编译来添加新规则的框架,只需编写适当的脚本,让它被处理。
那么,是否可以使用 Scala 中的 Combinator Parser 实现 DSL,这将允许 JAX-RS(http://download.oracle.com/javaee/6/tutorial/doc/giepu.html)动态更改路由?
更新:
我还没有设计语言,但这是我想要做的:
这是两种可能的想法,其中将请求脚本的规则发送到不同的站点,例如在防火墙内,然后对数据进行加密并返回。
第二个会更复杂,因为将组合 SOAP 和两个 REST 请求的结果,并且需要额外的命令来说明如何组合,但想法是将所有这些放在可以解析的文件中在飞行中。
如果我使用 Groovy,那么可以为路由生成一些新类,这将消除一些性能损失,但我认为使用 Scala 将是最好的选择,即使我受到了性能损失。
我希望创建一个更易于维护的框架,这样新的路由规则就可以由不了解任何 OOP 或函数式语言的人编写,但可以使用Specs
( http://code.google.com/p ) 编写规范/specs/ ) 以便功能方面可以确定他们的要求会定期进行测试。
更新 2:
当我开始进行设计时,我可能会直观地理解一些选项,但不知道为什么。今天我意识到 Groovy 可能是一个更好的解决方案的原因是我可以使用元编程(http://www.justinspradlin.com/programming/groovy-metaprogramming-adding-behavior- )生成路由类dynamic/ ),那么我就可以使用 Scala 或 Groovy 来动态使用生成的路由。如果它们尚不存在,我不确定如何让 Scala 生成这些类。
在 Groovy 以及其他一些语言中,如此处所示 ( http://langexplr.blogspot.com/2008/02/handling-call-to-missing-method-in.html ) 如果缺少方法,您可以动态生成该方法,它将从此存在,因此它将丢失一次。
似乎我应该将 Groovy 与 Java 混合来完成这项工作,但结果可能是一些代码在 Scala 中,一些在 Java 中,用于路由 REST 服务。
scala - 如何使用解析器组合器进行条件检查
我正在尝试编写一个简单的 html 模板引擎(为了好玩),并想解析这样的结构
A. 普通行是 HTML
B. 如果一行以开头,$
则将其视为 java 代码行
C.如果${}
换行多行,里面的所有代码都应该是java代码。
D.如果一行以$include
然后在行上做一些技巧(调用另一个模板)
这将创建一个新的实例anotherTemplate
,并调用它的render()
方法
E. 并且除了 之外会有更多的“命令” $include
,例如$def
, $val
。
如何在解析器组合器中表达这一点?实际上它是一个条件分叉
对于 1. 和 2.,我得到了这样的结果:
whereupto
是从 Scalate Scamel 解析器中借来的(我刚刚开始阅读并且不太明白)
我曾经not('{')
将$....
代码行与${...}
块区分开来。但这很麻烦,并且不会扩展到其他“命令”
那么我该怎么做呢?
unit-testing - 对 Scala Lexer 进行单元测试
我正在开发一个使用 Scala 解析器组合器编写的解释器。我的解释器将词法分析和解析分为两个阶段。我想为我的词法分析器编写单元测试,以确保它产生正确的输出。
现在,我正在使用帮助方法方法进行单元测试,我在下面提供了该方法。该方法将程序的源代码作为参数,并返回一个 Token 对象列表。使用单元测试框架 (ScalaTest),我可以对生成的令牌列表进行模式匹配。
当前方法存在的问题:
- 它需要我的词法分析器中的辅助方法来帮助单元测试
- 它使用一个while循环
- 它诉诸于手动构建和使用扫描仪
似乎应该有更好的方法将程序的源代码转换为令牌列表。
我当前的工作版本(至少相关部分):
parsing - 如何使用 Scala Parser Combinators 更改代码以考虑运算符优先级?
考虑这部分语法:
是否有必要重写它的一部分来创建新规则,或者是否只有一种方法(比如|
vs. |||
for first vs.longest rule matching)我目前缺少哪个做必要的事情?
scala - 使用解析器组合器列出相等性
我从这里获取了一些 Scala CSV 解析代码:
然后我尝试为它编写一个基本测试:
这失败了,并带有消息:
java.lang.AssertionError:预期:scala.collection.immutable.$colon$colon 但是:scala.collection.immutable.$colon$colon
有任何想法吗?CSV.parse 的输出是一个空 List[List[String]] 但似乎与 List(Nil) 或 ListList[String] 等具有不同的 hashCode。我似乎找不到任何方法来组成一个列表等于 CSV.parse("") 的输出。
更新:
这是使用 REPL 的失败:
scala - 理解 Scala 解析器组合器中的波浪号
我对 Scala 相当陌生,在阅读解析器组合器(解析器组合器背后的魔力,Scala 中的域特定语言)时,我遇到了这样的方法定义:
我一直在阅读 scala.util.parsing.Parsers 的 API 文档,它定义了一个名为 (tilde) 的方法,但我仍然不太了解上面示例中的用法。在该示例中(波浪号)是一个在 java.lang.String 上调用的方法,它没有该方法并导致编译器失败。我知道(波浪号)被定义为
但这对上面的例子有什么帮助?
如果有人可以给我一个提示以了解这里发生了什么,我会很高兴。非常感谢您!
简