问题标签 [menhir]

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.

0 投票
1 回答
101 浏览

compiler-construction - 将源代码位置信息添加到前端

我正在编写一个静态分析器,包括特定语言程序的前端。

前端成功地从程序生成 AST,分析器在该程序上运行良好:它要么证明程序正确(对于某些特定属性),要么为语句或表达式引发错误。

如果出现错误,我想明确错误消息。因此,我想localisation源代码中为引发错误的语句或表达式添加确切的内容。展示line number已经很好,展示会row number更好......

谁能告诉我如何修改前端来做到这一点?或者有什么我可以研究的文件吗?

(我想首先我需要修改 AST 中的类型,但我必须添加loc到所有内容吗?)

0 投票
1 回答
213 浏览

parsing - 使用 menhir 和 OCaml 重载乘法

我写了一个词法分析器和解析器来分析线性代数语句。每个语句由一个或多个表达式和一个或多个声明组成。我正在使用 menhir 和 OCaml 编写词法分析器和解析器。

例如:Ax = b,其中 A 是可逆的。

这应该读作 A * x = b, (A, invertible)

在表达式中,所有 id 必须是大写或小写符号。我想重载乘法运算符,以便用户不必输入“*”符号。

但是,由于词法分析器还需要能够读取字符串(例如本例中的“可逆”),因此表达式的“Ax”部分作为字符串发送到解析器。这会导致解析器错误,因为在语句的表达式部分不应遇到任何字符串。

这是语法的基本思想

有什么方法可以分隔各个字符并告诉解析器它们应该被视为乘法吗?有没有办法改变词法分析器,让它足够聪明地知道逗号之前的所有字符簇都是 ids 并且之后的所有簇都应该被视为字符串?

0 投票
1 回答
100 浏览

ocaml - 扩展 ocamllex 以获得更大的词典

有没有办法让 ocammlex 使用更多关键字?我为德语编写了一个解释器和解析器,为了语言分析,它将德语文本“编译”成乳胶图片。它工作得非常好,并且在语言学领域确实是新的。感谢 ocaml 的所有开发人员,您可以在此类事情上滥用 ocamllex 和 menhir 等工具。但很快我就会到达 ocammlex-automaton 的极限,它会说:“自动机变大”。

我知道哈希表的解决方案。我还没有尝试过,如果这解决了即将出现的问题,但是有人知道,如果在 ocamllex-source-code 中更改某种类型的限制整数等很容易,我可以在不更改程序代码的情况下滥用它? 在我看来,这个关于自动化大小的错误对于进一步滥用来说是不必要的愚蠢和尴尬,所以我想问一下。

感谢,并有一个愉快的一天。

0 投票
2 回答
1209 浏览

parsing - 看似等效的 Menhir 规则改变了语法中发现的移位/减少冲突

我正在使用 Menhir 创建解析器,并且有一种行为总是让我感到困惑,我不明白。我创建了以下最小示例来演示它;这显示了在 Go 语言( http://golang.org/ref/spec#Method_declarations )的方法声明中接收器参数的声明:

据我所知,这两个规则在语义上是等价的:我们正在寻找一个可选的标识符(接收者的名称)、一个可选的星号(指针与否)和一个强制的类型名称(接收者的类型)。但是,第一条规则(注释掉的那条)给出了移位/减少冲突,而第二条规则工作正常。

每当发生这种情况时,我都可以通过替换多个规则来在我的解析器中取得进展option,但它一直在唠叨我,我不明白为什么会发生这种情况。

(如果您不了解 menhir,它是一个 LR(1) 解析器生成器,因此可能需要了解其他类似工具的工作原理。)

0 投票
1 回答
756 浏览

ocaml - ocaml menhir - 简单语法的流冲突结束

我正在尝试 Menhir 使用(+、-、*、/ 运算符)生成一个非常简单的表达式解析器,但我得到了流冲突的结尾。这是语法:

我得到的警告是:

如何防止此警告?

这是 menhir 生成的.automaton 文件

0 投票
1 回答
875 浏览

ocaml - 使用 menhir 报告多个错误:哪个令牌?

我正在用 Menhir + Ocamllex 编写一个小型解析器,我有两个似乎无法同时满足的要求

  • 我想在出错后继续解析(报告更多错误)。
  • 我想打印发生错误的令牌。

error通过使用令牌,我只能轻松地做 1) 。我也可以使用为这个问题建议的方法轻松地做 2) 。但是,我不知道实现两者的简单方法。

