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

error-handling - menhir - 将 AST 节点与源文件中的令牌位置相关联

我正在使用 Menhir 来解析 DSL。我的解析器使用精心制作的嵌套类型集合构建 AST。在稍后的类型检查和其他为用户生成的错误报告中,我想参考它发生的源文件位置。这些不是解析错误,它们是在解析完成后生成的。

一个天真的解决方案是为所有 AST 类型配备额外的位置信息,但这会使使用它们(例如构造或匹配)变得不必要的笨拙。这样做的既定做法是什么?

0 投票
1 回答
594 浏览

ocaml - 移位/减少与嵌套列表的冲突

我一直在研究“ML 中的现代编译器实现”,边走边将 SML 转换为 OCaml。本书定义了一种名为 Tiger 的语言,该语言具有let ... in ... end用于在给定表达式的范围内声明类型、变量和函数的语法。此外,应将相同类型的相邻声明组合在一起以允许相互递归。

我试图用以下语法片段来表示这是 Menhir:

有了这个,我得到了转变/减少冲突,但 Menhir 以我想要的方式解决了它。我希望它nonempty_list(typec)是贪婪的,所以相邻TYPE的声明被组合在一起。即,通过 Menhir 解决冲突,我生成的 AST 看起来像:

我想摆脱警告,但我想不出像 Menhir 一样解决冲突的方法。我试过 using %inline tydec,这确实使警告消失了,但是TYPE并没有像我预期的那样应用 。相反,优先考虑 中的列表decs,产生如下所示的 AST:

我也尝试过明确设置优先级,但 Menhir 警告我这是一个无用的声明。

我敢肯定我在这里遗漏了一些基本的东西。给出产生列表列表的产品,我怎样才能使内部列表变得贪婪?

0 投票
2 回答
112 浏览

compiler-construction - Menhir 的语义动作

我正在为分配语言构建一个小型编译器。

考虑以下规则:

是在第一次识别 var_block 时触发语义动作,还是在达到产生式结束时触发(在本例中为 RPAREN)?

0 投票
1 回答
772 浏览

parsing - ocaml menhir 解析器的产量从未减少

我正在学习如何解析简单的程序。

这是我的词法分析器。

我的“阿斯特”:

我的解析器:

我目前正处于一个我想解析简单的“字符串”,即“字符串” some text的“数组”,即- item1 - item2

当我用 Menhir 编译解析器时,我得到:

我对解析很陌生。为什么这从未减少?

0 投票
1 回答
834 浏览

parsing - 如何使用 menhir 解析表达式列表?

这是我目前用于 Andrew Appel 的 Tiger 语言 (ocaml) 的词法分析器解析器。

我目前正在尝试支持相互递归函数,但以下解析器代码不起作用:

对于小例子:

我得到两个FunDec带有单例列表的标记,而不是FunDec带有由两个元素组成的列表的单个标记。

如何使用 menhir 解析列表fundec

PS:我知道我可以在第二遍中合并这些列表,但如果可能的话,我希望解析器为我做这件事

0 投票
2 回答
273 浏览

ocaml - 抑制模块化解析器规范中的“从不有用”的优先警告?

是否可以在 menhir 中抑制未使用的优先警告?

背景:

我有一个包含多个规则的核心解析器,Lib.mly另外还有许多使用. 为了支持对所有语言使用单个词法分析器,所有标记都在 中定义,我们使用注释并扩展以抑制未使用的标记警告,这有很大帮助。但是,我仍然收到许多形式的警告:A.mlyB.mlyLib.mlyLib.mlyexternal_tokens(Lib)_tagsmyocamlbuild.ml--unused-tokens

这些让我很难看到我真正想要解决的其他警告。运算符的不同子集用于各种语言,因此我需要一个“全局”优先级来适当地对它们进行排序。感谢您的任何提示!

0 投票
1 回答
475 浏览

parsing - 如何在 OCaml 词法分析器中执行“前瞻”/如何回滚词素?

好吧,我正在用 OCaml 编写我的第一个解析器,我立即设法用无限循环制作了一个解析器。

特别值得注意的是,我正在尝试根据 Scheme 规范的规则对标识符进行 lex 识别(显然,我不知道自己在做什么)——并且其中有一些关于标识符的语言要求它们后面跟一个定界符。我现在的方法是拥有一个delimited_identifier包含其中一个delimiter字符的正则表达式,它不应该被主词法分析器使用……然后一旦匹配,该词素的读取就会被恢复Sedlexing.rollback(好吧,我的包装器) ,在传递给只吃实际标识符的子词法分析器之前,希望将缓冲区中的定界符作为不同的词位被父词法分析器吃掉。

我正在使用MenhirSedlex,主要是综合来自@smolkajocaml-parsingexample-repo 和RWO 的解析章节的示例;这是我当前解析器词法分析器的最简单简化:

……和……</p>

(是的,它基本上是一个无操作/最简单的事情。我正在努力学习!:x

不幸的是,这种组合导致解析自动机出现无限循环:

我对解析和词法分析以及所有这些都是新手;任何的建议都受欢迎。我敢肯定这只是一个新手的错误,但是……</p>

谢谢!

0 投票
1 回答
379 浏览

parsing - ParserErr 生成“索引越界异常”

我正在创建一个编译器,并试图从解析器中提取行信息。我希望将此作为元数据附加到 AST 节点,以便以后可以轻松报告任何错误。通过使用以下方法,我成功地提取了 Lexer 中的行信息:

这会在以这种方式使用 Lexer 后完美地生成行号、字符号:

对于解析器,我使用这种方法:

我的解析器如下所示:

在运行它时,如果检测到解析器错误,它会抛出 invalid_argument “Index out of bounds”异常。这是raise (ParseErr (error msg (rhs_start_pos nterm) (rhs_end_pos nterm)))在线检测的。我最终想创建一个包含此解析器行信息的 AST 节点,因为它是元数据,但无法通过此异常。我不确定我的实施方法是否错误,或者我是否犯了其他错误。希望对此有所帮助。

0 投票
1 回答
118 浏览

ocaml - 解析ocaml时通过eol分隔列表

我在编译器中定义了一些语句,后跟表达式列表。我正在使用 Menhir 进行解析。通常在进行词法分析时会这样做EOL| eol { incr_linenum lexbuf; read lexbuf } 但是,我希望能够解析这个:

stmt定义如下:

我的程序是这样的:

我希望expr将 解释为 的列表expr。有没有办法做到这一点?还是我的列表必须用其他字符分隔?

0 投票
1 回答
219 浏览

parsing - 解析器:像语法一样区分 JavaScript 中的括号和函数声明

我正在开发一个使用 OCaml 和 Menhir 作为解析器和词法分析器的编译器。当我编写像语法这样的 JavaScript 时,(a, b) => a + b像 lambda 函数定义以及(a + b) * c带有括号优先子表达式的算术一样,我写

parser.mly.

只需添加更多上下文,我就有lexer.mll这样的:

但这会在编译时出现reduce/reduce错误:

我知道问题可能是由这两者之间的歧义引起的:(a)(a) => a(one-arg-function)。但我仍然不明白为什么它仍然会产生这个错误,因为对我来说非常清楚,后面跟着一个粗箭头的括号=>将成为一个函数......

有人可以帮助我吗?