问题标签 [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.
parsing - 记录令牌及其位置以在前端之外使用它们
我想为特定语言写一个小美化器。在美化器中,我们将能够缩进一行或多行(即在每行左侧添加空格);我们还将能够格式化整个代码(即,在适当的位置更改空格和换行符)。
ocamllex
给定一个程序,我的前端ocamlyacc
可以构建一个Abstract Syntax Tree (AST)
:
我更熟悉使用 AST 来分析、编译和打印(不完全相同)程序。但是,似乎我们需要直接在令牌上工作才能编写一个好的美化器。但我不知道如何在前端之外操作令牌。
例如,在解析时记录标记及其位置是否很常见,以便我们仍然可以在前端之外使用它们?例如,我们可能会一个一个地遍历这个记录中的标记,并打印完全相同的程序(包括精确的空格)?
有人有任何代码片段吗?
编辑 1:
以下是一些Lexing.lexeme_start_p
在lexbuf
运行时使用的示例。但是,我想知道的是人们是否以及如何在解析之外(或之后)获取这些信息?例如,在解析之外(或之后),我们如何从某个位置获取令牌?
ocaml - 获取在解析器中引发解析错误的输入字符串
我有一个前端,menhir
它试图解析一个表达式:从字符串到表达式 AST。Parser_e.main
在我的 OCaml 代码中,在几个不同的地方调用了前端的入口点。所以我希望能够在前端内部而不是外部捕获可能的错误。捕获错误时,我要显示的一个特别重要的信息是前端无法解析的整个输入字符串。(来自词法分析器的错误非常罕见,因为前端几乎可以读取所有内容)。
所以我尝试关注这个线程,并在出现错误时打印更多信息。在parser_e.mly
中,我添加了
但它仍然没有输入字符串作为信息。如果我缺少任何功能来获得它,有人吗?
ocaml - ::(双冒号)在 Ocaml 中是什么意思?
正式列表:类型 ID { [($1,$2)] } | 正式列表 COMMA 类型 ID { ($3,$4) :: $1 }
运营商是什么::
意思?例如:a :: b
我们将a添加到b的含义是什么?
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 等。谢谢
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
这是我的主要课程,处理stdin
和stdout
谢谢你的时间
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
) 处理了这些产品。也许我可能在这里遇到问题?
if-statement - OCaml中的Yacc NULL?
我在 OCamlyacc 和 OCamllex 中实现以下语法:
我的 IF-ELSE 子句的 OCaml 类型声明如下:
我可以这样定义 OCamlyacc 中的 IF-ELSE 部分:
但是,如何将“NULL”用于语句类型(“stmt”),其中问号用于没有 ELSE的IF 语句(第 1 行)?我无法访问只有一个表达式(“exp”)和一个语句的语句类型。
我考虑过在那里放一个“while(0){print(0)}”语句,但这不是你应该做的,特别是因为它会在不应该的时候解析一个while 语句。
ocaml - Menhir separator_nonempty_list 生成类型错误的代码
我有一个简单的递归规则:
Menhir 编译成功,但 ocamlc 抱怨生成的代码:
类型定义:
我试图添加:
但这也无济于事。我究竟做错了什么?
ocaml - Ocamlyacc 似乎没有返回完整记录
我有以下解析器,它应该返回带有globalVars
and的记录globalFns
,但它似乎没有。
其中ast.ml
将程序定义为:
我收到的错误是:Error: Unbound record field globalVars
当我尝试执行以下操作时:
我根本无法弄清楚为什么program.globalVars
这里没有绑定。如果有人能指出我正确的方向,那将不胜感激。