问题标签 [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.
f# - 用 OcamlYacc / FsYacc 表示可选语法和重复
我正在尝试在词法分析/解析语法方面建立一些技能。我正在回顾我为 SQL 编写的一个简单的解析器,但我对它并不完全满意——似乎应该有一种更简单的方法来编写解析器。
SQL 让我大吃一惊,因为它有很多可选的标记和重复。例如:
相当于:
ON
and子句是可选的WHERE
,可以出现多次。我在解析器中处理这些如下:
换句话说,我通过将可选语法分解为单独的规则来处理可选语法,并使用递归处理重复。这行得通,但是它将解析分解为一堆小子例程,并且很难看出语法实际代表什么。
如果我可以在括号内指定可选语法并使用 * 或 + 重复,我认为编写起来会容易得多。这会将我的 whereClause 和 joinList 规则减少到以下内容:
我认为这种形式更容易阅读,并且更直观地表达了它试图捕捉的语法。不幸的是,我在 Ocaml 或 F# 文档中找不到任何支持此表示法或类似内容的内容。
在 OcamlYacc 或 FsYacc 中是否有一种简单的方法来表示具有可选或重复标记的语法?
parsing - Parser/Lexer 忽略不完整的语法规则
我有一个用 ocamlyacc 和 ocamllex 编写的解析器和词法分析器。如果要解析的文件过早结束,例如我忘记了行尾的分号,则应用程序不会引发语法错误。我意识到这是因为我正在提高和捕捉 EOF 并且这使得词法分析器忽略未完成的规则,但是我应该如何这样做来引发语法错误?
这是我当前的解析器(简化),
和lexxer(简化),
示例输入文件,
一种解决方案是,在命令规则的末尾添加一个递归调用给自身,并添加一个空规则,所有这些都构建一个列表以返回主程序。我想我可能将 Eof 解释为期望和结束条件,而不是词法分析器中的错误,这是正确的吗?
ocaml - ocamlyacc 解析错误:什么令牌?
我正在使用 ocamlyacc 和 ocamllex。我的语法中有一个错误产生,表示自定义异常。到目前为止,我可以让它报告错误位置:
但是,我也想知道读取了哪个令牌。一定有办法——有人知道吗?
谢谢。
ocaml - 关于ocamlyacc,函数应用语法和优先级
我是 OCaml 新手,我正在尝试编写一个简单的类似 OCaml 的语法,但我无法弄清楚这一点。我的语法允许这样的事情:
但是,如果我想使用这样定义的函数,我可以写:(sub 7) 3
但我不能写sub 7 3
,这真的让我很烦恼。出于某种原因,它被解释为好像我写的sub (7 3)
(这将被7
视为带有参数的函数3
)。相关部分是:
谢谢!
ocaml - 返回 ocamllex 中的多个令牌
有没有办法在 OCamlLex 中返回多个令牌?
我正在尝试为基于缩进的语言编写词法分析器和解析器,并且我希望我的词法分析器DEDENT
在注意到缩进级别低于以前时返回多个标记。这将允许它在多个块结束时通知解析器。
通过遵循这种方法,我将能够使用INDENT
and作为andDEDENT
的替代品,因为BEGIN
and标记END
暗示了这两个标记。INDENT
DEDENT
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 的错误方法?是否有任何其他现有的工具或方法可以满足我的要求?
如果有什么我想念的,请指出这对我有很大帮助。谢谢。
ocaml - 解析器在解析中停止
我完全没有想法。我今天把每一分钟的空闲时间都花在这上面,但我完全没有想法。
这是我的Ocamlyacc
语法:
def foo(a,b) a+b
根据调试消息,当我开始解析时,它应该告诉我它有一个函数和一个原型声明。但相反,我只收到解析proto
规则的消息。
进一步的调试消息显示解析器到达a
表达式的a+b
位置然后停止。没有错误信息,没有别的。它只是停止,好像整个文本都被完全解析而没有满足stmt
.
没有移位/减少错误或类似错误。AST 类型也不是问题。我不知道了,也许其他人可以提供帮助。当然这是显而易见的,但我看不到。
编辑:受大众需求的词法分析器:
ocaml - 在 OCamlyacc 中使用外部类型声明
我在 expr.ml 文件中有一个 expr 类型。在 parser.mly(OCamlyacc 文件)中,我定义了 expr 规则并给出了类型:
但是,我得到:
我尝试添加
在 .mly 文件的开头,但它仍然不起作用。如何在外部文件中定义此 expr 类型并将其用作我的规则的返回值?谢谢。
parsing - 使用 ocamlyacc 减少/减少冲突
我正在为涉及类型表达式和变量访问的语法而苦苦挣扎。此访问的结果类型在解析期间无法确定,并在第二步中进行评估。这种评估不是问题,但似乎很难编写明确的解析器规则。
所有适用于不同类型的操作(例如比较运算符)都会产生reduce/reduce
冲突。很明显,这是因为类型不确定,解析器无法决定“ x.a = y.b
”应该被解析为“ bool_expr EUQAL bool_expr
”还是“ ”。num_expr EUQAL num_expr
但是,comp_op
规则的结果类型是确定的(因为它始终是布尔值)。
在解析过程中不丢弃所有类型信息并始终在评估阶段检查它,是否有解决此问题的方法?
这是一个缩短的语法示例(使用ocamllex和ocamlyacc):
谢谢你的帮助。
optimization - 如何使用 ocamllex 和 ocamlyacc 编写三地址代码?
我想知道如何使用 ocamllex 和 ocamlyacc 编写三地址代码?我用谷歌搜索了很多关于这个,但我找不到任何使用 ocamlyacc 的东西。我的解析器和词法分析器都在工作(当然都使用 ocamlyacc 和 ocamllex),但现在我必须使用它们编写一个三地址代码生成器。例如,假设我有这个解析器(计算器):
三地址码应该怎么写?
解析器:
例子:
输入:
5+(5*7)
三地址码输出:
t1 = 5*7
t2 = 5+t1