プログラミング言語SML#解説 3.7.1版
30 構文解析器生成ツール smlyaccとsmllex

30.3 smlyacc出力ファイルの構造とインタフェイスファイル記述

smlyaccが生成するYaccInputFile.grm.smlは,以下の シグネチャをもつストラクチャである.

    signature ML_LRVALS =
      sig
         structure Tokens : ML_TOKENS
         structure Parser : PARSER
         sharing type Parser.token = Tokens.token
      end

このシグネチャを含むsmlyaccのサポートライブラリは, smlyacc-lib.smiにまとめられている. 生成された構文解析プログラムをSML#で使用するためには, 以下のインタフェイスを書く必要がある.

    _require "basis.smi"
    _require "ml-yacc-lib.smi"

    structure <Name> =
    struct
      structure Parser =
      struct
        type token (= boxed)
        type stream (= boxed)
        type result = Absyn.parseresult
        type pos = int
        type arg = unit
        exception ParseError
        val makeStream : {lexer:unit -> token} -> stream
        val consStream : token * stream -> stream
        val getStream : stream -> token * stream
        val sameToken : token * token -> bool
        val parse : {lookahead:int,
                     stream:stream,
                     error: (string * pos * pos -> unit),
                     arg: arg}
                    -> result * stream
      end
      structure Tokens =
      struct
        type pos = Parser.pos
        type token = Parser.token
        <the set of Token forming functions>
         ...
        val EOF: word *  pos * pos -> token
        val CHAR: string *  pos * pos -> token
        ....
      end
    end

Parserストラクチャのposargresult型以外は, そのまま指定する. Tokenストラクチャは,smlyaccが生成する YaccInputFileName.grm.sigの内容をここにコピーする.

それぞれの要素の概要を以下に説明する.

  • token 型. smllexで生成される字句解析処理が返す語彙(トークン)を表す抽象データ型.

  • stream 型. smlyaccで生成される構文解析器の入力ストリーム型.

  • result 型. 構文解析器の出力である抽象構文木のデータ型. YaccInputFile.grmで指定した最上位の構文規則 の属の性の型と同一である.

  • pos 型. YaccInputFile.grmで指定し,smllexで生成 した字句解析器が使用するポジション型.

  • arg 型. YaccInputFile.grmで指定したパーザの引数型. 必要なければunit型でよい.

  • ParseError例外. 構文解析器が構文エラーを検出した時の例外.

  • makeStream関数. 構文解析器の引数に指定するstream型を生成する関数. 引数には,通常,smllexが生成する字句解析器を指定する.

  • consStream関数. 現在の入力ストリームに字句を一つ戻す関数.

  • getStream関数. 現在の入力ストリームを読み先頭の字句を一返す関数.

  • sameToken関数. 字句の同一性をチェックする関数.

  • parse関数. 構文解析関数. 現在の入力を指定して呼び出すと,構文解析結果と残りのトークンストリームを返す.