问题标签 [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.
error-handling - menhir - 将 AST 节点与源文件中的令牌位置相关联
我正在使用 Menhir 来解析 DSL。我的解析器使用精心制作的嵌套类型集合构建 AST。在稍后的类型检查和其他为用户生成的错误报告中,我想参考它发生的源文件位置。这些不是解析错误,它们是在解析完成后生成的。
一个天真的解决方案是为所有 AST 类型配备额外的位置信息,但这会使使用它们(例如构造或匹配)变得不必要的笨拙。这样做的既定做法是什么?
ocaml - 移位/减少与嵌套列表的冲突
我一直在研究“ML 中的现代编译器实现”,边走边将 SML 转换为 OCaml。本书定义了一种名为 Tiger 的语言,该语言具有let ... in ... end
用于在给定表达式的范围内声明类型、变量和函数的语法。此外,应将相同类型的相邻声明组合在一起以允许相互递归。
我试图用以下语法片段来表示这是 Menhir:
有了这个,我得到了转变/减少冲突,但 Menhir 以我想要的方式解决了它。我希望它nonempty_list(typec)
是贪婪的,所以相邻TYPE
的声明被组合在一起。即,通过 Menhir 解决冲突,我生成的 AST 看起来像:
我想摆脱警告,但我想不出像 Menhir 一样解决冲突的方法。我试过 using %inline tydec
,这确实使警告消失了,但是TYPE
并没有像我预期的那样应用 。相反,优先考虑 中的列表decs
,产生如下所示的 AST:
我也尝试过明确设置优先级,但 Menhir 警告我这是一个无用的声明。
我敢肯定我在这里遗漏了一些基本的东西。给出产生列表列表的产品,我怎样才能使内部列表变得贪婪?
compiler-construction - Menhir 的语义动作
我正在为分配语言构建一个小型编译器。
考虑以下规则:
是在第一次识别 var_block 时触发语义动作,还是在达到产生式结束时触发(在本例中为 RPAREN)?
parsing - ocaml menhir 解析器的产量从未减少
我正在学习如何解析简单的程序。
这是我的词法分析器。
我的“阿斯特”:
我的解析器:
我目前正处于一个我想解析简单的“字符串”,即“字符串”
some text
的“数组”,即- item1 - item2
。
当我用 Menhir 编译解析器时,我得到:
我对解析很陌生。为什么这从未减少?
ocaml - 抑制模块化解析器规范中的“从不有用”的优先警告?
是否可以在 menhir 中抑制未使用的优先警告?
背景:
我有一个包含多个规则的核心解析器,Lib.mly
另外还有许多使用. 为了支持对所有语言使用单个词法分析器,所有标记都在 中定义,我们使用注释并扩展以抑制未使用的标记警告,这有很大帮助。但是,我仍然收到许多形式的警告:A.mly
B.mly
Lib.mly
Lib.mly
external_tokens(Lib)
_tags
myocamlbuild.ml
--unused-tokens
这些让我很难看到我真正想要解决的其他警告。运算符的不同子集用于各种语言,因此我需要一个“全局”优先级来适当地对它们进行排序。感谢您的任何提示!
parsing - 如何在 OCaml 词法分析器中执行“前瞻”/如何回滚词素?
好吧,我正在用 OCaml 编写我的第一个解析器,我立即设法用无限循环制作了一个解析器。
特别值得注意的是,我正在尝试根据 Scheme 规范的规则对标识符进行 lex 识别(显然,我不知道自己在做什么)——并且其中有一些关于标识符的语言要求它们后面跟一个定界符。我现在的方法是拥有一个delimited_identifier
包含其中一个delimiter
字符的正则表达式,它不应该被主词法分析器使用……然后一旦匹配,该词素的读取就会被恢复Sedlexing.rollback
(好吧,我的包装器) ,在传递给只吃实际标识符的子词法分析器之前,希望将缓冲区中的定界符作为不同的词位被父词法分析器吃掉。
我正在使用Menhir和Sedlex,主要是综合来自@smolkaj的ocaml-parsing
example-repo 和RWO 的解析章节的示例;这是我当前解析器和词法分析器的最简单简化:
……和……</p>
(是的,它基本上是一个无操作/最简单的事情。我正在努力学习!:x
)
不幸的是,这种组合导致解析自动机出现无限循环:
我对解析和词法分析以及所有这些都是新手;任何的建议都受欢迎。我敢肯定这只是一个新手的错误,但是……</p>
谢谢!
parsing - ParserErr 生成“索引越界异常”
我正在创建一个编译器,并试图从解析器中提取行信息。我希望将此作为元数据附加到 AST 节点,以便以后可以轻松报告任何错误。通过使用以下方法,我成功地提取了 Lexer 中的行信息:
这会在以这种方式使用 Lexer 后完美地生成行号、字符号:
对于解析器,我使用这种方法:
我的解析器如下所示:
在运行它时,如果检测到解析器错误,它会抛出 invalid_argument “Index out of bounds”异常。这是raise (ParseErr (error msg (rhs_start_pos nterm) (rhs_end_pos nterm)))
在线检测的。我最终想创建一个包含此解析器行信息的 AST 节点,因为它是元数据,但无法通过此异常。我不确定我的实施方法是否错误,或者我是否犯了其他错误。希望对此有所帮助。
ocaml - 解析ocaml时通过eol分隔列表
我在编译器中定义了一些语句,后跟表达式列表。我正在使用 Menhir 进行解析。通常在进行词法分析时会这样做EOL
:
| eol { incr_linenum lexbuf; read lexbuf }
但是,我希望能够解析这个:
stmt定义如下:
我的程序是这样的:
我希望expr
将 解释为 的列表expr
。有没有办法做到这一点?还是我的列表必须用其他字符分隔?
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)。但我仍然不明白为什么它仍然会产生这个错误,因为对我来说非常清楚,后面跟着一个粗箭头的括号=>
将成为一个函数......
有人可以帮助我吗?