プログラミング言語SML#解説 3.7.1版
30 構文解析器生成ツール smlyaccとsmllex

30.2 smlyacc入力ファイルの構造

smlyaccの入力ファイルは以下の形式で記述する.

ユーザ定義のSML#コード
%%
構文規則解析のためのYACC宣言
%%
構文規則とその属性の定義

  1. 1.

    ユーザ定義のSML#コードのセクションには,構文規則の属性定 義等で使用する補助関数などのユーザコードを指定する.

  2. 2.

    構文規則解析のためのYACC宣言では,非終端記号の結合方向などの構文定義の解釈に関する宣言や smlyaccの動作に関する指示を指定する. 非終端記号の結合方向などの構文定義の解釈に関する宣言に関しては標準のYACCの入力形式と同一 である. 詳しくは,src/ml-yacc/doc/mlyacc.pdfを参照せよ.

    SML#で使用する場合,smlyaccが生成するストラクチャ に関する以下の指示を指定する.

        %name <Name>
        %header (structure <Name>)
        %eop EOF SEMICOLON
        %pos int
        %term EOF
           | CHAR of char
            ...
        %nonterm id of Symbol.symbol
           | longid of Symbol.longsymbol
            ...
    
    • %name指定. パーザの名前を指定する. この名前からトークンストラクの名前 <Name>_TOKENSが生成される.

    • %header指定. smlyaccは,パーザ本体をストラクチャのボディとして以下の形式 で生成する.

          = struct
             ...
          end
      

      %header()はこのストラクチャ本体に前置するコードフラグメン トをカッコの中に指定する. パーザをSML#の分割コンパイルモードで使用する場合, 単独のストラクチャとなるように,上記のようにストラクチャ宣言を指定する.

    • %pos指定. smllexで使用するポジションの型を指定する.

    • %eop指定. 構文解析を終了する終端記号集合を指定する.

    • %term指定. 終端記号名の集合をSML#のdatatypeのコンストラクタの指定の形式 で定義する. ここで指定されたそれぞれの終端器号名に対して, EOF : pos * pos -> token (引数が無い場合)や CHAR : char * pos * pos -> token (引数がある場合) の型のトークン生成関数が作成される. これら関数はトークンストラクチャ <Name>_TOKENS にまとめられsmllexと共有される.

    • %nonterm指定. 非終端記号名の集合とその非終端記号を左辺にもつ規則が還元された場合に それに付随して生成される属性の型を指定する.

  3. 3.

    構文規則とその属性の定義では,終端記号と非終端記号の定義おおび構 文解析の対象言語のLALR文法とその属性を規則の集合として記述する. これら規則の文法は標準のYACCの入力形式と同一である. 詳しくは,src/ml-yacc/doc/mlyacc.pdfを参照せよ.