編譯原理之表示式語法分析 一 自頂向下

2021-07-09 05:52:58 字數 1950 閱讀 2628

g(e):

e→eω0t|t e為算術表示式,t為項

t→tω1f|f f為因式項,ω0為 +或 -, ω1為 * 或 /

f→i|(e) i 為變數或常量

g(e)不是ll(1)文法,所以需要進行文法變換

g』(e):

e→tt→f

f→i|(e)

或者g」(e):

e→ta

a→at→fb

b→bf→i|(e)

preset.h

#ifndef preset_h_included

#define preset_h_included

std::string str;

int top;

void handlee();

void handlea();

void handlet();

void handleb();

void handlef();

#endif // preset_h_included

main.c

#include 

#include

#include

#include "preset.h"

using

namespace

std;

int main()

return0;}

void handlee()

void handlea()

}void handlet()

void handleb()

}void handlef()

}

ll(1)分析表如下:

棧頂符/當前符i+

*()#

e11a

233t

44b3

533f

67)6

#ok其中

(at,p)

(at,n)

(空,p)

(bf,p)

(bf,n)

(空,n)

( )e,n)

p表示不變,n表示讀取下乙個

故 at ——1、2

bf——4、5

空——3、6

)e——7

p——1、3、4

n——2、5、6、7

preset.h

#ifndef preset_h_included

#define preset_h_included

std::string str;

int top;//棧頂符指標

int stop;//當前符指標

int tell();

std::string stack_ch;

#endif // preset_h_included

main.c

#include 

#include

#include

#include

#include "preset.h"

using

namespace

std;

int main()

if(ans==-1)cout

<< "yes"

<< endl;

else

cout

<< "no"

<< endl;

}return0;}

int tell()

op=0;

switch(stack_ch[top])

if(op==0)return op;

top--;

if(op==2 || op==5 || op==6 || op==7)stop++;

switch(op)

return op;

}

編譯原理 自頂向下語法分析

對於任何輸入串,從文法開始符號 根節點 出發,自上而下,從左到右地為輸入串建立語法分析樹。簡而言之,就是尋找輸入串的最左推導的過程。之前我們了解到,一旦有左遞迴存在便無法構建這樣的語法樹,所以用自頂向下語法分析必須先去除左遞迴。同樣,由於使用最左推導,也不能處理有複雜回溯的輸入串。自頂向下的語法分析...

表示式語法分析

表示式語法分析 遞迴子程式法 time limit 1000 ms memory limit 65536 kib problem description 遞迴子程式法是一種確定的自頂向下語法分析方法,要求文法是ll 1 文法。它的實現思想是對應文法中每個非終結符編寫乙個遞迴過程,每個過程的功能是識別...

編譯原理結構框架4自頂向下的語法分析

第四章 自頂向下的語法分析 重點 自頂向下分析的基本思想,分析器總體結構,分析表的構造,遞迴下降分析法基本思想,簡單算術表示式的遞迴下降分析器。難點 first 和follow 集的求法,對它們的理解以及在構造 ll 1 分析表時的使用。遞迴子程式法中如何體現分析的結果。基本概念 自頂向下分析面臨的...