我正在尝试安排ocamllex和ocamlyacc代码来扫描和解析一种简单的语言。我已经定义了相同的抽象语法,但我发现难以扫描复杂的规则。这是我的代码
{
type exp = B of bool | Const of float | Iszero of exp | Diff of exp*exp |
If of exp * exp * exp
}
rule scanparse = parse
|"true"| "false" as boolean {B boolean}
|['0'-'9']+ "." ['0'-'9']* as num {Const num}
|"iszero" space+ ['a'-'z']+ {??}
|'-' space+ '(' space* ['a'-'z']+ space* ',' space* ['a'-'z']+ space* ')' {??}
但是我无法访问匹配字符串的某些部分。由于表达式声明是递归的,嵌套函数也没有帮助(?)。请帮忙。
答案 0 :(得分:2)
为了详细说明我上面的评论,我觉得你在尝试使用ocamllex来做ocamlyacc的用途。我认为你需要在ocamllex中定义非常简单的标记(比如布尔值,数字和变量名),然后使用ocamlyacc来定义它们如何组合起来制作Iszero,Diff和If之类的东西。 ocamllex的功能不足以解析抽象语法定义的结构。
<强>更新强>
这是我从OCaml.org链接的ocamlyacc教程,这是一个非常好的认可:OCamlYacc tutorial。我仔细研究了它看起来很好。 (当我开始使用ocamlyacc时,我已经知道了yacc,所以我能够很快地进行。)