プログラミング言語SML#解説 4.1.0版
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ストラクチャのpos,arg,result型以外は, そのまま指定する. 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関数. 構文解析関数. 現在の入力を指定して呼び出すと,構文解析結果と残りのトークンストリームを返す.