iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
自我挑戰組

Lex & Yacc 學習筆記系列 第 12

[Day12] Parser解析(3) 主程式與執行

  • 分享至 

  • xImage
  •  

本篇內容

  • 介紹Lex & Yacc程式的編譯與執行
  • 範例 - 簡易計算機1 (3 of 3)

主程式

在前兩天的實作中,我們完成了lex & yacc部分的程式。最後,我們要來看主程式的部分,並試著編譯與執行。

範例 - 簡易計算機1 (3 of 3)

說明

請實作出一個簡易的計算機,計算出兩個正整數的加法,並回傳結果。

本範例分成以下三部分:

  1. 完成Lex檔案的實作 (已完成)
  2. 完成Yacc檔案的實作 (已完成)
  3. 完成主程式的實作 (本日目標)

程式實作

標頭檔

與主程式相關的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。

如果忘記了的話,可以再用這張圖複習一次。

https://ithelp.ithome.com.tw/upload/images/20230912/20157613la1ro3D0Xh.png

編譯的方式如下:

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更多的實用功能。

參考資料

  • Levine, John R., Tony Mason and Doug Brown [1992]. Lex & Yacc. O’Reilly & Associates, Inc. Sebastopol, California.
  • Tom Niemann. Lex & Yacc

上一篇
[Day11] Parser解析(2) Yacc程式
下一篇
[Day13] Makefile 介紹
系列文
Lex & Yacc 學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言