我现在处理错误的方式是这样的:

对我有帮助的一件事是访问 lexbuf 本身,因此我可以直接获取令牌。这意味着$startpos我不会通过类似 $lexbuf但据我所知,没有官方方法可以访问 lexbuf。1中的解决方案仅适用于解析器的调用者级别,其中调用者本身将 lexbuf 传递给解析器,但不在语义操作中。

有谁知道它是否真的以某种方式可用?或者也许是一种解决方法?

0 投票
1 回答
151 浏览

parsing - 将值作为参数传递给规则

在实现真实世界(TM)语言时,我经常会遇到这样的情况:

显然(以函数式风格),最好将部分解析的collection记录传递给 和 的语义操作的每次调用,parseAparseB相应地更新列表元素。

这甚至可以使用menhir,还是必须使用使用可变全局变量的丑陋技巧?

0 投票
1 回答
241 浏览

ocaml - 在 OCaml 中实现数据帧

我一直在自学 OCaml,我对这种语言印象深刻。我想开发一个用于实践的小型机器学习库,但遇到了一个问题。

在 Python 中,可以使用 Pandas 加载数据文件,然后非常容易地将其传递给像 Scikit-Learn 这样的库。我想在 OCaml 中模拟相同的过程。但是,OCaml 中似乎没有任何数据框库。我已经检查了“ocaml-csv”,但它似乎并没有真正做到我想要的。我还研究了 Haskell 的“框架”,但它使用 TemplateHaskell,但我相信如果 Pandas 可以简单地将数据文件加载到内存中而无需编译时元编程,我相信应该有一种更简单的方法来做同样的事情。有谁知道如何在 Pandas 或 R 中实现数据帧,在 Google 上快速搜索似乎没有返回有用的链接。

是否可以使用 Menhir 等解析器生成器来解析 CSV 文件?另外,我不确定静态类型如何与数据框一起工作。

0 投票
2 回答
341 浏览

ocaml - 尝试解析虚构的编程语言时出错

我正在为我编写的编程语言开发语言解释器。这是一些示例代码,它应该可以工作,但Syntax error at offset 45.在阅读此测试用例时当前会消失。

正确的解释是第一行用 foo 创建一个映射并将其存储在一个名为 foo 的变量中,第二行查找记录 foo 中字段 min 的值,以及开始/结束 curlies 以及分号换行这两个表达式成一个expr_seq(即一个块),其计算结果与其中的最后一个相同expr

我的 parser.mly 的简化版本如下:

尝试自己调试它,我发现如果您删除以下内容| v = VAR LBRACK f = q_var RBRACK ASSIGN e = exp,它将解析它并正确运行,但我真的希望能够在地图中设置东西。

我有 98% 的把握认为问题出在我的 mly 文件中,但我的 lexer.mll 的简化版本如下:

一个简单的 ml 文件是:

编辑:这是一个Makefile。parser.mly、lexer.mll 和interpreter.ml 是上面的第二个、第三个和第四个文件。

这是制作/运行它,其中 test.in 是上面的第一个。

编辑2:我最终只是将| e = VAR LBRACK v = q_var RBRACK { GetMap(v,LookupVar(e)) } 一个特例添加到我的解析器中。那么,问题解决了吗?

0 投票
1 回答
625 浏览

ocaml - 使用 ocamlbuild 时生成 Menhir 的转储/解释文件

我发现 Menhir 提供了 --dump 和 --explain 选项,它对调试有很大帮助。但是如何在 ocamlbuild 下启用这些选项,以便 Menhir 始终在编译时生成转储文件?

我尝试编写 myocamlbuild 文件处理自定义标签menhir_dump,如下所示:

但是当它编译时,选项被插入到子命令中,并且在ocamlc阶段编译失败。

有什么建议么?