问题标签 [ocamlyacc]

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 投票
1 回答
360 浏览

parsing - 记录令牌及其位置以在前端之外使用它们

我想为特定语言写一个小美化器。在美化器中,我们将能够缩进一行或多行(即在每行左侧添加空格);我们还将能够格式化整个代码(即,在适当的位置更改空格和换行符)。

ocamllex给定一个程序,我的前端ocamlyacc可以构建一个Abstract Syntax Tree (AST)

我更熟悉使用 AST 来分析、编译和打印(不完全相同)程序。但是,似乎我们需要直接在令牌上工作才能编写一个好的美化器。但我不知道如何在前端之外操作令牌。

例如,在解析时记录标记及其位置是否很常见,以便我们仍然可以在前端之外使用它们?例如,我们可能会一个一个地遍历这个记录中的标记,并打印完全相同的程序(包括精确的空格)?

有人有任何代码片段吗?

编辑 1: 以下是一些Lexing.lexeme_start_plexbuf 运行时使用的示例。但是,我想知道的是人们是否以及如何在解析之外(或之后)获取这些信息?例如,在解析之外(或之后),我们如何从某个位置获取令牌?

0 投票
1 回答
988 浏览

ocaml - 获取在解析器中引发解析错误的输入字符串

我有一个前端,menhir它试图解析一个表达式:从字符串到表达式 AST。Parser_e.main在我的 OCaml 代码中,在几个不同的地方调用了前端的入口点。所以我希望能够在前端内部而不是外部捕获可能的错误。捕获错误时,我要显示的一个特别重要的信息是前端无法解析的整个输入字符串。(来自词法分析器的错误非常罕见,因为前端几乎可以读取所有内容)。

所以我尝试关注这个线程,并在出现错误时打印更多信息。在parser_e.mly中,我添加了

但它仍然没有输入字符串作为信息。如果我缺少任何功能来获得它,有人吗?

0 投票
1 回答
5166 浏览

ocaml - ::(双冒号)在 Ocaml 中是什么意思?

正式列表:类型 ID { [($1,$2)] } | 正式列表 COMMA 类型 ID { ($3,$4) :: $1 }

运营商是什么::意思?例如:a :: b 我们将a添加到b的含义是什么?

0 投票
1 回答
74 浏览

yacc - 在 ocamlyacc 上转移/减少冲突

我有以下解析器:

我知道它还不完整,我仍在构建它并学习如何正确使用 ocamlyacc/menhir。

好吧,当我添加这一行时:| expr Bigger expr {$1 > $3}它给了我 10 次移位/减少冲突......但是当我用这样的括号添加这一行时:

| LP expr RP Bigger LP expr RP {$2 > $6} LP代表'(',RP代表') '

它非常适合,没有错误,也没有移位/减少冲突

这是问题的正确解决方案吗?如果是,那为什么?还有一个问题,我的解析器做错了吗?还是只是不完整?

感谢并为某事感到抱歉!

0 投票
1 回答
95 浏览

parsing - 我正在尝试使用 ocamlyacc 为语言制作解析器,但我应该输入什么类型?

我有下面的代码也有更多类似 expr: int {} | BOOL {} 等,但我不知道我应该在这个解析器的类型中写什么类型,我有一个适用于 int 且类型为 int 的计算器示例,但在我的程序中我有 float char string 等。谢谢

0 投票
1 回答
299 浏览

ocaml - OCAML 从标准输入中获取多个参数并一一操作

我已经使用 ocamllex 和 ocamlyacc 编写了一个解释器,词法分析器和解析器工作正常,但目前它们只解析它收到的最后一个 .txt 参数,因为它们依次反对所有这些参数。例如,./interpret one.txt two.txt three.txt仅解析three.txt为与解析相反one.txt,然后two.txt再解析,three.txt这就是我想要的。因此,例如解析结果如下:

调用./interpret one.txt two.txt three.txt当前输出是:3但我希望它是123

这是我的主要课程,处理stdinstdout

谢谢你的时间

0 投票
1 回答
117 浏览

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类型 ( Someand None) 处理了这些产品。也许我可能在这里遇到问题?

0 投票
2 回答
171 浏览

if-statement - OCaml中的Yacc NULL?

我在 OCamlyacc 和 OCamllex 中实现以下语法:

我的 IF-ELSE 子句的 OCaml 类型声明如下:

我可以这样定义 OCamlyacc 中的 IF-ELSE 部分:

但是,如何将“NULL”用于语句类型(“stmt”),其中问号用于没有 ELSE的IF 语句(第 1 行)?我无法访问只有一个表达式(“exp”)和一个语句的语句类型。

我考虑过在那里放一个“while(0){print(0)}”语句,但这不是你应该做的,特别是因为它会在不应该的时候解析一个while 语句

0 投票
1 回答
261 浏览

ocaml - Menhir separator_nonempty_list 生成类型错误的代码

我有一个简单的递归规则:

Menhir 编译成功,但 ocamlc 抱怨生成的代码:

类型定义:

我试图添加:

但这也无济于事。我究竟做错了什么?

0 投票
1 回答
71 浏览

ocaml - Ocamlyacc 似乎没有返回完整记录

我有以下解析器,它应该返回带有globalVarsand的记录globalFns,但它似乎没有。

其中ast.ml将程序定义为:

我收到的错误是:Error: Unbound record field globalVars当我尝试执行以下操作时:

我根本无法弄清楚为什么program.globalVars这里没有绑定。如果有人能指出我正确的方向,那将不胜感激。