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

f# - 用 OcamlYacc / FsYacc 表示可选语法和重复

我正在尝试在词法分析/解析语法方面建立一些技能。我正在回顾我为 SQL 编写的一个简单的解析器,但我对它并不完全满意——似乎应该有一种更简单的方法来编写解析器。

SQL 让我大吃一惊,因为它有很多可选的标记和重复。例如:

相当于:

ONand子句是可选的WHERE,可以出现多次。我在解析器中处理这些如下:

换句话说,我通过将可选语法分解为单独的规则来处理可选语法,并使用递归处理重复。这行得通,但是它将解析分解为一堆小子例程,并且很难看出语法实际代表什么。

如果我可以在括号内指定可选语法并使用 * 或 + 重复,我认为编写起来会容易得多。这会将我的 whereClause 和 joinList 规则减少到以下内容:

我认为这种形式容易阅读,并且更直观地表达了它试图捕捉的语法。不幸的是,我在 Ocaml 或 F# 文档中找不到任何支持此表示法或类似内容的内容。

在 OcamlYacc 或 FsYacc 中是否有一种简单的方法来表示具有可选或重复标记的语法?

0 投票
1 回答
464 浏览

parsing - Parser/Lexer 忽略不完整的语法规则

我有一个用 ocamlyacc 和 ocamllex 编写的解析器和词法分析器。如果要解析的文件过早结束,例如我忘记了行尾的分号,则应用程序不会引发语法错误。我意识到这是因为我正在提高和捕捉 EOF 并且这使得词法分析器忽略未完成的规则​​,但是我应该如何这样做来引发语法错误?

这是我当前的解析器(简化),

和lexxer(简化),

示例输入文件,

一种解决方案是,在命令规则的末尾添加一个递归调用给自身,并添加一个空规则,所有这些都构建一个列表以返回主程序。我想我可能将 Eof 解释为期望和结束条件,而不是词法分析器中的错误,这是正确的吗?

0 投票
3 回答
7933 浏览

ocaml - ocamlyacc 解析错误:什么令牌?

我正在使用 ocamlyacc 和 ocamllex。我的语法中有一个错误产生,表示自定义异常。到目前为止,我可以让它报告错误位置:

但是,我也想知道读取了哪个令牌。一定有办法——有人知道吗?

谢谢。

0 投票
3 回答
3340 浏览

ocaml - 关于ocamlyacc,函数应用语法和优先级

我是 OCaml 新手,我正在尝试编写一个简单的类似 OCaml 的语法,但我无法弄清楚这一点。我的语法允许这样的事情:

但是,如果我想使用这样定义的函数,我可以写:(sub 7) 3但我不能写sub 7 3,这真的让我很烦恼。出于某种原因,它被解释为好像我写的sub (7 3)(这将被7视为带有参数的函数3)。相关部分是:

谢谢!

0 投票
1 回答
1234 浏览

ocaml - 返回 ocamllex 中的多个令牌

有没有办法在 OCamlLex 中返回多个令牌?

我正在尝试为基于缩进的语言编写词法分析器和解析器,并且我希望我的词法分析器DEDENT在注意到缩进级别低于以前时返回多个标记。这将允许它在多个块结束时通知解析器。

通过遵循这种方法,我将能够使用INDENTand作为andDEDENT的替代品,因为BEGINand标记END暗示了这两个标记。INDENTDEDENT

0 投票
1 回答
1165 浏览

python - 从 Python 到 CIL(C 中间语言)的翻译

最近一直在做 Python 源代码的静态分析。我们组已经有一个用 Ocaml 编写的用于 CIL(C Intermediate Language) 的静态分析器。我们想重用这个分析器,所以我们理想的方法是将 Python 翻译成 CIL。

目前,我使用 Python 内置的 ast 模块将 Python 解析为 Python AST。然后我将 ast.dump 打印的 Python AST 翻译成 C AST。考虑到 C AST 到 CIL API 和静态分析器都是用 Ocaml 编写的。我选择 Ocamllex&Ocamlyacc 将 Python AST 解析为 C AST。但是,也存在一些大问题。

ast.dump 打印的 AST 表示很难识别。这使我的解析器不容易实现。另一方面,我不能使用 Ocaml 来访问 Python ast 内部结构。即使我可以,数据结构也与 Ocaml 不同。

我想知道我最初是否选择了将 Python 代码转换为 C AST 的错误方法?是否有任何其他现有的工具或方法可以满足我的要求?

如果有什么我想念的,请指出这对我有很大帮助。谢谢。

0 投票
1 回答
227 浏览

ocaml - 解析器在解析中停止

我完全没有想法。我今天把每一分钟的空闲时间都花在这上面,但我完全没有想法。

这是我的Ocamlyacc语法:

def foo(a,b) a+b根据调试消息,当我开始解析时,它应该告诉我它有一个函数和一个原型声明。但相反,我只收到解析proto规则的消息。

进一步的调试消息显示解析器到达a表达式的a+b位置然后停止。没有错误信息,没有别的。它只是停止,好像整个文本都被完全解析而没有满足stmt.

没有移位/减少错误或类似错误。AST 类型也不是问题。我不知道了,也许其他人可以提供帮助。当然这是显而易见的,但我看不到。

编辑:受大众需求的词法分析器:

0 投票
3 回答
1842 浏览

ocaml - 在 OCamlyacc 中使用外部类型声明

我在 expr.ml 文件中有一个 expr 类型。在 parser.mly(OCamlyacc 文件)中,我定义了 expr 规则并给出了类型:

但是,我得到:

我尝试添加

在 .mly 文件的开头,但它仍然不起作用。如何在外部文件中定义此 expr 类型并将其用作我的规则的返回值?谢谢。

0 投票
2 回答
326 浏览

parsing - 使用 ocamlyacc 减少/减少冲突

我正在为涉及类型表达式变量访问的语法而苦苦挣扎。此访问的结果类型在解析期间无法确定,并在第二步中进行评估。这种评估不是问题,但似乎很难编写明确的解析器规则。

所有适用于不同类型的操作(例如比较运算符)都会产生reduce/reduce冲突。很明显,这是因为类型不确定,解析器无法决定“ x.a = y.b”应该被解析为“ bool_expr EUQAL bool_expr”还是“ ”。num_expr EUQAL num_expr但是,comp_op规则的结果类型是确定的(因为它始终是布尔值)。

在解析过程中不丢弃所有类型信息并始终在评估阶段检查它,是否有解决此问题的方法?

这是一个缩短的语法示例(使用ocamllexocamlyacc):

谢谢你的帮助。

0 投票
1 回答
697 浏览

optimization - 如何使用 ocamllex 和 ocamlyacc 编写三地址代码?

我想知道如何使用 ocamllex 和 ocamlyacc 编写三地址代码?我用谷歌搜索了很多关于这个,但我找不到任何使用 ocamlyacc 的东西。我的解析器和词法分析器都在工作(当然都使用 ocamlyacc 和 ocamllex),但现在我必须使用它们编写一个三地址代码生成器。例如,假设我有这个解析器(计算器):

三地址码应该怎么写?

解析器:

例子:

输入:

5+(5*7)

三地址码输出:

t1 = 5*7

t2 = 5+t1