问题标签 [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 - 解析中包含 2 个方向(字符串 <-> 标记)的表
我已经定义了一个哈希表keyword_table
来存储我的语言的所有关键字。以下是部分代码:
由于关键字很多,我真的很想尽可能避免重复代码。
在parser.mly
中,似乎%token CALL CASE ...
无法简化,因为必须明确定义每个标记。但是,就reserved_identifier
部分而言,是否可以调用函数从令牌返回字符串,而不是对每个字符串进行硬编码?
因此,这可能表明哈希表不适合此目的。哪种数据结构是双方搜索的最佳选择(我们假设双方的每个键都是唯一的)?因此,我们要实现find_0 table "Call"
returns token CALL
(用于lexer.mll
)和find_1 table CALL
returns "Call"
(用于parser.mly
)。
另外,如果table
可以定义,我应该把它放在哪里以便parser.mly
可以使用它?
ocaml - 是否可以让多个词法分析器共享相同的 ident 定义?
我有几个词法分析器:lexer_1.mll
, lexer_2.mll
, ...
ident
( ) 的一些定义let ident = regexp
在这些文件中很常见并且重复。例如,INTEGER
, FLOAT
, ...的定义
有谁知道是否可以在某个地方一次性定义它们,并让.mll
文件调用它?
parsing - 通过制作单独的 .mly 和 .mll 来检索解析的一部分
我正在编写一个前端来解析一组txt
文件,每个文件包含一组procedures
,例如一个 txt 文件看起来像:
syntax.ml
包含:
parser.mly
好像:
现在,我想检索procedure_declaration
(出于异常处理目的)的解析。这意味着,我想创建parser_pd.mly
and lexer_pd.mll
,并让parser.mly
call parser_pd.main
。因此,parser_pd.mly
看起来像:
由于之前的大部分内容parser.mly
都应该移到parser_pd.mly
中,parser.mly
现在应该比以前轻得多,看起来像:
问题是我不知道如何编写该??????
部分,lexer.mll
哪个应该很轻(因为它只读取 token和END
,并让内容由 处理)。也许一些功能来自SUB
EOS
lexer_pd.mll
Lexing
需要模块中的一些功能?
希望我的问题很清楚......有人可以帮忙吗?
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
?
parsing - 通过 menhir 制作一个包含对 .mly 和 .mll 可见的令牌的表
我想定义一个keyword_table
将一些字符串映射到一些标记的 a,并且我想让这个表对parser.mly
和都可见lexer.mll
。
似乎该表必须在中定义parser.mly
,
但是,我不能使用它lexer.mll
,例如
正如这个评论所暗示的,menhir
有一个解决方案,谁能告诉我任何细节?
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 卡住。如何解决这个问题?我希望我的问题很清楚
ocaml - 在 OCamllex 中使用 StringMap
我正在尝试编写一个 OCamllex 解析器,它从列表中构造单词的字符串映射。但是,当我尝试在标题中打开 StringMap 模块时收到“无界模块”错误:
当我没有显式打开模块以及尝试在预告片中创建地图时,也会发生相同的错误:
所有 OCaml 教程都建议我使用正确的语法;所以也许我在滥用 OCamllex(?) 我承认,标题、规则和预告片的范围对我来说并不清楚。我在文档中搜索了解决方案,但针对 OCamllex 的教程很少。谁能告诉我做错了什么?OCamllex 是否允许使用 StringMap 模块?
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
谢谢!
ocaml - OCamllex:正则表达式
目前我正在尝试用 Ocaml 编写一个解释器,这是我的 lexer.mll:
我真的很困惑为什么 ocamllex 在 { FILE_NAME lxm } 行给我一个错误。如果我放在#load "str.cma"
词法分析器的开头,它会在该行打印出错误语法错误。
为什么?我很困惑...
编辑
应该[ [^\\]*\.(\w+)$ ] as lxm { FILE_NAME lxm }
但是问题还是没有解决...
ocaml - OCaml 解释器:为什么我的解释器只执行文件中的一行
我正在编写一个解释器,使用 ocamlyacc 和 ocamllex 来编译我的解析器和词法分析器。
我的问题是,我有一个名为 test 的文件,其中包含 lexer 中定义的 2 个命令:
但解释器只执行行print a
!我知道问题出在解析器中,需要递归。我把它修成这样(下面的代码),但它仍然不起作用。
编辑
这是我的词法分析器,我试图尽可能简化它以发现错误。
主文件