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