在前兩天的實作中,我們完成了lex & yacc部分的程式。最後,我們要來看主程式的部分,並試著編譯與執行。
請實作出一個簡易的計算機,計算出兩個正整數的加法,並回傳結果。
本範例分成以下三部分:
與主程式相關的library在此匯入。YYSTYPE
也在此定義,可以覆蓋Yacc檔案的預設值。
YYSTYPE
的用法在前天有介紹過囉~
#ifndef MAIN_H
#define MAIN_H
#include <iostream>
#include <stdio.h>
using namespace std;
#define YYSTYPE int
#endif
之前寫在Lex檔案的Main Function改成寫在這裡,但內容大同小異。
不過別忘了標頭要匯入"yacc.tab.h"。
#include "main.h"
#include "yacc.tab.h"
extern int yyparse(void);
extern FILE* yyin;
int main()
{
const char* sFile = "file.txt";
FILE* fp = fopen(sFile, "r");
if (fp == NULL) {
printf("cannot open %s\n", sFile);
return -1;
}
yyin = fp;
yyparse();
fclose(fp);
return 0;
}
在介紹Yacc的時候,我們有介紹過程式編譯的流程。跟寫程式的順序不同,編譯時是先編譯Yacc再編譯Lex。
如果忘記了的話,可以再用這張圖複習一次。
編譯的方式如下:
bison -d yacc.y
flex lex.l
gcc -c yacc.tab.c
gcc -c lex.yy.c
gcc -c main.cpp
gcc main.o lex.yy.o yacc.tab.o -o main
到此,我們終於完成了整個Parser!
3 + 2
Result: 5
費盡千辛萬苦,我們終於完成了第一個Lex & Yacc Project了。
我們明天小小喘口氣,來介紹一下Makefile這個好用的C語言編譯小幫手。
接下來,我們會繼續介紹Lex & Yacc更多的實用功能。