yacc學習筆記(四)帶符號表的計算器程式

2021-10-03 12:24:55 字數 2046 閱讀 9773

因為符號表要求語法分析程式和詞法分析程式共享的資料結構,所以我們建立乙個標頭檔案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...