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