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

parsing - 解析中包含 2 个方向(字符串 <-> 标记)的表

我已经定义了一个哈希表keyword_table来存储我的语言的所有关键字。以下是部分代码:

由于关键字很多,我真的很想尽可能避免重复代码。

parser.mly中,似乎%token CALL CASE ...无法简化,因为必须明确定义每个标记。但是,就reserved_identifier部分而言,是否可以调用函数从令牌返回字符串,而不是对每个字符串进行硬编码?

因此,这可能表明哈希表不适合此目的。哪种数据结构是双方搜索的最佳选择(我们假设双方的每个键都是唯一的)?因此,我们要实现find_0 table "Call"returns token CALL(用于lexer.mll)和find_1 table CALLreturns "Call"(用于parser.mly)。

另外,如果table可以定义,我应该把它放在哪里以便parser.mly可以使用它?

0 投票
1 回答
124 浏览

ocaml - 是否可以让多个词法分析器共享相同的 ident 定义?

我有几个词法分析器:lexer_1.mll, lexer_2.mll, ...

ident( ) 的一些定义let ident = regexp在这些文件中很常见并且重复。例如,INTEGER, FLOAT, ...的定义

有谁知道是否可以在某个地方一次性定义它们,并让.mll文件调用它?

0 投票
1 回答
102 浏览

parsing - 通过制作单独的 .mly 和 .mll 来检索解析的一部分

我正在编写一个前端来解析一组txt文件,每个文件包含一组procedures,例如一个 txt 文件看起来像:

syntax.ml包含:

parser.mly好像:

现在,我想检索procedure_declaration(出于异常处理目的)的解析。这意味着,我想创建parser_pd.mlyand lexer_pd.mll,并让parser.mlycall parser_pd.main。因此,parser_pd.mly看起来像:

由于之前的大部分内容parser.mly都应该移到parser_pd.mly中,parser.mly现在应该比以前轻得多,看起来像:

问题是我不知道如何编写该??????部分,lexer.mll哪个应该很轻(因为它只读取 token和END,并让内容由 处理)。也许一些功能来自SUBEOSlexer_pd.mllLexing需要模块中的一些功能?

希望我的问题很清楚......有人可以帮忙吗?

0 投票
2 回答
105 浏览

parsing - Make a table containing tokens visible for both .mly an .mll

I would like to define a keyword_table which maps some strings to some tokens, and I would like to make this table visible for both parser.mly and lexer.mll.

It seems that the table has to be defined in parser.mly,

However, I could NOT use it in lexer.mll, for instance

Could anyone tell me where is the problem? Isn't it possible to make a data visible for both parser.mly and lexer.mll?

0 投票
2 回答
274 浏览

parsing - 通过 menhir 制作一个包含对 .mly 和 .mll 可见的令牌的表

我想定义一个keyword_table将一些字符串映射到一些标记的 a,并且我想让这个表对parser.mly和都可见lexer.mll

似乎该表必须在中定义parser.mly

但是,我不能使用它lexer.mll,例如

正如这个评论所暗示的,menhir有一个解决方案,谁能告诉我任何细节?

0 投票
0 回答
80 浏览

ocaml - 如何仅将表达式的一部分与ocamllex中的字符串匹配

我有一个简单的 ocamllex 程序,其中规则部分看起来像这样-

我的问题是假设我想匹配 Inc(X(7)) 以便我可以将其转换为我的抽象语法,即“Inc of var of int”。我希望我的词法分析器在读取 Inc(X(7)) 时给我单独的字符串,这样我得到“Inc”作为差异字符串(比如 inb),然后是“X”作为差异字符串(比如 inc)n,然后是"7" 作为一个 diff 字符串(比如 ind),这样我就可以使用这些字符串 inb、inc 和 ind,而不是像我的程序给出的那样被整个字符串 ine 卡住。如何解决这个问题?我希望我的问题很清楚

0 投票
1 回答
604 浏览

ocaml - 在 OCamllex 中使用 StringMap

我正在尝试编写一个 OCamllex 解析器,它从列表中构造单词的字符串映射。但是,当我尝试在标题中打开 StringMap 模块时收到“无界模块”错误:

当我没有显式打开模块以及尝试在预告片中创建地图时,也会发生相同的错误:

所有 OCaml 教程都建议我使用正确的语法;所以也许我在滥用 OCamllex(?) 我承认,标题、规则和预告片的范围对我来说并不清楚。我在文档中搜索了解决方案,但针对 OCamllex 的教程很少。谁能告诉我做错了什么?OCamllex 是否允许使用 StringMap 模块?

0 投票
1 回答
1019 浏览

compiler-construction - Ocaml 的错误 Eof

我正在为 Ocaml 中的类做一个编译器。我需要读取带有“1”之类的命令或表达式的文件,然后它返回 Int 1。除了我和我的朋友之外,相同的代码适用于整个班级。每个人都使用相同的 ocaml 版本和 Ubuntu 13.04。错误是:Lexico.Eof

有人知道这可能是什么吗?这是 asa.ml:

这是 Sintatico.mly:

Lexico.mll:

调用名为 carregatudo.ml 的文件的代码是:

对不起葡萄牙语:

arquivo 意味着文件

Lexico 意味着 Lexer

Sintatico 表示解析器

首先,我使用命令 make interpretador 运行这个 makefile:

接下来是carregatudo.ml:#use "carregatudo.ml";;

接下来是函数: analisa_arquivo("teste.pt");;

输入文件 teste.pt 如下:

并且回报应该是

但我不断收到错误 Lexico.Eof

谢谢!

0 投票
1 回答
1873 浏览

ocaml - OCamllex:正则表达式

目前我正在尝试用 Ocaml 编写一个解释器,这是我的 lexer.mll:

我真的很困惑为什么 ocamllex 在 { FILE_NAME lxm } 行给我一个错误。如果我放在#load "str.cma"词法分析器的开头,它会在该行打印出错误语法错误。

为什么?我很困惑...

编辑

应该[ [^\\]*\.(\w+)$ ] as lxm { FILE_NAME lxm }

但是问题还是没有解决...

0 投票
2 回答
280 浏览

ocaml - OCaml 解释器:为什么我的解释器只执行文件中的一行

我正在编写一个解释器,使用 ocamlyacc 和 ocamllex 来编译我的解析器和词法分析器。

我的问题是,我有一个名为 test 的文件,其中包含 lexer 中定义的 2 个命令:

但解释器只执行行print a!我知道问题出在解析器中,需要递归。我把它修成这样(下面的代码),但它仍然不起作用。

编辑

这是我的词法分析器,我试图尽可能简化它以发现错误。

主文件