1. Top » 
  2. スポンサー広告 » 
  3. コンパイラについてのメモ #7
  4. 大学関係 » 
  5. 計算機科学実験及実習 » 
  6. コンパイラについてのメモ #7

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • Genre:

コンパイラについてのメモ #7

文法ファイルを書いていく。
とはいえ文法ファイルは実験指定なので、間違えないように書いていきます。
まずはどんなトークン(終端記号)を使うのかを書く。
例えば終端記号に

 定数    CONSTAN
 識別子   IDENTIFIER
 等号    = != ==
 四則演算  + * / -


などを使いますよと宣言しておく。
するとbisonを通して*.tab.hファイルにしたときにASCIIコードで
利用している部分にかぶらない定数を割り当ててくれる。
あとはdefineされているCONSTANTやADD、IDENTIFIERなどをプログラムの中で使える。

%{
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
#include "common.c"
%}
%error_verbose

%token IDENTIFIER CONSTANT INT
%token COMMA COLON SCOLON IF WHILE ELSE RETURN
%token LK RK LTK RTK // ( ) { }
%token IN // =
%token OR // ||
%token AND // &&
%token EQ // ==
%token NEQ // !=
%token LT MT LTE MTE // < > <= >=
%token ADD SUB MUL DIV // + - * /

%token CONS
%token DECLARATION
%token DECLARATIONL
%token DECLARATOR
%token DECLARATORL
%token STATEL
%token PARAM
%token PARAML
%token FUNDEF
%token EXPR
%token VAL
%token ARGS
%token R
%token CPMD_STM
%token POSF
%token UNARY
%token NONE
%token PRG


まぁ、たくさんあっても別に問題ないので多めに書いておく。

次に共用体を使うためにこんなおまじないを書きます。

%union{
int i;
char *str;
tree t;
}


これを書いておくと、終端記号が還元されるとき
(たとえばCONSTAN->10になったり、IDENTIFIER->mainになったりするとき)
そのときに魔法がかかって、時には整数、時には文字、時にはtreeといったように
複数の型に還元できるようになる。
その代わり、どのルールがどれに変化するかを書かないといけなくなる。つまり

 program   -> t
 IDENTIFIER -> str
 CONSTANT -> i


になどです。ここのtとかstrとかiというのは、unionの命令を書いた所の名前です。
というわけで次のように書きます。

%type <str>	IDENTIFIER
%type <i> CONSTANT
%type <t> main program external_declaration declaration declarator_list
declarator function_defunction parameter_type_list parameter_declaration
statement compound_statement declaration_list statement_list expression
assignment_expr logical_OR_expr logical_AND_expr equality_expr
relational_expr additive_expr multiplicative_expr unary_expr posifix_expr
primary_expr argument_expression_list


この大量の英羅列は、後に説明します。
それぞれが意味を持っていて、例えばfunction_defuntionは関数選言の部分を
multiplicative_exprは積の項を・・・とだんだん小さい要素を表しています。

以上が文法ファイルの定義セクションです。
また文法ファイルの末尾は次のように書くのがお決まりらしいのでそうします。

extern int yylineno;
int yyerror(char *s){
fprintf(stderr, "%d: %s\n", yylineno, s);
return 0;
}
main(){
yyparse();
}



以上です。
さて、定義セクションと最後のお決まり部分の間に書く文法部分を次に説明します。
関連記事
スポンサーサイト

Comment

コメントフォーム
このエントリへコメントを書く
(任意)
(任意)
(任意)
(必須) HTMLタグは使用できません
(任意) ID生成と編集に使用します
(任意) 非公開コメントにする

Page Top

Trackback

Trackback URI
http://parabola0.blog86.fc2.com/tb.php/382-6b39e3cc この記事にトラックバックする(FC2ブログユーザーのみ)

Page Top

訪問者

お引っこし。 http://parabola.sblog.jp/

プロフィール

parabola0

Author:parabola0
Twitter用ですが…。
プロフィール

最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
リンク

このブログをリンクに追加する

QRコード
QRコード
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。