實驗目的:對迴圈語句和條件判斷語句編寫詞法分析編譯程式,只能通過一遍掃瞄完成。(用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 ...