LL(1)語法分析

2021-04-27 11:59:54 字數 3127 閱讀 3905

ll

(1)分析法的功能是利用ll(

1)控制程式根據顯示棧棧頂內容、向前看符號以及ll(

1)分析表,對輸入符號串自上而下的分析過程。可通過消除左遞迴、提取左因子把非ll(

1)文法改造成ll(

1)文法。在

ll( 1)

**分析程式設計過程中,最重要的兩個問題是**分析表的構造和相關資料結構的設計。而**分析表的構造首先必須計算文法每個非終結符的

first

集和follow

集。資料結構和演算法實現具體實現如下: 1

、資料結構: 陣列

a實現分析棧,陣列

b儲存剩餘分析串;一維陣列

v1存放文法終結符,一維陣列

v2存放文法非終結符。將產生式型別定義為結構體變數。 2

、演算法: a

、首先將『

# 』壓入堆疊中

, 將開始符號

s 也壓入堆疊中,讀取第乙個輸入符號到

a.迴圈執行

b--d:

b、棧頂符號彈出放入x 中

,如果x 為終結符號:當

x = = a ! =『#

』時,表明成功匹配

a 符號

,然後讀取下乙個符號到

a ,否則出錯;當

x = = a =『#

』時,分析結束

,接受句子

,跳出迴圈.c

、如果x ! = a ,

進行出錯處理.d

、如果x

為非終結符號

, 則查分析表

m :如果

m[ x , a ]

為空,

進行出錯處理

; 如果

m [x , a ]=

『x1 x2 x3...xn』,

則將右部

xn...x2 x1

反序壓入堆疊中

.本程式分析的文法:

e//e -> tgr(o)

g//g -> +tgr(1)

g1//g -> ε

r(2)

t//t -> fs

r(3)

s//s -> *fsr(4)

s1//s -> ε

r(5)

f//f -> (e)

r(6)

f1//f -> i

r(7)

g2//g -> -tg

r(8)

s2//s -> /fs

r(9)

分析句子:

e->tg->fsg->isg->i/fsg->i/isg->i/ig->i/i-tg->i/i-fsg->i/i-isg->i/i-ig->i/i-i

手工構造的**分析表: i

+ *( )

- /# e

r(0)

error

error

r(0)

error

error

error

error g

error

r(1)

error

error

r(2)

r(8)

error

r(2) t

r(3)

error

error

r(3)

error

error

error

error s

error

r(5)

r(4)

error

r(5)

r(5)

r(9)

r(5) f

r(7)

error

error

r(6)

error

error

error

error

#include

#include

#include

#include

char a[20];/*

分析棧*/

char b[20];/*

剩餘串*/

char v1[20]=;/*

終結符*/

char v2[20]=;/*

非終結符*/

int j=0,b=0,top=0,l;/*l

為輸入串長度*/

typedef struct type/*

產生式型別定義

*/ type;

type e,t,g,g1,g2,s,s1,s2,f,f1;/*

結構體變數

*/ type c[10][10];/*

**分析表*/

void print()/*

輸出分析棧

*/ /*print*/

void print1()/*

輸出剩餘串

*/ /*print1*/

void main()

b[j]=ch;

j++;

}while(ch!='#');

l=j;/*

分析串長度

*/ ch=b[0];/*

當前分析字元

*/ a[top]='#'; a[++top]='e';/*'#','e'

進棧*/

printf("

步驟/t/t

分析棧/t/t

剩餘字元

/t/t

所用產生式

/n");

do if(flag==1)/*

如果是終結符*/

/*if*/

if(x==ch)

/*if*/

else/*

出錯處理*/

/*else*/

}/*if*/

else/*

非終結符處理*/

for(j=0;j<=7;j++)

if(ch==v1[j])

cha=c[m][n];

if(cha.origin!='n')/*

判斷是否為空*/

/*if*/

else/*

出錯處理

*/ /*else*/

}/*else*/

}while(finish==0);

}/*main*/

LL 1 語法分析

ll 1 文法分析是自頂向下的分析方法,也可以被看作是輸入串的最左推導過程,ll 1 中1的意思就是可以根據可以根據當前輸入串中的乙個字元來判斷是由哪乙個產生式產生。下面給出文法 e te e ate 代表空集 t ft t mft f i e i 0 1 2 9 a m 首先要構造first集合與...

自上而下語法分析LL(1)

1.語法分析的地位 是編譯程式的核心部分 2.語法分析的任務 識別由詞法分析得出的單詞序列是否是給定文法的句子 3.語法分析的理論基礎 上下文無關文法和下推自動機 4.語法分析的方式 1 自上而下語法分析 反覆使用不同產生式進行推導以謀求與輸入符號串相匹配 2 自下而上語法分析 對輸入符號串尋找不同...

編譯原理 LL 1 語法分析

直接輸入根據已知文法構造的分析表m,對於輸入的文法和符號串,所編制的語法分析程式應能正確判斷此串是否為文法的句子,並要求輸出分析過程。c 實現如下 includeusing namespace std const int l num 100000 const int max 100 分析表容量 co...