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

parsing - 将 menhir 与 sedlex 一起使用

无论出于何种原因(utf-8),我都需要将 menhir 与 sedlex 一起使用,但不知道如何使生成的解析器依赖于Sedlexing而不是Lexing. 有小费吗?

当我跑

生成的程序带有Lexing.... 我可以手动更改它,但必须有另一种方法,不是吗?

0 投票
0 回答
110 浏览

ocaml - OCaml Menhir:出错时输出最后一个状态

我正在尝试生成解析器错误消息。为此,我想使用最后一个标记和最后看到的状态。

我可以使用这种方法输出最后一个令牌。

但是,这些状态是由 Menhir 生成的,所以我发现没有办法在不篡改 Menhir 源的情况下输出错误时的最后一个状态。

无论如何以编程方式从 Menhir 生成的解析器中提取状态?即输出发生错误的状态;产生错误令牌的状态。

0 投票
2 回答
1531 浏览

ocaml - OCaml + Menhir:如何像元组模式一样解析 OCaml?

我是menhir的初学者。我想知道如何用我自己的语言解析 OCaml 之类的元组模式,这与 OCaml 非常相似。

例如,在表达式let a,b,c = ...中, a, b, c应该像Tuple (Var "a", Var "b", Var "c").

但是,在下面的解析器定义中,上面的例子被解析为Tuple (Tuple (Var "a", Var "b"), Var "c"). 我想知道如何修复以下定义来解析像 ocaml 这样的模式。

我已经检查过 OCaml 的 parser.mly,但我不确定如何实现它。我认为我的定义类似于 OCaml 的定义......他们使用了什么魔法?

结果如下:

0 投票
1 回答
445 浏览

parsing - OCaml Menhir:语法不起作用

我正在使用 menhir 来定义在 ML 中的现代编译器实现中描述的 Tiger 语言,这里是手册:

但是,这种语法不能识别 string likea[3]但它识别a.b.

然后我向左值添加另一个规则

现在我的语法识别a[3] 但它不识别a[r]

这对我来说似乎很奇怪。为什么a[3]我原来的语法不能识别,为什么不能a[r]识别?


更新

这是我的语法:

词法分析器:

和 ast.ml

0 投票
1 回答
370 浏览

ocaml - 使用 corebuild 编译 OCaml

我目前有一个包含以下文件的项目(转到 Python 编译器)

以下是依赖项:

我尝试根据我阅读的文档进行以下编译:

ast.ml 包含一个类型声明列表,其中我有一个

我现在花了几个小时阅读 ocamlfind、corebuild 和 ocamlopt 的文档,什么也没有。在某些时候,它似乎只是一个巧合而编译,并且再也没有工作过。我愿意使用任何工具。

这是 parser.mly 中的内容

这是错误消息中提到的最后一行。

0 投票
1 回答
571 浏览

parsing - 在 Menhir 中,如果规则没有运算符,是否可以创建左关联规则?

我正在尝试使用 Menhir 为正则表达式语言编写解析器。在我修改它以消除歧义之前,我想要的语法看起来有点像下面的例子。请注意,“排序/连接”是隐式的,并且没有与该操作关联的标记。

如果我有连接的标记,我将能够通过使用优先声明来消除歧义

但是,如果没有连接规则中的 CONCAT 令牌,我将无法正常工作。我尝试使用%prec声明,但仍然存在一些移位/减少冲突。

我认为这可能是因为 menhir 无法判断排序应该是左关联的,但我不能 100% 确定这是否是问题的原因。

到目前为止,我能找到的唯一解决方案是将re规则分解为一堆不同的规则,这些规则使优先级和关联性明确:

尽管最后一个示例运行良好,但我真的很好奇是否可以仅通过使用优先级和关联性声明来消除所有歧义和冲突,而无需重写语法。

0 投票
1 回答
186 浏览

ocaml - 在 64 位 Mac 上安装 Compcert-2.6

在 64 位 macos 上编译 compcert 2.6 时出现以下错误

我通过 opam 安装了 coq 和 menhir,但不知何故 ocamlfind 找不到“menhirlib”。

版本 Coq 8.4.pl6;Ocaml 4.02.2;奥帕姆 1.2.2;门希尔 20160303

0 投票
0 回答
395 浏览

compiler-construction - 错误:使用 Menhir 和 OCaml 生成空语言

我目前正在使用 OCaml 和 Menhir 开发 Pascal Parser。当我编译包含以下代码小脚本的 parser.mly 时,Menhir 只是说“警告:if_cmd 生成空语言”这可能发生在无法从初始值到达规则“if_cmd”时(纠正我,如果我'我错了),但从逻辑上讲,它应该达到。我无法弄清楚为什么会发生此警告。例如,如果我使用 parser.mly 中指定的语法的输入文件和这些语句:

它给了我想要的答案。但是如果我用这个作为输入

它说Exception: Syntax.Error,可能是因为那个警告

在同一个文件夹中使用以下 4 个文件,我使用了该ocamlbuild -use-menhir main.byte命令,该命令会生成刚刚提到的警告

词法分析器

解析器

ast.ml

主文件

0 投票
1 回答
120 浏览

ocaml - 美元 + mly 中的标识符

我看到一个类型检查器$startpos$endpos.mly

谁能告诉我$+的含义是identifier什么?它们是函数还是变量?他们的价值观是如何形成的?

0 投票
1 回答
78 浏览

nlp - 让menhir找到所有替代品?

我想以以下方式更改 menhir 输出的行为:我希望它查找所有语法替代项(如果找到),并将它们放在一个列表中,然后让我恢复这种模棱两可的解释。它不会减少冲突,只是存储它们。

在 menhir 的源代码中,在我看来,我必须查看“Engine.ml”。作为语法自动机的检查点的状态,产生的语法确定的标记出现在变体类型项目“Accepted v”中。该内容由之前的“accept env prod”函数找到,该函数是递归函数包的一部分,用于更改状态。

您有什么建议吗,我如何更改这些函数以将所有可能的结果放在此处的列表中并像什么都没发生一样继续进行?还是您认为,这无论如何都行不通?

谢谢。