问题标签 [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 词法分析器?
可以调试 Menhir 生成的解析器,例如menhir --interpret --interpret-show-cst parser.mly
. 是否也可以调试词法分析器创建的标记?我没有在 Manhir 手册页或在线找到任何内容。
例如,调试“1+2”会吐出“INT 1 PLUS INT 2”令牌列表。
查看生成的 parser.ml 模块,有一个具有令牌类型的 MenhirBasics 模块,但没有 string_of_token 或类似的。哦,令牌类型在 parser.mli 文件中公开。如果 Menhir 可以生成 [@@deriving show] 或类似内容,那就太好了。
相关 Gitlab 问题:https ://gitlab.inria.fr/fpottier/menhir/-/issues/6
ocaml - sedlex 和 ocaml 不会向 $startpos 和 $endpos 发送相同的位置信息
以前,我有一个由 menhir 和 ocamllex 制作的解析器和词法分析器。在解析器中,我使用$startpos
and $endpos
:
其中Loc.print
定义为:
在词法分析器中,我具有以下功能来打印 loc 信息:
结果,'a\n+b'
返回以下输出:
然后,我使用 sedlex 制作词法分析器,我有以下功能来打印 loc 信息:
结果, 'abc\n+d'
返回以下输出:
注意,因为换行,这里的location of+
和location ofd
没有很好的计算。结果,我的 loc 信息expression
不再好。
有谁知道如何解决这一问题?
ocaml - 使用 menhir 和 ocamlbuild 调试代码
我正在实现一种小型编程语言。这是代码库。该程序是用ocamlbuild
. 我添加了一个使用menhir
. 当我编译并运行程序时,我收到以下消息。
我正在尝试通过将 传递explain
给_tag
文件来查找更多详细信息
但似乎没有任何区别。如何menhir
通过 ocamlbuild 生成日志文件?或其他调试方式?
parsing - Menhir的部分解析和恢复
Sedlex 和 Menhir 中有一个非常小的计算器。现在,我想让计算器能够解析像1+
. 所以我修改parser.mly
为
但评估1+
仍然返回错误Fatal error: exception Parser.MenhirBasics.Error
。
有人可以帮忙吗?
makefile - 通过 makefile 或手动添加模块
我有一个用传统 makefile 构建的大项目。我想在我的项目中添加一个像这个项目这样的错误处理机制。
在示例项目中,UnitActionsParser
按照dune的如下规则生成了一个模块:
目前,makefile
我的项目包含如下内容:
所以现在,我想知道如何构建这样的UnitActionsParser
模块。最好的办法是修改我的makefile
,有人知道怎么做吗?否则,我们也可以首先手动添加它。我在命令行中尝试过$ menhir --table --external-tokens Parser
,但它返回了我Usage: menhir <options> <filenames>
。有人可以帮忙吗?
ocaml - 生成启用增量 API 和检查 API 的解析器
我有一个由 menhir 和传统 makefile 构建的大项目。首先,我想在我的项目中添加一个像这个项目这样的错误处理机制。
通过跟踪示例项目的沙丘,我设法通过以下命令生成.mly
、.mli
、.ml
和of :.cmi
.cmo
unitActionsParser_e.mly
增量 API 和错误处理确实有效。
然后,我想将像这个项目这样的错误恢复添加到我的项目中。然后,在我的项目中items state
引发了错误。Error: Unbound value items
根据手册和沙丘,我想我需要在--inspection
某处添加。
我试过了menhir --explain --inspection --table --dump --infer --external-tokens Parser_e unitActionsParser_e.mly
,然后camlfind ocamlc -package menhirLib -c unitActionsParser_e.mli
报错Unbound type constructor Parser_e.terminal
。
我也尝试直接处理parser_e.mly
而不是使用unitActionsParser_e
by menhir --explain --inspection --table --dump --infer parser_e.mly
,但它返回了一个错误Unbound module Utility
where Utility
is a module in another folder required by parser_e.mly
。在我手动复制utility.cm*
到 的文件夹后parser_e.mly
,它返回了一个错误Unbound module Sedlexing
(这里是一个我们可以重现错误的 fork)(这可能与手册的与构建系统的交互有关)。
有谁知道生成解析器(UnitActionsParser_e
或Parser_e
)的正确命令和标志是什么,以启用 Menhir 的增量 API 和检查 API?
(* 在讨论.ocaml.org 中的链接:https ://discuss.ocaml.org/t/generate-a-parser-enabling-incremental-api-and-inspection-api/9380 *)
menhir - 让menhir通过dune使用外部模块
在这个项目中,我想添加一个文件夹extra
,其中包含try.ml
:
然后,在 中parser.mly
,我想使用模块Try
。所以我需要在标题中打开它:
此刻,dune
如下
有谁知道如何修改沙丘文件以使其考虑Try
在内?
parsing - 了解menhir生成的.messages文件
我正在尝试了解.messages
menhir 生成的文件。
从这个示例中,我们可以使用它menhir parser.mly --list-errors > parser.messages
来生成parser.messages。错误如下:
通常,--list-errors
应该计算导致错误的所有可能方式。但我不明白为什么喜欢main: INT PLUS DIV
和main: INT MINUS DIV
不包括在内的方式parser.messages
(但是,表达方式5+/
仍然正确地引发错误)。有谁知道原因?