问题标签 [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 回答
988 浏览

ocaml - 获取在解析器中引发解析错误的输入字符串

我有一个前端,menhir它试图解析一个表达式:从字符串到表达式 AST。Parser_e.main在我的 OCaml 代码中,在几个不同的地方调用了前端的入口点。所以我希望能够在前端内部而不是外部捕获可能的错误。捕获错误时,我要显示的一个特别重要的信息是前端无法解析的整个输入字符串。(来自词法分析器的错误非常罕见,因为前端几乎可以读取所有内容)。

所以我尝试关注这个线程,并在出现错误时打印更多信息。在parser_e.mly中,我添加了

但它仍然没有输入字符串作为信息。如果我缺少任何功能来获得它,有人吗?

0 投票
0 回答
177 浏览

ocaml - 当我用 menhir 生成解析器时,有没有办法导出更多的东西?

我正在使用 menhir 生成解析器,现在,它从我的 parser.mly 文件生成的 parser.mli 文件如下所示:

有没有办法在我的解析器界面中包含更多内容?特别是,我还希望能够导出我的 AST 的数据类型(当前位于单独的类型模块中)和一些使用令牌数据类型的函数(例如,将它们转换回字符串的函数)。

我尝试在 parser.mly 之后放置一些 Ocaml 代码,%%但是虽然该代码显示在 parser.ml 中,但我声明的函数都没有出现在 parser.mli 中。

0 投票
1 回答
144 浏览

ocaml - 让 menhir 将用户定义的函数从 .mly 添加到 .mli

Menhir 允许将任意 ocaml 代码添加到 .mly 文件的末尾,我想在其中声明一些函数。但是我找不到让menhir 将我的函数添加到.mli 文件的方法,以便它们在其他模块中可见。可能吗?

0 投票
2 回答
1071 浏览

makefile - 如何通过 OCamlbuild 使用 Menhir 错误消息生成?

我正在使用的--compile-errors功能,menhir我对它非常满意。我也ocamlbuild用来管理我的项目的编译。由于该项目非常基础,到目前为止,构建基础设施仍然微不足道。

我在项目的根目录有一个_tags文件和一个简单的文件。Makefile我还没有myocamlbuild.ml文件。该_tags文件仅包含一行:

Makefile 的相关部分是

OCamlbuild 和 Menhir 通常集成得很好,但--compile-errors似乎是一个相当新的功能。我的设置并不理想,因为我不喜欢src/ParsingErrors.ml在我的源目录而不是构建目录中有一个自动生成的文件。向 OCamlbuild 解释我希望 Menhir 构建此错误消息文件的最佳方式是什么?更改文件的命名约定(例如,更改为src/Parser.messagesand src/Parser.ml)不会让我感到困扰,如果它可以简化事情的话。

注意:虽然我myocamlbuild.ml在其他项目中有文件,但我从在线资源中复制了它们。我发现它们很难破译,而且我真的不明白如何写这些东西。

0 投票
1 回答
404 浏览

ocaml - menhir - associativity rules for reducing sequences of expressions

writing a parser for lambda expressions,

When writing the .mly file how can I express the idea that a sequence of expressions

should be parsed as

Using the rules:

gives the structure (e1 , (e2 , (e3 , e4))) as opposed to (((e1, e2), e3), e4). Is there a way of controlling the associativity of a rule as opposed to a token?

0 投票
1 回答
74 浏览

yacc - 在 ocamlyacc 上转移/减少冲突

我有以下解析器:

我知道它还不完整,我仍在构建它并学习如何正确使用 ocamlyacc/menhir。

好吧,当我添加这一行时:| expr Bigger expr {$1 > $3}它给了我 10 次移位/减少冲突......但是当我用这样的括号添加这一行时:

| LP expr RP Bigger LP expr RP {$2 > $6} LP代表'(',RP代表') '

它非常适合,没有错误,也没有移位/减少冲突

这是问题的正确解决方案吗?如果是,那为什么?还有一个问题,我的解析器做错了吗?还是只是不完整?

感谢并为某事感到抱歉!

0 投票
1 回答
95 浏览

parsing - 我正在尝试使用 ocamlyacc 为语言制作解析器,但我应该输入什么类型?

我有下面的代码也有更多类似 expr: int {} | BOOL {} 等,但我不知道我应该在这个解析器的类型中写什么类型,我有一个适用于 int 且类型为 int 的计算器示例,但在我的程序中我有 float char string 等。谢谢

0 投票
1 回答
117 浏览

json - 为 Menhir 配备抽象语法树时出现类型错误

编辑:

我下面的问题仍然存在,但我很欣赏如果不筛选一堆代码就很难回答。因此,要问一个有点类似的问题,有没有人有任何 Menhir 被用来实现 AST 的例子?最好不要像计算器这样的“玩具”项目,但我会很感激我能得到的任何帮助。

原始问题:

我正在尝试使用 Menhir 实现一个抽象语法树,但我似乎无法解决一个问题。我的设置如下:

  • AST 的规范是使用atdgen生成的。这基本上是一个将我的所有语法规则都转换为 ATD 格式的文件。这允许我序列化一些我用来打印 AST 的 JSON。
  • 在我的 parser.mly 文件中,我有一长串生产清单。当我使用 Menhir 时,我可以将这些产生式链接到 AST 节点的创建,即解析器的每个产生式都对应于在 AST 中记录值的指令。

第二点是我真正努力取得进展的地方。我有一个巨大的语法(ast.atd 文件长约 600 行,parser.mly 文件长约 1000 个文件),所以很难确定我哪里出错了。我怀疑我在途中的某个地方有类型错误。

代码片段

这是我的 ast.atd 文件的样子:

这是我的 parser.mly 文件的样子:

当我尝试编译文件时出现的错误

是类型错误,即

我意识到这个问题在这样的抽象中有点难以回答,我很高兴提供指向我的代码保管箱的链接,但如果有人能指出我正确的方向,我将不胜感激。

可能感兴趣:我在 parser.mly 中有一些产品最初是“空的”,我使用 ocamloption类型 ( Someand None) 处理了这些产品。也许我可能在这里遇到问题?

0 投票
1 回答
431 浏览

parsing - LR(1) 解析器如何处理空规则?

我使用过一些解析器(Yacc、Bison 和 Menhir)。如果我没记错的话,它们都允许规则为空。这是我使用 Menhir 的一个例子,它是我用得最多的一个。

重要的部分是 some_list 可以减少虚无。

我目前对构建解析表的算法的理解(构建 NFA,从 NFA 构建 DFA,最小化)使我认为这会导致整个地方的移位/减少冲突。但它显然没有,因为我的代码当时有效。

那么如何构建一个可以接受那些空规则的解析表呢?

0 投票
1 回答
261 浏览

ocaml - Menhir separator_nonempty_list 生成类型错误的代码

我有一个简单的递归规则:

Menhir 编译成功,但 ocamlc 抱怨生成的代码:

类型定义:

我试图添加:

但这也无济于事。我究竟做错了什么?