问题标签 [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 - Set a rule based on the value of a global variable
In my lexer & parser by ocamllex and ocamlyacc, I have a .mly
as follows:
In params.ml
, a variable separator
is defined. Its value is either ;
or ,
and set by the upstream system.
In the .mly
, I want the rule of expr_separators
to be defined based on the value of Params.separator
. For example, when params.separtor
is ;
, only [1;2;3]
is considered as expr
, whereas [1,2,3]
is not. When params.separtor
is ,
, only [1,2,3]
is considered as expr
, whereas [1;2;3]
is not.
Does anyone know how to amend the lexer and parser to realize this?
PS:
The value of Params.separator
is set before the parsing, it will not change during the parsing.
At the moment, in the lexer, ,
returns a token COMMA
and ;
returns SEMICOLON
. In the parser, there are other rules where COMMA
or SEMICOLON
are involved.
I just want to set a rule expr_separators
such that it considers ;
and ignores ,
(which may be parsed by other rules), when Params.separator
is ;
; and it considers ,
and ignore ;
(which may be parsed by other rules), when Params.separator
is ,
.
ocaml - 在 ocamllex 中对字符串进行词法分析
我一直在试图找到一个能够在 ocamllex 中处理字符串的好例子时遇到了一些麻烦。我发现桌面计算器示例有点用,但还没有真正找到一种方法来以类似的方式实现它,它也使用字符串,这是我引用的示例:
任何帮助将不胜感激。
ocaml - 为什么会出现这种语法错误?外壳没有给定原因
我刚刚写完这段模式匹配(下面附上)。无论我如何尝试修复它,当我尝试编译它时仍然存在“错误:语法错误”。
这段代码在这里:
错误在let compile (p: Ast.program) : result =
这是(来自外壳):
ocaml - 以外的任何字符
我为 ocamllex 定义了一个标记let non_line_termination_character = [^ '\x0D' '\x0A']
,它代表除'\x0D'
and之外的任何字符'\x0A'
。
现在,我想把它翻译成 sedlex。
有谁知道如何正确翻译?我应该使用SUB
(例如,SUB(SUB(any, '\x0D'), '\x0A')
或SUB(any, ('\x0D' | '\x0A'))
)吗?
parsing - 确定是什么减慢了词法分析器的编译速度
我有一个词法分析器和解析器,用 OCaml 中的 sedlex 和 menhir 构建,用于解析电子表格公式。
词法分析器的以下部分在引用之前定义了路径+工作簿+工作表部分的正则表达式。例如,'C:\Users\Pictures\[Book1.xlsx]Sheet1'!
的='C:\Users\Pictures\[Book1.xlsx]Sheet1'!A1:B2
。
没有最后4个lex_before
(即(lex_file, "!") | (lex_file_wo_brackets, "!") | ("'", lex_file, "'!") | ("'", lex_file_wo_brackets, "'!")
),项目编译(by)的总时间ocamlc
是3分30秒(耗时是编译的lexer.ml
)。加上这 4 个案例,编译的总时间是 13 分 40 秒。需要时间的总是编译lexer.ml
。
有谁知道我们如何确定是什么减慢了编译速度?
我编写命名正则表达式的方式有什么问题会减慢编译速度吗?
ocaml - sedlex 和 ocaml 不会向 $startpos 和 $endpos 发送相同的位置信息
以前,我有一个由 menhir 和 ocamllex 制作的解析器和词法分析器。在解析器中,我使用$startpos
and $endpos
:
其中Loc.print
定义为:
在词法分析器中,我具有以下功能来打印 loc 信息:
结果,'a\n+b'
返回以下输出:
然后,我使用 sedlex 制作词法分析器,我有以下功能来打印 loc 信息:
结果, 'abc\n+d'
返回以下输出:
注意,因为换行,这里的location of+
和location ofd
没有很好的计算。结果,我的 loc 信息expression
不再好。
有谁知道如何解决这一问题?
compiler-construction - 使用没有解析器模块的 ocamllex 构建词法分析器
在用 menhir 构建解析器之前,我想用 ocamllex 构建一个词法分析器。
我已经编写了 .mll 文件。以下命令给了我这个消息:
然后我输入了以下内容:
.ml 文件的摘录:
我的理解是这些动作没有映射到任何东西,因此是未绑定的错误。
最后,我想知道的是如何在不编写解析器或 .mly 文件的情况下进行这些映射?我对这门语言很陌生,我想要实现的是一个用 ocamllex 构建的简单词法分析器。
functional-programming - 如何覆盖 Ocaml 中的模块方法
假设我有一个模块 A,它覆盖了模块 B 中的一些方法。我希望模块 A 通过覆盖 B 或其他方式来防止模块 A 中的这种覆盖。
我需要这个来从 YoJSON 获取行号。我尝试使用其他解析器,但它们没有 YoJSON 那么多的功能。
YoJSON 的 read.ml 中的以下代码阻止了缓冲区中的行号
来源:https ://github.com/ocaml-community/yojson/blob/master/lib/read.mll
有没有办法可以扭转这种行为?是否会再次覆盖 Lexer,然后覆盖 YoJSON 中使用 Lexer 的所有方法?
或者有没有办法用 YoJSON 或其他解析器以其他方式获取 json 成员的行号?
json - 在 OCaml 中使用 Jsonm 选择 Json 成员
我想使用 JSONM 和 OCaml 获取 json 文件中成员元素的特定出现的所有位置的列表。我知道如何在 YoJSON 中做到这一点,但无法在 jsonm 中找到方法。
json文件如下:
我想Jsonm.decoded_range
在“a”中获取名称为“blah”的事件对象列表。它可以出现两次。
我目前有以下代码,但它只是让我第一次出现名为 blah 的对象。
parsing - 在 parser.mly 文件中列出标记是否有优先权?
就像我在解析器的开头列出了一些标记一样
是否有任何类型的优先级与此相关?或者这只是一个对订购没有特别重要意义的代币列表?