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檔案中,通常,這用...