言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

SmaCC 改造

SmaCCToken の構造
{値 (開始位置, 終了位置, ID)}

GGrammarParser(SmaCCParser)>>performParsingLoop では何をやっているか?

  • 現在のトークンを取り出す。
  • パーサは transitionTable :: 状態(スタックのケツ) -> トークンID を元に、アクション番号を取得
    • transitionTable とは?
      • 行: 状態(スタックのケツ)
      • 列: フォーマットには2種類ある。
        • #(2 アクション番号 トークンID トークンID トークンID ...) 先頭が 2 の時: アクション番号 = 配列 at: 2
        • #(3 アクション番号1 トークンID1 アクション番号2 トークンID2 ...) 先頭が 2 以外 アクション番号 = トークンID の前の数字
  • アクションタイプ(アクション番号 の下位2ビット)を取り出す
  • アクション番号 := アクション番号 / 4 (これはキタナイ!)
  • 次に何をするか判定
    • アクションタイプが 1 (2r01) ならシフト
    • アクションタイプが 2 (2r10) なら還元
    • その他はエラー

色々なところに現れる数字を整理してみよう。

  • トークンID SmaCCToken>>id SmaCCScanner>>next によりスキャナから取得
  • 状態ID
  • アクション番号

nonterminal -> terminal へ変換する操作参照も全部交換

SmaCC コンパイル時 Messages はどこから来るのか?