问题标签 [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.
ocaml - 获取在解析器中引发解析错误的输入字符串
我有一个前端,menhir
它试图解析一个表达式:从字符串到表达式 AST。Parser_e.main
在我的 OCaml 代码中,在几个不同的地方调用了前端的入口点。所以我希望能够在前端内部而不是外部捕获可能的错误。捕获错误时,我要显示的一个特别重要的信息是前端无法解析的整个输入字符串。(来自词法分析器的错误非常罕见,因为前端几乎可以读取所有内容)。
所以我尝试关注这个线程,并在出现错误时打印更多信息。在parser_e.mly
中,我添加了
但它仍然没有输入字符串作为信息。如果我缺少任何功能来获得它,有人吗?
ocaml - 当我用 menhir 生成解析器时,有没有办法导出更多的东西?
我正在使用 menhir 生成解析器,现在,它从我的 parser.mly 文件生成的 parser.mli 文件如下所示:
有没有办法在我的解析器界面中包含更多内容?特别是,我还希望能够导出我的 AST 的数据类型(当前位于单独的类型模块中)和一些使用令牌数据类型的函数(例如,将它们转换回字符串的函数)。
我尝试在 parser.mly 之后放置一些 Ocaml 代码,%%
但是虽然该代码显示在 parser.ml 中,但我声明的函数都没有出现在 parser.mli 中。
ocaml - 让 menhir 将用户定义的函数从 .mly 添加到 .mli
Menhir 允许将任意 ocaml 代码添加到 .mly 文件的末尾,我想在其中声明一些函数。但是我找不到让menhir 将我的函数添加到.mli 文件的方法,以便它们在其他模块中可见。可能吗?
makefile - 如何通过 OCamlbuild 使用 Menhir 错误消息生成?
我正在使用的--compile-errors
功能,menhir
我对它非常满意。我也ocamlbuild
用来管理我的项目的编译。由于该项目非常基础,到目前为止,构建基础设施仍然微不足道。
我在项目的根目录有一个_tags
文件和一个简单的文件。Makefile
我还没有myocamlbuild.ml
文件。该_tags
文件仅包含一行:
Makefile 的相关部分是
OCamlbuild 和 Menhir 通常集成得很好,但--compile-errors
似乎是一个相当新的功能。我的设置并不理想,因为我不喜欢src/ParsingErrors.ml
在我的源目录而不是构建目录中有一个自动生成的文件。向 OCamlbuild 解释我希望 Menhir 构建此错误消息文件的最佳方式是什么?更改文件的命名约定(例如,更改为src/Parser.messages
and src/Parser.ml
)不会让我感到困扰,如果它可以简化事情的话。
注意:虽然我myocamlbuild.ml
在其他项目中有文件,但我从在线资源中复制了它们。我发现它们很难破译,而且我真的不明白如何写这些东西。
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?
yacc - 在 ocamlyacc 上转移/减少冲突
我有以下解析器:
我知道它还不完整,我仍在构建它并学习如何正确使用 ocamlyacc/menhir。
好吧,当我添加这一行时:| expr Bigger expr {$1 > $3}
它给了我 10 次移位/减少冲突......但是当我用这样的括号添加这一行时:
| LP expr RP Bigger LP expr RP {$2 > $6}
LP代表'(',RP代表') '
它非常适合,没有错误,也没有移位/减少冲突
这是问题的正确解决方案吗?如果是,那为什么?还有一个问题,我的解析器做错了吗?还是只是不完整?
感谢并为某事感到抱歉!
parsing - 我正在尝试使用 ocamlyacc 为语言制作解析器,但我应该输入什么类型?
我有下面的代码也有更多类似 expr: int {} | BOOL {} 等,但我不知道我应该在这个解析器的类型中写什么类型,我有一个适用于 int 且类型为 int 的计算器示例,但在我的程序中我有 float char string 等。谢谢
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
类型 ( Some
and None
) 处理了这些产品。也许我可能在这里遇到问题?
parsing - LR(1) 解析器如何处理空规则?
我使用过一些解析器(Yacc、Bison 和 Menhir)。如果我没记错的话,它们都允许规则为空。这是我使用 Menhir 的一个例子,它是我用得最多的一个。
重要的部分是 some_list 可以减少虚无。
我目前对构建解析表的算法的理解(构建 NFA,从 NFA 构建 DFA,最小化)使我认为这会导致整个地方的移位/减少冲突。但它显然没有,因为我的代码当时有效。
那么如何构建一个可以接受那些空规则的解析表呢?
ocaml - Menhir separator_nonempty_list 生成类型错误的代码
我有一个简单的递归规则:
Menhir 编译成功,但 ocamlc 抱怨生成的代码:
类型定义:
我试图添加:
但这也无济于事。我究竟做错了什么?