问题标签 [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 回答
360 浏览

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

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

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

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

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

有人有任何代码片段吗?

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

0 投票
1 回答
95 浏览

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

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

0 投票
1 回答
338 浏览

string - 我将如何使用 ocamllex 实现字符串的词法分析?

我是词法分析概念的新手,我正在尝试在 ocaml 中编写一个词法分析器来读取以下示例输入:

基本上输入是任何随机字符串或整数的列表。我发现了许多基于 int 的输入示例,因为它们中的大多数都模拟了计算器,但没有通过示例或词法字符串的文档找到任何指导。以下是我的词法分析器:

如您所见,我缺少解析字符串的能力。我知道一个字符串可以用这种形式表示,['a'-'z']所以它会像['a'-'z'] { 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 回答
774 浏览

ocaml - 改变 Lexing.lexbuf 的状态

我正在使用 Ocamllex 为Brainfuck编写一个词法分析器,为了实现它的循环,我需要更改 lexbuf 的状态,以便它可以返回到流中的先前位置。

Brainfuck 的背景信息(可跳过)

在 Brainfuck 中,循环由一对方括号完成,规则如下:

  • [-> 继续并评估下一个令牌
  • ]-> 如果当前单元格的值不为0,则返回匹配[

因此,以下代码的计算结果为 15:

上面写着:

  • 在第一个单元格中,分配 3(递增 3 次)
  • 进入循环,移动到下一个单元格
  • 赋值 5(递增 5 倍)
  • 移回第一个单元格,并从其值中减去 1
  • 点击右方括号,现在当前单元格(第一个)等于 2,因此跳回[并再次进入循环
  • 继续直到第一个单元格等于0,然后退出循环
  • 移动到第二个单元格并输出值.

第二个单元格中的值将增加到 15(以 5 为增量增加 3 次)。

问题:

基本上,我编写了两个函数来处理在文件[的标题部分中推送和弹出最后一个位置的最后一个位置,即将 lexbuf 的当前位置推送和弹出到命名:brainfuck.mllpush_curr_ppop_last_pint list refloopstack

其他规则工作得很好,但它似乎忽略了[and ]。问题显然在于loopstack我如何获取和设置lex_curr_p状态。将不胜感激任何线索。

0 投票
1 回答
61 浏览

ocaml - 为什么我不能在我的 lex 文件中使用模块?

这就是我目前拥有的mll运行良好的文件。

我做ocamllex a.mll然后ocamlc -o a a.ml。运行./a < a.mll将打印出 mll 文件中存在的所有字符串,这正是我所期望的。

但是,如果我module StringMap = Map.Make(String)在调用之前添加List.iter,我会得到一个语法错误......
File "a.mll", line 17, characters 4-10:其中第 17 行是 with 的行,module而 4-10 是 word module

我无法弄清楚为什么添加这一行会给我一个语法错误...如果我在顶层输入相同的代码,它就可以正常工作。

0 投票
1 回答
333 浏览

parsing - Ocaml 解析器“未终止的操作”错误

我是 OCaml 的新手,我正在尝试使用解析器生成器 - ocamllex、ocamlyacc 为特定语言创建解析器。当我尝试编译我的parser.mly文件时,我收到以下错误:

错误(在 = 处带有标记):

以下是 parser.mly 文件的摘录:

0 投票
1 回答
475 浏览

parsing - 如何在 OCaml 词法分析器中执行“前瞻”/如何回滚词素?

好吧,我正在用 OCaml 编写我的第一个解析器,我立即设法用无限循环制作了一个解析器。

特别值得注意的是,我正在尝试根据 Scheme 规范的规则对标识符进行 lex 识别(显然,我不知道自己在做什么)——并且其中有一些关于标识符的语言要求它们后面跟一个定界符。我现在的方法是拥有一个delimited_identifier包含其中一个delimiter字符的正则表达式,它不应该被主词法分析器使用……然后一旦匹配,该词素的读取就会被恢复Sedlexing.rollback(好吧,我的包装器) ,在传递给只吃实际标识符的子词法分析器之前,希望将缓冲区中的定界符作为不同的词位被父词法分析器吃掉。

我正在使用MenhirSedlex,主要是综合来自@smolkajocaml-parsingexample-repo 和RWO 的解析章节的示例;这是我当前解析器词法分析器的最简单简化:

……和……</p>

(是的,它基本上是一个无操作/最简单的事情。我正在努力学习!:x

不幸的是,这种组合导致解析自动机出现无限循环:

我对解析和词法分析以及所有这些都是新手;任何的建议都受欢迎。我敢肯定这只是一个新手的错误,但是……</p>

谢谢!

0 投票
1 回答
126 浏览

parsing - 基于令牌的内容在解析器杠杆处进行分支

我正在为一个小项目开发一个简单的示例解析器/词法分析器,但我遇到了一个问题。

我正在按照以下方式解析内容:

... 、 或空格中的任何SEP一个(但不是多个!)在哪里。|,

现在,我不想将字段顺序锁定在词法分析器顺序中,因此我尝试使用一组非常简单的标记来对此进行词法分析:

现在,如果gender字段不包含一小组预先确定的值,例如{male,female,neither,unspecified}. 我可以包装解析器并处理这个问题,但我真的很想将此要求编码到自动机中以供将来扩展。

我的第一次尝试,看起来像这样,可怕地失败了:

是的,没有骰子。显然,我对非结构化词法分析的尝试已经很糟糕了。

解析这样的东西的惯用方法是什么?

0 投票
1 回答
301 浏览

ocaml - 将 ocamlyacc 与 sedlex 一起使用

我试图弄清楚如何将 ocamlyacc 与 sedlex 一起使用。

lexer.ml(使用 sedlex):

我还有一个名为 的 ocamlyacc 文件parser.mly,其中包含parse语法规则之一。

为了解析一个字符串,我使用了这个:

但是在编译过程中,出现了这个错误(由Lexer.lex上面引起):

错误:此表达式的类型为 Sedlexing.lexbuf -> Parser.token,但预期的表达式类型为 Lexing.lexbuf -> Parser.token 类型 Sedlexing.lexbuf 与类型 Lexing.lexbuf 不兼容

据我了解,出现此错误是因为 ocamlyacc 期望词法分析器由 ocamllex 生成,而不是由 sedlex 生成。所以问题是:如何将 ocamlyacc 与 sedlex 一起使用?