語法分析 編譯原理

2021-08-14 08:48:39 字數 3232 閱讀 7064

實驗目的:對迴圈語句和條件判斷語句編寫詞法分析編譯程式,只能通過一遍掃瞄完成。(用c++實現)

實驗要求: 

(1)關鍵字: 

for if then else while do 

所有關鍵字都是小寫。 

(2)運算子和分隔符: 

: = + - * / < > <= <> >= ; ( ) # 

(3)其他識別符號(id)和整型常數(num),通過以下正規式定義: 

id=letter(letter | digit)* 

num=digit digit* 

(4)空格由空白、製表符和換行符組成。空格一般用來分隔id、num、運算子、分隔符和關鍵字,詞法分析階段通常被忽略。 

(5) 具有一定的出錯處理功能。

各種詞法單元對應的詞法記號如下: 

詞法單元 詞法記號 詞法單元 詞法記號 

for 1 : 17 

if 2 := 18 

then 3 < 20 

else 4 <> 21 

while 5 <= 22 

do 6 > 23 

letter(letter+digit)* 10 >= 24 

digit digit* 11 = 25 

+ 13 ; 26 

- 14 ( 27 

* 15 ) 28 

/ 16 # 0

詞法單元 詞法記號 詞法單元 詞法記號 

for 1 : 17 

if 2 := 18 

then 3 < 20 

else 4 <> 21 

while 5 <= 22 

do 6 > 23 

letter(letter+digit)* 10 >= 24 

digit digit* 11 = 25 

+ 13 ; 26 

- 14 ( 27 

* 15 ) 28 

/ 16 # 0

詞法分析程式的功能 

輸入:源程式 

輸出:二元組(詞法記號,屬性值/其在符號表中的位置)構成的序列。

例如:對源程式 

x:=5; if (x>0) then x:=2*x+1/3; else x:=2/x; # 

經詞法分析後輸出如下序列: 

(10,』x』)(18, :=) (11,5) (26, ;) (2, if ) (27,( )……

1.幾點說明: 

(1)關鍵字表的初值。 

關鍵字作為特殊識別符號處理,把它們預先安排在一張**中(稱為關鍵字表),當掃瞄程式識別出識別符號,查關鍵字表。如能查到匹配的單詞,則該單詞的關鍵字,否則為一般識別符號。關鍵表為乙個字串陣列,其描述如下: 

char *keyword[6]=;

(2)程式中需要用到的主要變數為 token , id和num. 

1)id用來存放構成詞法單元的字串; 

2)num用來存放整數(可以擴充套件到浮點數和科學計數法表示); 

3)token用來存放詞法單元的詞法記號。

可以參考下面的**:

do 

}while (token!=0);

#include 

#include

#include

#include

#include

#include

#define max 100

using

namespace

std;

static

map dictionary;

void init()

int findbykey(string key)

string keyword[6]=;

bool isletter(char a)

else

}bool

isdigit(char a)

else

}bool iskeyw(string keywords)

}return

false;

}bool isvar(string var) //id=letter(letter | digit)*

else

}return

true;

}else

}bool isnum(string num) //num=digit digit* (xiaoshudian

else

if(num[i]=='.'&&isdigit(num[i+1])&&flag1)

else

if (((num[i]=='e'||num[i]=='e')&&(num[i+1]=='+'||num[i+1]=='-'||isdigit(num[i+1]))&&flag2))

else

if((num[i]=='+'||num[i]=='-')&&isdigit(num[i+1]))

else

}return

true;

}else

}string to_string(int n)

string packet(string test,int type)

else

if(type==1)

else

if(type==2)

string req="";

string aa;

aa=to_string(a);

req+="(" + aa;

req+=",";

req+=test;

req+=") ";

return req;

}string texthandle(string test,int linenum)

else

if(isvar(test))

else

if(isnum(test))

else

if(-1==findbykey(test))

else

}void file_output(char* filename)

else}}

}//對單詞鍊錶進行處理

//list::iterator i;

//for (i = words.begin(); i != words.end(); ++i)

//測試

// cout<<*i

編譯原理 語法分析

根據上課內容順序寫的部落格,並不是按照書的目錄來的 使用龍書以及編譯程式設計原理 第二版 金成植 金英編著 老師的ppt是英文的,我自己隨便翻的,不一定對 上下文無關文法 語法分析書和抽象語法樹 二義性簡單語言的語法 知識圖譜 語法分析器的功能輸入 詞法單元 詞法單元序列 輸出 語法結構的內在表示式...

編譯原理 語法分析(二)

在第一篇文章中,我們介紹了如何用上下文無關文法描述一種語言的語法,和如何使用推導和規約構造一棵語法分析樹,以及如何對文法進行轉換使之能夠更適用於語法分析。在本篇文章中,我們將介紹如何使用自頂向下的方法進行語法分析,進一步的,我們將介紹一種更高效的 分析方法。為了下文需要和減少重複,我們先給出在下文中...

編譯原理簡單語法分析

一 實驗目的 了解掌握算符優先分析的基本方法 內容 學會科學思考並解決問題,提高程式設計能力。二 實驗內容與要求 用算符優先分析方法設計乙個分析解釋程式,對輸入的賦值語句 輸出語句 清除語句進行詞法分析 語法分析 表示式求值並儲存於指定變數中 若存在錯誤,提示錯誤相關資訊。三 文法表示 s v e ...