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 を使用して ocamllyacc の目的を実行しようとしているように見えます。ocamllex で非常に単純なトークン (ブール値、数値、変数名など) を定義する必要があると思います。次に、ocamlyacc を使用して、Iszero、Diff、If などをどのように組み合わせて作成するかを定義します。ocamllex は、抽象構文で定義された構造を解析できるほど強力ではありません。

アップデート

これは、OCaml.org からリンクされているのを見つけた ocamlyacc チュートリアルです。私はそれを見て、それはよさそうだ。(ocamlyacc を使い始めたとき、yacc については既に知っていたので、すぐに使い始めることができました。)

于 2013-07-05T16:25:49.430 に答える