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が生成する .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関数. 構文解析関数. 現在の入力を指定して呼び出すと,構文解析結果と残りのトークンストリームを返す.