问题标签 [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 投票
3 回答
6088 浏览

parsing - OCaml + Menhir 编译/编写

当谈到 OCaml 时,我是一个完整的新手。我最近才开始使用该语言(大约 2 周前),但不幸的是,我的任务是为一种组合语言制作一个语法分析器(解析器 + 词法分析器,其功能是接受或不接受句子)使用门希尔。现在,我在网上找到了一些关于 OCaml 和 Menhir 的资料:

Menhir手册。

这个网页是一些法国大学的课程。

在 Sourceforge 的 Toss 主页上的 Menhir 简短教程。

derdon 在 github 上的 Menhir 示例。

一本关于 OCaml 的书(关于 ocamllex+ocamlyacc 的一些内容

SooHyoung Oh 的随机 ocamllex 教程。

以及 Menhir 源代码附带的示例。

(我不能放两个以上的超链接,所以我不能把你直接链接到我在这里提到的一些网站。对不起!)

所以,正如你所看到的,我一直在拼命地寻找越来越多的材料来帮助我制作这个程序。不幸的是,我仍然无法掌握许多概念,因此我遇到了很多很多困难。

对于初学者,我不知道如何正确编译我的程序。我一直在使用以下命令:

我的程序分为四个不同的文件:main.ml;词法分析器.mll; 解析器.mly; 令牌.mly。main.ml 是从作为参数给出的文件系统中的文件获取输入的部分。

第二个文件是 lexer.mll。

第三个文件是 parser.mly。

第四个是tokens.mly

现在,我知道这里有很多未使用的符号,但我打算在我的解析器中使用它们。不管我对文件做了多少修改,编译器总是在我脸上炸开。我已经尝试了我能想到的一切,但似乎没有任何效果。是什么让 ocamlbuild 在大量未绑定的构造函数和未定义的开始符号的错误中爆炸?我应该使用什么命令来正确编译程序?我在哪里可以找到有意义的材料来了解 Menhir?

0 投票
1 回答
1107 浏览

parsing - 在 Menhir/Ocamlyacc 中为操作员指定动态优先级和优先级

我正在尝试使用 Menhir 解析器(类似于 Ocamlyacc)解析运算符具有动态属性(优先级和优先级)的语言。在词法分析阶段,所有运算符都填充一个OP:string标记(因此“+”变成(OP "+"),等等)。

运算符属性在解析时确定并填充关联运算符及其属性的表。鉴于此表,我如何指示 Menhir 根据此表的数据动态更改解析运算符的规则的优先级?

谢谢,查理P。

0 投票
1 回答
436 浏览

parsing - 是否可以使用 Menhir 创建一个非常宽松的语法?

我正在尝试解析 Verilog 的一些点点滴滴——我主要对提取模块定义和实例感兴趣。

在verilog中,模块定义如下:

并且模块以两种不同的可能方式之一实例化:

此时我只对查找已定义或实例化模块的名称感兴趣;'foo' 在上述两种情况下。

鉴于此 menhir 语法 (verParser.mly):

当我在 menhir 解释器中尝试这个时,它可以很好地提取模块实例:

它适用于单个模块实例化:

但是,当然,如果有一个 IDENT 出现在其中任何一个之前,它将 REJECT:

...当然,在这些defs之前的实际verilog文件中会有标识符。

我试图不必完全指定 Verilog 语法,而是希望慢慢地、增量地构建语法,以最终解析越来越多的语言。

如果我将 IDENT 添加到垃圾规则中,则可以解决上述问题,但是模块实例化规则不起作用,因为现在垃圾规则正在捕获 IDENT。

是否可以创建一个非常宽松的规则来绕过我不想匹配的内容,或者通常要求您必须创建一个完整的语法才能实际执行此类操作?

是否可以创建一个让我匹配的规则:

其中“stuff*”最初匹配除 RPAREN 之外的所有内容?

就像是 :

我过去使用过允许这样的构造的 PEG 解析器。

0 投票
3 回答
1412 浏览

build - 如何使用带有 js_of_ocaml 的模块?

我目前正在开发一个用 OCaml 编写并使用 js_of_ocaml 编译为 javascript 的网站项目。只要我只有一个使用该命令的源文件,它就可以很好地工作,ocamlfind ocamlc -package js_of_ocaml -package js_of_ocaml.syntax -syntax camlp4o -linkpkg -o file.byte file.ml但我想在我的项目中包含几个模块。我怎样才能做到这一点 ?

其他模块实际上是由 ocamllex 和 menhir 生成的词法分析器和解析器。我已经阅读了有关如何将 ocamllex 和 menhir 与 js_of_ocaml 一起使用的教程,但它对 js_of_ocaml 的安装位置做出了错误的假设(我使用 opam 安装它)并且它使用 ocamlbuild,我想知道如何在不使用自动化的情况下手动操作ocamlbuild 等工具。

0 投票
2 回答
983 浏览

parsing - 带有menhir的一系列可选语法规则

我想使用 Menhir 解析器在 OCaml 中实现以下语法。

应该有四个不同的语句一个接一个地出现,但是,其中任何三个都可能丢失。因此,任何程序都至少包含这些语句中的一个,但可以包含更多以特定顺序出现的语句。

这是语法:

是否可以用更简洁的表示来表达它?

这是parser.mly此语法的示例:

对于这种情况,menhir 会产生警告:

A B C D, A, A C,B D等情况不匹配。如何改进语法/解析器实现以解决此问题?

0 投票
1 回答
373 浏览

parsing - 通过打印有用信息来调试解析器

我想解析一组表达式,例如:X[3], X[-3], XY[-2],X[4]Y[2]等。

在我的parser.mly, index(里面[])定义如下:

tokenINTEGERMINUS在词法分析器中正常定义。

我尝试解析一个例子,它失败了。但是,如果我评论| MINUS INTEGER { 0 - $2 },它运作良好。所以问题肯定与此有关。为了调试,我想获得更多信息,换句话说,我想知道什么被认为是MINUS INTEGER. 我试图添加打印:

但是解析时没有打印任何内容。

谁能告诉我如何打印信息或调试它?

0 投票
2 回答
130 浏览

parsing - 解析一组表达式时发生冲突

我想解析一组表达式:R[3]C, R[2]C, R[3]C-R[2]C... 有一个我无法解决的冲突...

这是一部分lexer.mll

的一部分parser.mly

奇怪的是,这段代码不起作用R[3]C-R[2]C,这里是parser.conflicts,我无法真正理解。

如果我注释行| R LBRACKET r = index RBRACKET C c = index ...中的行e_cell,代码可以解析R[3]C-R[2]C,where 3and 2are index`R[3]Cand R[2]Care e_cell,and R[3]C-R[2]Cis e_expression

有人可以帮忙吗?

0 投票
1 回答
1590 浏览

tree - 树描述的语法示例 (lex/yacc)

我想从描述这棵树的文件中解析一棵树(这实际上是一个分类法)。

我正在寻找提供树描述的语法示例(最好是 lex/yacc 文件)。如果所描述的树不是二叉搜索树,而是每个节点(可能)有几个孩子的树(它称为家谱树吗?平面树?),那会更好。

理想情况下,如果这个 lex/yacc 实际包含在 OCaml 库中,那将是完美的。但是任何好的树描述语法都会让我满意。

我试图通过 Google 或 Stackoverflow 查找示例,但研究结果被与解析树相关的问题所淹没。我可以自己做一个语法,但我想先看看例子,以便有一个好的起点。

0 投票
2 回答
623 浏览

ocaml - 通过 ocamlbuild 在 .mly 文件中使用电池

我有一个包含 OCaml .ml 文件和 Menhir .mly 文件的项目。我使用 ocamlbuild 来编译项目。

我的 _tags 文件包含这一行:

一切正常,除非我想在 .mly 文件中使用电池。如果我在我的 .mly 文件open Batteries ;;之间%{%}我在调用 ocamlbuild 时得到“错误:未绑定的模块电池”。

似乎当 ocamlbuild 调用 menhir 时,像这样:

它忘记在menhir-package batteries的选项中添加(或等效的东西) 。--ocamlc

我该如何解决?也许我的 _tags 文件中的 .mly 文件的特殊规则会有所帮助?或者它是一个 ocamlbuild 错误?

0 投票
2 回答
274 浏览

parsing - 通过 menhir 制作一个包含对 .mly 和 .mll 可见的令牌的表

我想定义一个keyword_table将一些字符串映射到一些标记的 a,并且我想让这个表对parser.mly和都可见lexer.mll

似乎该表必须在中定义parser.mly

但是,我不能使用它lexer.mll,例如

正如这个评论所暗示的,menhir有一个解决方案,谁能告诉我任何细节?