0

我正在尝试安排 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* ')' {??}

但我无法访问匹配字符串的某些部分。由于表达式声明是递归的,嵌套函数也无济于事(?)。请帮忙。

4

1 回答 1

2

为了稍微详细说明我上面的评论,在我看来,您正在尝试使用 ocamllex 来完成 ocamlyacc 的用途。我认为您需要在 ocamllex 中定义非常简单的标记(如布尔值、数字和变量名),然后使用 ocamlyacc 来定义它们如何组合在一起以生成诸如 Iszero、Diff 和 If 之类的东西。ocamllex 的功能不足以解析抽象语法定义的结构。

更新

这是我从 OCaml.org 找到的一个 ocamlyacc 教程,这是一个很好的认可:OCamlYacc 教程。我看了看,它看起来不错。(当我开始使用 ocamlyacc 时,我已经了解 yacc,所以我能够很快上手。)

于 2013-07-05T16:25:49.430 回答