因為符號表要求語法分析程式和詞法分析程式共享的資料結構,所以我們建立乙個標頭檔案ch3hdr.h:
$ vi ch3hdr.h
#define nsyms 20
/* maximum number of symbols */
struct symtab symtab[nsyms]
;struct symtab *
symlook
(char
*s);
這個符號表是乙個結構體陣列,每個結構都包含變數的名字和它的數值。我們還宣告乙個符號表查詢程式symlook(),它以文字字串形式的名字為引數,順序地搜尋字元表來尋找與傳入引數名字對應的條目。如果某條目的name與symlook正在搜尋的字串匹配,就返回該條目的指標,因為名字已進被放進了表中。如果name欄位為空,並且已經尋找了符號表中的所有條目且所有找到匹配的條目,那麼我們就把名字輸入至今為止還是空的符號表條目中。
具有符號表的語法分析程式ch3-4.y
%
%union
%token name
%token number
%left '-'
'+'%left '*'
'/'%nonassoc uminus
%type expression%%
statement_list: statement '\n'
| statement_list statement '\n'
statement: name '=' expression
| expression
;expression: expression '+' expression
| expression '-' expression
| expression '*' expression
| expression '/' expression
|'-' expression %prec uminus
|'(' expression ')'
| number
| name %%
intmain()
void
yyerror
(char
*s)
具有符號表的詞法分析程式ch3-4.l
%%%
([0-
9]+|
([0-
9]*\.[0-
9]+)
([ee][-
+]?[
0-9]
+)?)
[ \t]
;[a-za-z]
[a-za-z0-9]
*"$"
\n |
.return yytext[0]
;%%int
yywrap()
struct symtab *
symlook
(char
*s)}
yyerror
("too many symbols.");
exit(1
);}
編譯和執行:
[postgre@host132 ch3]$ yacc -d ch3-
4.y[postgre@host132 ch3]$ lex ch3-
4.l[postgre@host132 ch3]$ cc -o test lex.yy.c y.tab.c
[postgre@host132 ch3]$ .
/test
foo=
23foo/5=
4.6abc=343
*abc
=102
$[postgre@host132 ch3]$
符號表 二叉查詢樹的簡單學習
所有學習內容全部來自於 演算法 第四版 二叉查詢樹是符號表的一種實現。符號表,又稱為字典,或者索引之類的。主要目的就是講乙個鍵和乙個值聯絡起來,能夠通過鍵增刪改查等操作。符號表有二叉查詢樹 紅黑樹以及雜湊表的實現。基於這些演算法,能夠擴充套件出很多應該用。主要實現如下方法 key的話需要繼承於com...
C語言學習筆記 鍊錶(四)鍊錶的刪除
鍊錶的節點刪除有兩種情況 一 刪除頭節點 將頭結點變為第二個節點即可。二 刪除非頭節點 將要刪除的節點的前乙個節點指向到要刪除的節點的下乙個節點。定義結構體 struct test 輸出鍊錶資料 void printlink struct test head putchar n struct tes...
mysql學習筆記(四) 資料庫表的增刪改基本操作
dml 增刪改基本 create table student id int auto increment primary key name varchar 10 varchar 10 插入資料 insert into student id,name values 1,lilei 插入一條資料 ins...