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 分析表時的使用。遞迴子程式法中如何體現分析的結果。基本概念 自頂向下分析面臨的...