言語理論とコンパイラ

第九回: 上向き構文解析の原理

2015 年 6 月 5 日

http://www.sw.it.aoyama.ac.jp/2015/Compiler/lecture9.html

Martin J. Dürst

AGU

© 2005-15 Martin J. Dürst 青山学院大学

AGU

今日の予定

前回のまとめ

 

下向き構文解析と上向き構文解析

下向き構文解析 (top-down parsing):
解析木を上から (初期記号から) 作る
上向き構文解析 (bottom-up parsing):
解析木を下から (終端記号から) 作る
途中に複数の (小さな) 解析木がある

下向き構文解析と上向き構文解析


下向き構文解析 上向き構文解析
一般的な方法 バックトラック 動的プログラミング (CYK アルゴリズム)
広く使われている方法 再帰的下向き構文解析 LR 法

bison の概要

演習例: 簡単な電卓

スタートのためのファイル: makefile, calc.y, calc.lex

make の活用

bison の入力形式の一例

%{
#include <stdio.h>
#define YYSTYPE double
int yylex (void);
void yyerror (char const *);
%}
%token NUM PLUS

%%
statement: exp { printf ("Result is %g\n", $1); }
;

exp: exp PLUS exp { $$ = $1 + $3; }
| NUM { $$ = $1; }
;

%%
int main (void)
{ return yyparse (); }

void yyerror (char const *s)
{ fprintf (stderr, "%s\n", s); }

 

bison の入力形式の骨格

bison 関係の宣言など
%{ C 言語の宣言など %}
%%
書換規則 { 実行文 (C 言語) }
書換規則 { 実行文 (C 言語) }
書換規則 { 実行文 (C 言語) }
%%
関数など (C 言語) 関数など (C 言語)

 

bison の入力形式の構造

bison 専用の指示と C プログラムの一部分が混在

主に、二つの %% で区切られている三つの部分からなる:

  1. 準備・設定部分:
    bison 用の設定など
    C の #include、グローバル変数の定義と初期化、良く使う字句の定義など
    C 言語の部分は %{ ... %} に囲む
  2. 書換規則とその場合に実行するプログラムの断片
    (最初の非終端記号が初期記号)
  3. 残りの C のプログラム (関数など)

C 言語そのものと違って、改行、字下げが解釈を左右

 

bison の書換規則の実例

exp: exp PLUS exp { $$ = $1 + $3; }
   | NUM { $$ = $1; }
;

属性文法

(attribute(d) grammar(s))

 

bison のマニュアル

宿題

提出: 来週の木曜日 (6 月 11 日) 19 時 00 分、O 棟 529 号室の前

calc.y を、test.in から test.check になるように完成

calc.y を A4 (両面印刷、表紙なし、左上ホチキス止め、名前と学生番号をコメントに記述) で提出

問題点: 出力の改行の差

対応: 改行記号の統一 (notepad2 で File → Line Endings → Unix (LF))