问题标签 [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.
ocaml - 取决于上下文的标记含义
我有一个奇怪的字符串语法,其中分隔符的含义取决于上下文。在以下示例输入中:
结果是两个字符串的列表["foo"; "bar"]
。外圆括号进入列表模式。然后,下一对括号分隔字符串。在字符串内部,平衡的括号对将被视为字符串的一部分。
现在,词法分析器根据全局变量决定返回什么inside
。
分隔符是括号。如果词法分析器遇到左括号,则
- 如果
inside
为false,它会发出一个Enter
令牌并inside
设置为true。 - 如果
inside
为true,它将切换到字符串词法分析器,它将任何正确嵌套的括号对视为字符串的一部分。如果嵌套级别返回零,则将字符串缓冲区传递给解析器。
如果在字符串外遇到右括号,Leave
则会发出一个标记并inside
取消设置。
我的问题是:如何在没有全局变量的情况下重写词法分析器inside
?
Fwiw 我使用 menhir,但对于 ocamlyacc 也是如此。(对不起,如果这听起来很混乱,我真的是 yacc/lex 方法的新手。我可以表达以上所有内容而不用考虑作为 PEG,但我还没有习惯在心理上将词法分析器和解析器分开。请随意指出解决代码的其他问题!)
简单示例:*sample_lexer.mll*
*sample_scanner.mly*:
主要.ml:
ocaml - Ocamllex 语法问题
有人可以解释一下主要功能是如何工作的吗?我已经理解了正则表达式部分,并且能够了解主要功能,但不是确切的含义。
syntax - Ocamllex - 字符之间有什么区别?(#)
他们有一个带有 ocamllex 的运算符,它是#
: 两个字符或字符集之间的区别。
在这里,有一个我不明白的概念:它是字符之间的差异。字符之间的区别是什么意思?因此,如果有人可以解释我,我接受它!
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 字节。
是状态转换表吗?如何“阅读”它?感谢您提供任何链接/提示!
ocaml - 访问匹配字符串 ocamllex 的一部分
我正在尝试安排 ocamllex 和 ocamlyacc 代码来扫描和解析一种简单的语言。我已经定义了相同的抽象语法,但发现难以扫描复杂的规则。这是我的代码
但我无法访问匹配字符串的某些部分。由于表达式声明是递归的,嵌套函数也无济于事(?)。请帮忙。
parsing - 通过打印有用信息来调试解析器
我想解析一组表达式,例如:X[3]
, X[-3]
, XY[-2]
,X[4]Y[2]
等。
在我的parser.mly
, index
(里面[]
)定义如下:
tokenINTEGER
等MINUS
在词法分析器中正常定义。
我尝试解析一个例子,它失败了。但是,如果我评论| MINUS INTEGER { 0 - $2 }
,它运作良好。所以问题肯定与此有关。为了调试,我想获得更多信息,换句话说,我想知道什么被认为是MINUS INTEGER
. 我试图添加打印:
但是解析时没有打印任何内容。
谁能告诉我如何打印信息或调试它?
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 3
and 2
are index
,`R[3]C
and R[2]C
are e_cell
,and R[3]C-R[2]C
is e_expression
。
有人可以帮忙吗?
tree - 树描述的语法示例 (lex/yacc)
我想从描述这棵树的文件中解析一棵树(这实际上是一个分类法)。
我正在寻找提供树描述的语法示例(最好是 lex/yacc 文件)。如果所描述的树不是二叉搜索树,而是每个节点(可能)有几个孩子的树(它称为家谱树吗?平面树?),那会更好。
理想情况下,如果这个 lex/yacc 实际包含在 OCaml 库中,那将是完美的。但是任何好的树描述语法都会让我满意。
我试图通过 Google 或 Stackoverflow 查找示例,但研究结果被与解析树相关的问题所淹没。我可以自己做一个语法,但我想先看看例子,以便有一个好的起点。
ocaml - ocamlyacc 永远不会减少规则
我在用 ocaml 编译我的词法分析器时收到警告:
我想解析字符串,我制定了一个特殊的规则,当词法分析器读取一个引号时开始,当我读取另一个引号时结束,在这种情况下返回字符串并为每个其他字符调用规则标记。
这是文件:
parsing - 解析子程序列表
我已经写了parser_sub.mly
,lexer_sub.mll
它可以解析一个subroutine
. A是由andsubroutine
包围的语句块。Sub
End Sub
实际上,我要处理的原始文件包含一个子程序列表和一些无用的文本。这是一个例子:
所以我需要编写parser.mly
and lexer.mll
which 可以通过忽略所有注释(例如haha
,' hehe
等)和调用来解析这个文件parser_sub.main
,并返回一个子例程列表。
谁能告诉我如何让解析器忽略所有无用的句子( a
Sub
and之外的句子End Sub
)?这是
/li>parser.mly
我试图写的一部分:for 的规则和解析
procedure_body
很复杂,实际上是在parser_sub.mly
and中定义的lexer_sub.mll
,那么我怎么能允许parser.mly
并且lexer.mll
不重复定义它,而只是调用parser_sub.main
呢?