问题标签 [uu-parsinglib]
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.
parsing - Parsec 或 happy (with alex) 或 uu-parsinglib
我将编写一个verilog(或vhdl)语言的解析器,并对解析的数据进行大量操作(某种转换)。我打算解析非常大的文件(完整的 Verilog 设计,大至 10K 行),我最终将支持大部分 Verilog。我不介意打字,但我不想在添加对其他规则的支持时重写代码的任何部分。
在 Haskell 中,您会推荐哪个库?我知道 Haskell 并且之前使用过 Happy(玩)。我觉得使用 Parsec 来转换代码中的解析字符串是有可能的(这是一个很大的优势)。我没有使用 uu-paringlib 的经验。
那么要解析verilog/VHDL的完整语法,推荐使用其中的哪一个?我主要关心的是我可以随心所欲地操纵解析数据的易用性和“正确性”。速度不是主要问题。
parsing - 在解析器组合器中组合词法分析器和解析器
我正在使用uu-parsinglib
,但我认为以下问题是解析器组合器通用的。
让我们考虑以下示例:
我有一个带有组合器的词法分析器pLex
,它产生一个标记列表(类型MyToken
)。我现在想编写一个解析器,它将使用令牌并构建一个AST
.
连接词法分析器和解析器的最佳方法是什么?现在我有一个lex
功能:
我应该创建一个函数parse p = ...
吗?如果是,我如何构造它来跟踪来自词法分析器的列和行?或者我应该创建一个parserCombinator
, 它会pLex
以某种方式使用组合器?
parsing - 如何在 uu-parsinglib Haskell 解析器组合器中保持状态
我希望能够在编写解析器组合器时使用get
和put
函数。State Monad
uu-parsinglib
如何才能做到这一点?我可以使用这个库以某种方式创建状态解析器吗?
parsing - 在 Haskell 的 uu-parsinglib 中自定义错误处理
是否有可能:
uu-parsinglib
在 Haskell中使用自定义解析器错误?(我特别想打印带有位置信息的自定义错误消息)- 自定义向用户显示错误的方式?
- 以某种方式控制自动校正发生的位置,而不是哪里?例如,我想拒绝一些自动更正步骤,例如删除标识符的第一个字母,如果它是大写的(标识符应该以小写开头)
parsing - Correctly parsing line indentations in uu-parsinglib in Haskell
I want to create a parser combinator, which will collect all lines below current place, which indentation levels will be greater or equal some i
. I think the idea is simple:
Consume a line - if its indentation is:
- ok -> do it for next lines
- wrong -> fail
Lets consider following code:
Which gives following output:
The result for s1
is correct. The result for s2
should consume first "a" and stop consuming. Where this error comes from?
parsing - 使用 uu-parsinglib 进行单子解析
我正在尝试使用 uu_parsinglib 创建一个 Monadic 解析器。我以为我已经涵盖了,但我在测试中得到了一些意想不到的结果
我的解析器的一个精简示例是:
pName 是一个模棱两可的解析器。我想要类型解析器做的是应用一个后过滤器,并返回所有满足 nameFilter 的替代方案,包装为 ASTType。
如果没有,它应该会失败。
(我意识到如果列表中有多个有效匹配项,我给出的示例将失败,但该示例服务于它的目的)
现在,据我所知,这一切都有效。问题在于当您在更复杂的语法中使用它时,似乎会出现奇怪的匹配。我怀疑问题是 addLength 0 部分
我想做的是将单子和应用部分分开。使用过滤组件创建一元解析器,然后使用 <**> 运算符应用 pName。
或者
对于 addLength 正在做什么,我会接受一个非常好的解释。
parsing - 无法计算解析器的最小长度 - Haskell 中的 uu-parsinglib
让我们看看代码片段:
如果我在解析器中将此代码更改为:
我有一个错误:
我认为上述解析器的行为方式应该相同。为什么会出现这个错误?
编辑
上面的例子非常简单(为了简化问题),如下所述,这里没有必要使用 do 表示法,但我希望它使用的真实情况如下:
我注意到在 do 语句之前添加“addLength 1”可以解决问题,但我不确定它是否是正确的解决方案:
parsing - uu-parsinglib 中的计划外贪婪行为
问题
今天遇到一个问题,不知道怎么解决。这对我来说很奇怪,因为我写的代码应该(根据我目前的知识)是正确的。
因此,您可以在下面找到示例解析器组合器。最重要的是pOperator
,它以非常简单的方式(仅用于演示目的)构建了一个运算符 AST。它消耗“x”并且可以消耗多个由空格分隔的“x”。
我还有pParens
组合器,其定义如下:
所以它在关闭括号之前消耗空格。
样本输入/输出
正确的输入/输出应该是:
但我得到:
但是在第二个示例中,我遇到了错误-解析器的行为就像它贪婪地吃掉了一些令牌(并且没有贪婪的操作)。
我会感谢任何帮助。
示例代码
重要的
相当于:
根据:组合器解析:简短教程
它用于定义运算符优先级。
parsing - 分析使用 Haskell 中的解析器组合库编写的解析器
分析在 Haskell 的解析器组合库中编写的解析器的标准方法是什么?
我目前正在使用uu-parsinglib
,但我很想知道分析其他解析器组合库的方法,如Parsec
.
现在我已经编写了我的解析器,它很慢并且占用了很多内存(对于 600 行输入文本,解析超过 1Gb 的内存大约需要 5 秒,我想研究如何改进它)
parsing - 在 Haskell 中将一个字符插入到解析器组合器字符流中
这个问题与 和 都Parsec
有关uu-parsinglib
。当我们编写解析器组合器时,它们会处理来自编译器的字符流。是否有可能解析一个字符并将其放回(或返回另一个字符)到输入流?
例如,我想解析输入“test + 5”,解析t
, e
, s
,t
并在识别test
模式后,将例如v
字符放回字符流中,因此在继续解析过程时,我们正在匹配v + 5
我现在不想在任何特定情况下使用它——我想深入了解这些可能性。