问题标签 [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 - OCaml 解释器:评估函数内部的函数
我正在尝试编写解释器,OCaml
但这里有问题。
在我的程序中,我想调用这样的函数,例如:
我怎样才能做到这一点?问题出在我们的解析器中,我认为它定义了程序的运行方式、函数的定义方式以及程序的流程。这是我迄今为止在解析器和词法分析器中所拥有的(下面的代码),但它似乎没有用。我真的看不出我的代码和OCaml 网站上的计算器有什么区别,括号内的语句首先被评估,然后将其值返回给其父操作以进行下一次评估。
在我的解释器中,get_line
括号内的函数首先被评估,但我认为它不会将值返回给print
函数,或者它确实返回了错误的类型(检查过,但我认为不是这个错误)。
计算器和我的解释器之间的一个区别是计算器使用原始类型,我的是函数。但它们应该是相似的。
这是我的代码,只是其中的一部分:
解析器.mly:
词法分析器.mll:
compiler-construction - 将源代码位置信息添加到前端
我正在编写一个静态分析器,包括特定语言程序的前端。
前端成功地从程序生成 AST,分析器在该程序上运行良好:它要么证明程序正确(对于某些特定属性),要么为语句或表达式引发错误。
如果出现错误,我想明确错误消息。因此,我想localisation
在源代码中为引发错误的语句或表达式添加确切的内容。展示line number
已经很好,展示会row number
更好......
谁能告诉我如何修改前端来做到这一点?或者有什么我可以研究的文件吗?
(我想首先我需要修改 AST 中的类型,但我必须添加loc
到所有内容吗?)
regex - 在 ocamllex 中将重复与正则表达式匹配
我正在尝试用 ocamllex 为一些特殊的母语编写一个词法分析器(为了我的目的而做了一些修改)。有些单词应与它们的第一个字符匹配,即加倍。但是我没有找到任何方法来表达第一个字符的重复。我也不能使用正则表达式语法
(['a'-'z'])\1['a'-'z']+
用那个“\1”。Ocamllex 说“非法转义序列 \1”。我认为转义表达式的语法真的没问题,但肯定那不是我想要的。我也不能以任何方式使用带有花括号的重复语法(但这无论如何都不能解决问题):
['a'-'z']{2}['a'-'z']+
我认为正则表达式后的花括号中的 oCaml 代码存在冲突。
有人对此有想法吗?
非常感谢您。
ocaml - 扩展 ocamllex 以获得更大的词典
有没有办法让 ocammlex 使用更多关键字?我为德语编写了一个解释器和解析器,为了语言分析,它将德语文本“编译”成乳胶图片。它工作得非常好,并且在语言学领域确实是新的。感谢 ocaml 的所有开发人员,您可以在此类事情上滥用 ocamllex 和 menhir 等工具。但很快我就会到达 ocammlex-automaton 的极限,它会说:“自动机变大”。
我知道哈希表的解决方案。我还没有尝试过,如果这解决了即将出现的问题,但是有人知道,如果在 ocamllex-source-code 中更改某种类型的限制整数等很容易,我可以在不更改程序代码的情况下滥用它? 在我看来,这个关于自动化大小的错误对于进一步滥用来说是不必要的愚蠢和尴尬,所以我想问一下。
感谢,并有一个愉快的一天。
ocaml - 如何在 OCaml 中将 StringMap 转换为 List?
我对 OCaml 很陌生,正在尝试将 StringMap 转换为 OCaml 中的 List。
该地图是从之前的列表中生成的。
上面代码的最后一行给了我以下错误: This expression has type StringMap.key list -> int StringMap.t but an expression is expected to type 'a StringMap.t = 'a Map.Make(String).t
请注意:此代码输入到 ocamllex 文件 (.mll) 中,当我尝试执行生成的词法分析器 (.ml) 文件时出现此错误。
为什么我会收到此错误?如何让我的代码工作?
谢谢!
regex - 在 OCaml 扫描仪中,为什么负整数的正则表达式不起作用?
我有以下 ocamllex 代码:
这行得通!
但是,当我想允许 INTEGER 的 + 和 - 符号时,它给了我一个错误。
错误如下:
有趣的是,在我的 .ml 文件中,我使用的是“float_of_string”,但我没有在任何地方使用“int_of_string”。
regex - 如何在 OCaml 中使用“匹配”和正则表达式匹配字符串?
我的 OCaml .ml 代码如下所示:
为什么上面的代码不起作用?我怎样才能让它工作?
编辑:
我不需要做很多解析。所以,我希望它保留在 OCaml .ml 文件中,而不是 OCamllex 文件中
ocaml - 是否可以在 ocamllex 中定义一个在不消耗下一个字符的情况下向前看的规则?
我正在使用 ocamllex 为脚本语言编写词法分析器,但我正面临与我的评论规则的冲突。
我想让我的命令参数不被引用,只要它们只包含字母数字字符和斜杠“/”。例如:
此外,我的先决条件之一是带有“//”的 C++ 风格注释
这带来的问题是
我希望我的词法分析器生成一个“foo”标记,同时保持“//”不变,以便在下次我向词法分析器请求标记时使用。那可能吗?这样做的原因是输入缓冲区可能尚未到达评论的末尾,我宁愿立即返回“foo”令牌,也不愿不必要地阻止试图急切地使用评论。
ocaml - 使用 menhir 报告多个错误:哪个令牌?
我正在用 Menhir + Ocamllex 编写一个小型解析器,我有两个似乎无法同时满足的要求
- 我想在出错后继续解析(报告更多错误)。
- 我想打印发生错误的令牌。
error
通过使用令牌,我只能轻松地做 1) 。我也可以使用为这个问题建议的方法轻松地做 2) 。但是,我不知道实现两者的简单方法。
我现在处理错误的方式是这样的:
对我有帮助的一件事是访问 lexbuf 本身,因此我可以直接获取令牌。这意味着$startpos
我不会通过类似 $lexbuf
但据我所知,没有官方方法可以访问 lexbuf。1中的解决方案仅适用于解析器的调用者级别,其中调用者本身将 lexbuf 传递给解析器,但不在语义操作中。
有谁知道它是否真的以某种方式可用?或者也许是一种解决方法?
compilation - ocamlyacc 上的表达式类型错误
作为学校项目的一部分,我必须识别 .dot 文件并生成相应的解析树。为此,我必须使用我遇到困难的 ocamllex 和 ocamlyacc ......
这是我的 ocaml .mli 类型文件:
这是我的词法分析器文件:
这是我未完成的 yacc 文件:
识别一个简单的点文件似乎就足够了
但是当我尝试编译我的解析器接口时,我得到了这个错误:这个表达式的类型是'a list,但是一个表达式应该是 Types.graph 类型的(指ID EDGE ID SEMICOLON {[$1,$3)]}
line )
我不明白,因为 {[$1,$3]} 有一个 (string * string) 列表类型。如果我们正在寻找可以是图表的 types.mli。
否则,我是否正确理解 ocamllex 和 ocamlyacc 的运行?