1、B演習(言語処理系演習)第4回田浦構文解析器“fib”nn2defif構文木def fib(n):if n B C D 対,uparse_A(tokenizer_t t)parse_B(t);parse_C(t);parse_D(t);u注:構文木組立部分省略複数選択肢場合u例:A-B C D|E F Gu現在字句選択uparse_A(tokenizer_t t)if(現在tokenB C D先頭)parse_B(t);parse_C(t);parse_D(t);else if(E F G先頭)parse_E(t);parse_F(t);parse_G(t);else parse_err(t)
2、;構文解析器課題u読込,構文木作,printumain()tree=parse_program();print_program(tree,);u(空白以外)同出力u出力文字列一度同入今度同一文字列出u./parser a.py b.py./parser b.py c.pydiff b.py c.pyu注:a.py b.py 空白除同一 b.py c.py 同一文字列自然構成usyntree.h :構文木typedef宣言usyntree.c:多数(mk_A)定義uparser.h:構文解析器(parse_file_input)宣言uparser.c:多数構文解析器(parse_A)定義(syn
3、tree.h#include)u原理実際構造体定義関数書大変少提供 syntree.h almost_empty_parser.c parser.c,少数解析木説明用残,空u使作業道筋思,解読明注意(基本説明)修正(HP上PDF修正済)u資料(3)字句解析器up20.4.4節 最後行 cs_cur_line実現 cs_cur_line_string実現up21.4.5節 tokenizer 定義内 char_buf_t str_buf;/*現在行先頭空白数*/char_buf_t str_buf;/*現在行(先頭現在文字)保持*/int_vec_t indents;int_stack_t in
4、dents;前半課題u締切 u詳HP()subversion”parser”名前登録&Makefile checkout“make”“parser”名前./parser 名 構文解析行,構文木戻表示u報告別途 班番号,checkout名報告C言語雑学汎用u(入物),表,探索木,etc.u頻出(多言語,提供,組込)C+STL Java Python 辞書,何問題u実装,入何同u,int入物,char*入物別定義u例:of T(T入)typedef struct T_list *T_list_t;T_list_t mk_T_list();void list_append(T_list_t l,T
5、x);T list_get(T_list_t l,int i)例:u整数 int_list_t mk_int_list();void int_list_append(int_list_t l,int x);int int_list_get(int_list_t l,int i);uchar*string_list_t mk_string_list();void string_list_append(string_list_t l,char*x);char*string_list_get(string_list_t l,int i);選択肢?u1:似何度書u2:int_list定義思切(笑),i
6、nt_listchar*入 int_list_t l=mk_int_list();int_list_append(l,“hello”);char*x=int_list_get(l,0);u実,場合2機能u2(一般)根本的原因,int型領域(変数,配列/構造体要素)char*値代入 例:int_list_append(l,“hello”);u実際,char*int32 bit整数,実代入情報失 char*p=“hello”;int x=p;char*y=x;/*y=p*/C言語危険合法代入uC言語,機械語上可能代入(自己責任)合法u警告出 char*x=1000;/*:=整数*/int a10;
7、char*p=a;/*char*:=int*/f(int x)f(“hello”);uvoid*generic,不明型保持慣習的用,以下合法uint_list_t l=mk_int_list();int_list_append(l,“hello”);char*x=int_list_get(l,0);用黙可能uint_list_t l=mk_int_list();int_list_append(l,(int)“hello”);char*x=(char*)int_list_get(l,0);u,無様 間違犯元(一般,何(int?char*?)入区別手段慣習u“汎用版”一度定義 中身void*良 g
8、eneric_list_t mk_generic_list();generic_list_append(generic_list_t l,void*x);generic_list_get(generic_list_t l,int i);u用個型対定義例 int_list 定義utypedef struct int_list*int_list_t;uint_list_t mk_int_list()return(int_list_t)mk_generic_list();uint int_list_append(int_list_t l,int x)generic_list_append(generic_list_t)l,(void*)x);uint int_list_get(int_list_t l,int i)return(int)generic_list_get(generic_list_t)l,i);注:要代入合法?u否 :=浮動小数点数 :=構造体 整数:=構造体 注:構造体 構造体A:=構造体B