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