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

ocaml - 取决于上下文的标记含义

我有一个奇怪的字符串语法,其中分隔符的含义取决于上下文。在以下示例输入中:

结果是两个字符串的列表["foo"; "bar"]。外圆括号进入列表模式。然后,下一对括号分隔字符串。在字符串内部,平衡的括号对将被视为字符串的一部分。

现在,词法分析器根据全局变量决定返回什么inside

分隔符是括号。如果词法分析器遇到左括号,则

  • 如果insidefalse,它会发出一个 Enter令牌并inside设置为true
  • 如果insidetrue,它将切换到字符串词法分析器,它将任何正确嵌套的括号对视为字符串的一部分。如果嵌套级别返回零,则将字符串缓冲区传递给解析器。

如果在字符串外遇到右括号,Leave则会发出一个标记并inside取消设置。

我的问题是:如何在没有全局变量的情况下重写词法分析器inside

Fwiw 我使用 menhir,但对于 ocamlyacc 也是如此。(对不起,如果这听起来很混乱,我真的是 yacc/lex 方法的新手。我可以表达以上所有内容而不用考虑作为 PEG,但我还没有习惯在心理上将词法分析器和解析器分开。请随意指出解决代码的其他问题!)

简单示例:*sample_lexer.mll*

*sample_scanner.mly*:

主要.ml

0 投票
1 回答
129 浏览

ocaml - Ocamllex 语法问题

有人可以解释一下主要功能是如何工作的吗?我已经理解了正则表达式部分,并且能够了解主要功能,但不是确切的含义。

0 投票
2 回答
97 浏览

syntax - Ocamllex - 字符之间有什么区别?(#)

他们有一个带有 ocamllex 的运算符,它是#: 两个字符或字符集之间的区别。

在这里,有一个我不明白的概念:它是字符之间的差异。字符之间的区别是什么意思?因此,如果有人可以解释我,我接受它!

0 投票
1 回答
168 浏览

ocaml - ocamllex 生成的文件

该理论说关于 lex 工具(我读过 ocamllex),它会将正则表达式的集合转换为 DFA 的 C(OCaml)代码(实际上在 NFA 和 NFA2DFA 中)。DFA M 的正式定义是一个 5 元组 M = { Q, Sigma, transition_function, q0, F}。我在生成的文件中发现如下:

  • 一条名为 __ocaml_lex_tables 的记录,其中包含来自 Lexing 模块的字段
  • 递归函数

DFA 的对象/结构与 ocamllex 生成的结构之间是否存在映射?我无法“看到”它......我也在谷歌搜索寻求帮助,但我没有找到任何有用的例子。
ocamllex 工具的答案在 DFA 上下文中是有意义的,例如7 个状态、279 个转换、表大小 1158 字节

是状态转换表吗?如何“阅读”它?感谢您提供任何链接/提示!

0 投票
1 回答
112 浏览

ocaml - 访问匹配字符串 ocamllex 的一部分

我正在尝试安排 ocamllex 和 ocamlyacc 代码来扫描和解析一种简单的语言。我已经定义了相同的抽象语法,但发现难以扫描复杂的规则。这是我的代码

但我无法访问匹配字符串的某些部分。由于表达式声明是递归的,嵌套函数也无济于事(?)。请帮忙。

0 投票
1 回答
373 浏览

parsing - 通过打印有用信息来调试解析器

我想解析一组表达式,例如:X[3], X[-3], XY[-2],X[4]Y[2]等。

在我的parser.mly, index(里面[])定义如下:

tokenINTEGERMINUS在词法分析器中正常定义。

我尝试解析一个例子,它失败了。但是,如果我评论| MINUS INTEGER { 0 - $2 },它运作良好。所以问题肯定与此有关。为了调试,我想获得更多信息,换句话说,我想知道什么被认为是MINUS INTEGER. 我试图添加打印:

但是解析时没有打印任何内容。

谁能告诉我如何打印信息或调试它?

0 投票
2 回答
130 浏览

parsing - 解析一组表达式时发生冲突

我想解析一组表达式:R[3]C, R[2]C, R[3]C-R[2]C... 有一个我无法解决的冲突...

这是一部分lexer.mll

的一部分parser.mly

奇怪的是,这段代码不起作用R[3]C-R[2]C,这里是parser.conflicts,我无法真正理解。

如果我注释行| R LBRACKET r = index RBRACKET C c = index ...中的行e_cell,代码可以解析R[3]C-R[2]C,where 3and 2are index`R[3]Cand R[2]Care e_cell,and R[3]C-R[2]Cis e_expression

有人可以帮忙吗?

0 投票
1 回答
1590 浏览

tree - 树描述的语法示例 (lex/yacc)

我想从描述这棵树的文件中解析一棵树(这实际上是一个分类法)。

我正在寻找提供树描述的语法示例(最好是 lex/yacc 文件)。如果所描述的树不是二叉搜索树,而是每个节点(可能)有几个孩子的树(它称为家谱树吗?平面树?),那会更好。

理想情况下,如果这个 lex/yacc 实际包含在 OCaml 库中,那将是完美的。但是任何好的树描述语法都会让我满意。

我试图通过 Google 或 Stackoverflow 查找示例,但研究结果被与解析树相关的问题所淹没。我可以自己做一个语法,但我想先看看例子,以便有一个好的起点。

0 投票
1 回答
369 浏览

ocaml - ocamlyacc 永远不会减少规则

我在用 ocaml 编译我的词法分析器时收到警告:

我想解析字符串,我制定了一个特殊的规则,当词法分析器读取一个引号时开始,当我读取另一个引号时结束,在这种情况下返回字符串并为每个其他字符调用规则标记。

这是文件:

0 投票
2 回答
97 浏览

parsing - 解析子程序列表

我已经写了parser_sub.mlylexer_sub.mll它可以解析一个subroutine. A是由andsubroutine包围的语句块。SubEnd Sub

实际上,我要处理的原始文件包含一个子程序列表和一些无用的文本。这是一个例子:

所以我需要编写parser.mlyand lexer.mllwhich 可以通过忽略所有注释(例如haha' hehe等)和调用来解析这个文件parser_sub.main,并返回一个子例程列表。

  1. 谁能告诉我如何让解析器忽略所有无用的句子( a Suband之外的句子End Sub)?

    这是parser.mly我试图写的一部分:

    /li>
  2. for 的规则和解析procedure_body很复杂,实际上是在parser_sub.mlyand中定义的lexer_sub.mll,那么我怎么能允许parser.mly并且lexer.mll不重复定义它,而只是调用parser_sub.main呢?