Lex與Yacc的結合

2021-04-12 22:08:52 字數 1723 閱讀 3368

lex與yacc的結合

首先,我就不介紹lex的語法規則了,因為在一些書上這些是重點介紹的內容,我先把lex的源程式寫在下面,然後講解。

%number  [0-9]+

%%    

"+"            

"-"            

"*"            

"/"            

"("        

")"        

%%其中

#define number 257

#define plus 258

#define sub 259

#define chen 260

#define div 261

#define lkuo 262

#define ykuo 263

是在yacc中使用的記號,該記號必須先在yacc中定義,然後,在lex中使用,yacc告訴lex需要使用的符號,使用yacc  –d  檔案.y來生成乙個yytab.h的檔案,在該檔案中內容就是上面的一系列#define 。。。。

extern int  yylval; 告訴lex要引用外部的變數yylval。

%%    

"+"            

"-"            

"*"            

"/"            

"("        

")"        

%%這一部分就不解釋了。

下面是*.y檔案了

%%token number

%token plus

%token sub

%token plus

%token chen

%token div

%token lkuo

%token ykuo

%left  plus sub

%left  chen   div

%%com: exp  ;

exp:  exp  plus fac

|exp  sub fac

|fac;

fac:fac  chen term

|fac  div term

|term  ;

term:lkuo exp ykuo  

| number   ;

%%extern int yylex();

int yyparse();

main()

yyerror()

其中#define yystype  int是定義記錄記號的值棧的型別為int,當然你也可以定義其他的型別。

我們命名第乙個檔案為sample.l,用命令pclex  sample.l 處理,生成sample.c檔案。

然後我們命名第二個檔案為sample1.y,用命令pcyacc  -v  -d  sample1.y

生成sample1.c、yytab.h、yy.lrt(yacc的分析表檔案)。

用vc++或者tc編譯乙個工程,這個工程包含這兩個檔案*.c檔案,其中在tc中編譯這個工程的時候,sample1.c為primary  file(該選項在tc中的compile項中設定),生成乙個可執行的檔案。如niu1.exe,然後編輯乙個niu.txt檔案,niu.txt檔案就是需要識別的數學表示式。如下面的例子:

niu.txt  內容如下

5-2+3*22/2+2-3

用niu1

Lex與Yacc學習(九)之Yacc語法

本文討論yacc語法的格式並描述可用的各種特徵和選項 yacc語法包括三部分 定義段 規則段和使用者子例程段 定義段.規則段.使用者子例程段.各部分由以兩個百分號開頭的行分開,儘管某乙個部分可以為空,但是前兩部分是必須的,第三部分和前面的百分號可以省略。yacc 語法由符號組成,即語法的 詞 符號是...

Lex與Yacc學習(十)之Yacc庫

每個實現都需要有用的例程庫,在unix系統中,可以通過cc命令列尾端給出 ly標誌 或通過其他系統下的等價物 來包含庫。庫的內容在不同的實現之間是不同的,但總是包括main 和yyerror yacc的所有版本都帶有最小的主程式,該程式對於簡短程式和測試有時是很有用的,它非常簡單,如下所示 main...

Lex與Yacc學習(四)之Lex規範

lex程式由三部分組成 定義段 規則段和使用者子例程式段 定義段.規則段.使用者子例程式段.這些部分由以兩個百分號組成的行分隔開。儘管某一部分可以為空,但前兩部分是必須的,第三部分和前面的 行可以忽略。定義段包括文字塊 定義 內部表宣告 起始條件和轉換。以空白開頭的行被逐字拷貝到c檔案中,通常,這用...