问题标签 [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.
parsing - 记录令牌及其位置以在前端之外使用它们
我想为特定语言写一个小美化器。在美化器中,我们将能够缩进一行或多行(即在每行左侧添加空格);我们还将能够格式化整个代码(即,在适当的位置更改空格和换行符)。
ocamllex
给定一个程序,我的前端ocamlyacc
可以构建一个Abstract Syntax Tree (AST)
:
我更熟悉使用 AST 来分析、编译和打印(不完全相同)程序。但是,似乎我们需要直接在令牌上工作才能编写一个好的美化器。但我不知道如何在前端之外操作令牌。
例如,在解析时记录标记及其位置是否很常见,以便我们仍然可以在前端之外使用它们?例如,我们可能会一个一个地遍历这个记录中的标记,并打印完全相同的程序(包括精确的空格)?
有人有任何代码片段吗?
编辑 1:
以下是一些Lexing.lexeme_start_p
在lexbuf
运行时使用的示例。但是,我想知道的是人们是否以及如何在解析之外(或之后)获取这些信息?例如,在解析之外(或之后),我们如何从某个位置获取令牌?
parsing - 我正在尝试使用 ocamlyacc 为语言制作解析器,但我应该输入什么类型?
我有下面的代码也有更多类似 expr: int {} | BOOL {} 等,但我不知道我应该在这个解析器的类型中写什么类型,我有一个适用于 int 且类型为 int 的计算器示例,但在我的程序中我有 float char string 等。谢谢
string - 我将如何使用 ocamllex 实现字符串的词法分析?
我是词法分析概念的新手,我正在尝试在 ocaml 中编写一个词法分析器来读取以下示例输入:
基本上输入是任何随机字符串或整数的列表。我发现了许多基于 int 的输入示例,因为它们中的大多数都模拟了计算器,但没有通过示例或词法字符串的文档找到任何指导。以下是我的词法分析器:
如您所见,我缺少解析字符串的能力。我知道一个字符串可以用这种形式表示,['a'-'z']
所以它会像['a'-'z'] { 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
谢谢你的时间
ocaml - 改变 Lexing.lexbuf 的状态
我正在使用 Ocamllex 为Brainfuck编写一个词法分析器,为了实现它的循环,我需要更改 lexbuf 的状态,以便它可以返回到流中的先前位置。
Brainfuck 的背景信息(可跳过)
在 Brainfuck 中,循环由一对方括号完成,规则如下:
[
-> 继续并评估下一个令牌]
-> 如果当前单元格的值不为0,则返回匹配[
因此,以下代码的计算结果为 15:
上面写着:
- 在第一个单元格中,分配 3(递增 3 次)
- 进入循环,移动到下一个单元格
- 赋值 5(递增 5 倍)
- 移回第一个单元格,并从其值中减去 1
- 点击右方括号,现在当前单元格(第一个)等于 2,因此跳回
[
并再次进入循环- 继续直到第一个单元格等于0,然后退出循环
- 移动到第二个单元格并输出值
.
第二个单元格中的值将增加到 15(以 5 为增量增加 3 次)。
问题:
基本上,我编写了两个函数来处理在文件[
的标题部分中推送和弹出最后一个位置的最后一个位置,即将 lexbuf 的当前位置推送和弹出到命名:brainfuck.mll
push_curr_p
pop_last_p
int list ref
loopstack
其他规则工作得很好,但它似乎忽略了[
and ]
。问题显然在于loopstack
我如何获取和设置lex_curr_p
状态。将不胜感激任何线索。
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
。
我无法弄清楚为什么添加这一行会给我一个语法错误...如果我在顶层输入相同的代码,它就可以正常工作。
parsing - Ocaml 解析器“未终止的操作”错误
我是 OCaml 的新手,我正在尝试使用解析器生成器 - ocamllex、ocamlyacc 为特定语言创建解析器。当我尝试编译我的parser.mly文件时,我收到以下错误:
错误(在 = 处带有标记):
以下是 parser.mly 文件的摘录:
parsing - 如何在 OCaml 词法分析器中执行“前瞻”/如何回滚词素?
好吧,我正在用 OCaml 编写我的第一个解析器,我立即设法用无限循环制作了一个解析器。
特别值得注意的是,我正在尝试根据 Scheme 规范的规则对标识符进行 lex 识别(显然,我不知道自己在做什么)——并且其中有一些关于标识符的语言要求它们后面跟一个定界符。我现在的方法是拥有一个delimited_identifier
包含其中一个delimiter
字符的正则表达式,它不应该被主词法分析器使用……然后一旦匹配,该词素的读取就会被恢复Sedlexing.rollback
(好吧,我的包装器) ,在传递给只吃实际标识符的子词法分析器之前,希望将缓冲区中的定界符作为不同的词位被父词法分析器吃掉。
我正在使用Menhir和Sedlex,主要是综合来自@smolkaj的ocaml-parsing
example-repo 和RWO 的解析章节的示例;这是我当前解析器和词法分析器的最简单简化:
……和……</p>
(是的,它基本上是一个无操作/最简单的事情。我正在努力学习!:x
)
不幸的是,这种组合导致解析自动机出现无限循环:
我对解析和词法分析以及所有这些都是新手;任何的建议都受欢迎。我敢肯定这只是一个新手的错误,但是……</p>
谢谢!
parsing - 基于令牌的内容在解析器杠杆处进行分支
我正在为一个小项目开发一个简单的示例解析器/词法分析器,但我遇到了一个问题。
我正在按照以下方式解析内容:
... 、 或空格中的任何SEP
一个(但不是多个!)在哪里。|
,
现在,我不想将字段顺序锁定在词法分析器顺序中,因此我尝试使用一组非常简单的标记来对此进行词法分析:
现在,如果gender
字段不包含一小组预先确定的值,例如{male,female,neither,unspecified}
. 我可以包装解析器并处理这个问题,但我真的很想将此要求编码到自动机中以供将来扩展。
我的第一次尝试,看起来像这样,可怕地失败了:
是的,没有骰子。显然,我对非结构化词法分析的尝试已经很糟糕了。
解析这样的东西的惯用方法是什么?
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 一起使用?