问题标签 [ocamlyacc]
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 - 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
!我知道问题出在解析器中,需要递归。我把它修成这样(下面的代码),但它仍然不起作用。
编辑
这是我的词法分析器,我试图尽可能简化它以发现错误。
主文件
ocaml - OCaml 解释器:评估函数内部的函数
我正在尝试编写解释器,OCaml
但这里有问题。
在我的程序中,我想调用这样的函数,例如:
我怎样才能做到这一点?问题出在我们的解析器中,我认为它定义了程序的运行方式、函数的定义方式以及程序的流程。这是我迄今为止在解析器和词法分析器中所拥有的(下面的代码),但它似乎没有用。我真的看不出我的代码和OCaml 网站上的计算器有什么区别,括号内的语句首先被评估,然后将其值返回给其父操作以进行下一次评估。
在我的解释器中,get_line
括号内的函数首先被评估,但我认为它不会将值返回给print
函数,或者它确实返回了错误的类型(检查过,但我认为不是这个错误)。
计算器和我的解释器之间的一个区别是计算器使用原始类型,我的是函数。但它们应该是相似的。
这是我的代码,只是其中的一部分:
解析器.mly:
词法分析器.mll:
include - ocamlyacc 中的 C 样式包含文件
谁能帮助我如何在 ocamlyacc 中启用 C 风格的包含文件?例如:#include "mylib.txt";
。
ocaml - 用于 :: case 的 OCaml 解析器
我在关联性方面遇到了麻烦。出于某种原因,我的 = 运算符的优先级高于我的 :: 运算符
例如,如果我有
“1::[] = []”
作为一个字符串,我会得到
1 = []::[]
作为我的表达,而不是
[1] = []
如果我的字符串是“1::2::[] = []”
我以为我会把它解析成 exp1 EQ exp2,然后从那时起它会解析 exp1 和 exp2。但它被解析为 exp1 COLONCOLON exp2
ocaml - 扩展 ocamllex 以获得更大的词典
有没有办法让 ocammlex 使用更多关键字?我为德语编写了一个解释器和解析器,为了语言分析,它将德语文本“编译”成乳胶图片。它工作得非常好,并且在语言学领域确实是新的。感谢 ocaml 的所有开发人员,您可以在此类事情上滥用 ocamllex 和 menhir 等工具。但很快我就会到达 ocammlex-automaton 的极限,它会说:“自动机变大”。
我知道哈希表的解决方案。我还没有尝试过,如果这解决了即将出现的问题,但是有人知道,如果在 ocamllex-source-code 中更改某种类型的限制整数等很容易,我可以在不更改程序代码的情况下滥用它? 在我看来,这个关于自动化大小的错误对于进一步滥用来说是不必要的愚蠢和尴尬,所以我想问一下。
感谢,并有一个愉快的一天。
ocaml - OCaml 解析器中的 $1 和 $3 表示什么?
这是 OCaml 解析器的示例代码:
我也有扫描仪和 AST(抽象语法树)的代码。这里的 1 美元和 3 美元是什么意思?
附录: 我想为变量赋值。我还想将所有变量的值存储在一个数组中。我怎样才能做到这一点?
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 的运行?
ocaml - 使用具有用户定义类型的原始函数
我在 ocamlyacc 中遇到问题,我的起点类型与我所有规则的返回类型不匹配(我在一个点返回一个字符串,在另一个点返回一个字符串列表 -> 字符串提升),所以我做了一种新类型:
所以我可以将入口点的类型设置为那个来停止我得到的错误(我不知道是否有更好的方法来做到这一点?),但这意味着现在当我想连接两个字符串时SI 型不能只使用 ^。有没有办法做到这一点?
谢谢