问题标签 [ocamllex]

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 回答
1234 浏览

ocaml - 返回 ocamllex 中的多个令牌

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

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

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

0 投票
1 回答
555 浏览

f# - fslex 中的 Lua 长字符串

我在业余时间一直在研究 Lua fslex 词法分析器,使用 ocamllex 手册作为参考。

我在尝试正确标记长字符串时遇到了一些障碍。“长字符串”由'[' ('=')* '['']' ('=')* ']'标记分隔;标志的数量=必须相同。

在第一个实现中,词法分析器似乎无法识别[[模式,LBRACKET尽管最长匹配规则产生了两个标记,而[=[正确识别出变化。此外,正则表达式无法确保使用正确的结束标记,在第一次']' ('=')* ']'捕获时停止,无论实际的长字符串“级别”如何。此外,fslex 似乎不支持正则表达式中的“as”结构。

我一直在尝试用词法分析器中的另一条规则来解决这个问题:

但是我被卡住了,有两个原因:首先,我认为我不能“推动”,可以说,一旦我读完长字符串,我就不能“推动”下一条规则;其次,我不喜欢在找到正确的结束标记之前逐个字符地读取字符的想法,这使得当前的设计毫无用处。

如何在 fslex 中标记 Lua 长字符串?谢谢阅读。

0 投票
1 回答
641 浏览

ocaml - OCamllex 匹配行首?

我正在用 ocamllex 在 OCaml 中编写一种玩具编程语言,并试图使该语言对缩进变化敏感,python 风格,但是在将行的开头与 ocamllex 的正则表达式规则匹配时遇到问题。我习惯于^匹配行首,但在 OCaml 中,它是字符串 concat 运算符。不幸的是,谷歌搜索对我来说并没有出现太多:(有人知道这会如何工作吗?

0 投票
4 回答
2802 浏览

ocaml - OCaml lex:无论如何都不起作用

我已经走到了尽头。我无法在 ocamllex 中获得任何工作,这让我发疯。这是我的.mll文件:

以下是我作为输入传入的文件的内容:

然而,当我编译并运行这个东西时,我在第一个字符上得到一个错误,说它无效。老实说,我不知道发生了什么,谷歌根本没有帮助我。这怎么可能?正如你所看到的,我真的被难住了。

编辑:

我工作了很长时间,以至于我放弃了解析器。现在这是我的主文件中的相关代码:

打印出“行:1,列:1”。

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 回答
1758 浏览

ocaml - 使用 Ocamllex 对字符串进行词法分析(Tiger 编译器)

我正在尝试遵循 Appel 的“ML 中的现代编译器实现”,并正在使用 Ocamllex 编写词法分析器。

规范要求词法分析器在翻译转义序列后返回字符串。以下代码摘自 ocamllex 输入文件:

有没有更好的办法?

0 投票
1 回答
244 浏览

ocaml - OCamllex 语法错误

在我的词法分析器的定义部分定义一些标识符时(如此处所述,我正在尝试编写以下形式的内容:

将 id_char 定义为不是空白字符或 op_char 的每个字符。但是,我在第二行的“op_char”上收到语法错误。我该怎么写这个?谢谢。

0 投票
1 回答
697 浏览

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

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

三地址码应该怎么写?

解析器:

例子:

输入:

5+(5*7)

三地址码输出:

t1 = 5*7

t2 = 5+t1

0 投票
2 回答
323 浏览

ocaml - ocamllex 正则表达式的外部定义

我已经实现了 lexer/parser/pretty-printer 的常用组合,用于在我的代码中读入/打印类型。当涉及到通常用于符号、标点符号或分隔符的纯字符串正则表达式时,我发现词法分析器和漂亮打印机之间存在冗余。

例如我现在有

在我的lexer.mll文件中,以及类似的功能:

用于漂亮的印刷。如果我决定更改 TURNSTILE 的字符串,我必须编辑代码中的两个地方,我觉得这不太理想。

显然,OCaml 词法分析器支持一定的能力来定义正则表达式,然后mll文件中引用它们。所以lexer.mll可以写成

但这不会让我symb_turnstile从外部访问,比如我的漂亮打印功能。事实上,在运行之后ocamllex,并没有出现symb_turnstilein lexer.ml。我什至无法在lexer.mll.

有没有办法做到这一点?

0 投票
2 回答
1657 浏览

parsing - 使用 ocamllex/ocamlyacc 解析部分语法

我一直在使用正则表达式来检查一堆 Verilog 文件并提取某些语句。目前,正则表达式对此很好,但是,我开始意识到需要一个真正的解析器来处理嵌套结构,所以我正在研究 ocamllex/ocamlyacc。我想首先复制我在正则表达式实现中得到的内容,然后慢慢地在语法中添加更多内容。

现在我主要对提取模块声明和实例感兴趣。为了让这个问题更简短,让我们只看一下模块声明。

在 Verilog 中,模块声明如下所示:

我当前的正则表达式实现只是检查是否有一个使用特定名称声明的模块(检查我感兴趣的名称列表 - 我不需要找到所有模块声明,只是具有特定名称的模块声明)。所以基本上,我得到了我想要解析的 Verilog 文件的每一行并进行这样的匹配(带有 Pythonish 和 Rubyish 元素的伪 OCaml):

这很好用。模块声明可以出现在 Verilog 文件中的任何位置;我只是想知道该文件是否包含该特定声明,我不在乎该文件中可能还有什么。

我第一次尝试将其转换为 ocamllex/ocamlyacc:

verLexer.mll:

verParser.mly:

然后在 REPL 中尝试一下:

太好了,它有效!

然而,一个真正的 Verilog 文件将不止包含一个模块声明:

我并不真正关心该模块定义之前或之后出现的内容,有没有办法只提取语法的那部分以确定Verilog文件包含'module foo('语句?是的,我意识到正则表达式是工作正常,但是,如上所述,我计划慢慢地发展这个语法并添加更多元素,正则表达式将开始分解。

编辑:我在 lex 规则中添加了一个 match any char:

认为它会跳过迄今为止不匹配的任何字符,但这似乎不起作用: