国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【編譯原理實驗】 -- 詞法分析程序設計原理與實現(xiàn)(C語言實現(xiàn))

這篇具有很好參考價值的文章主要介紹了【編譯原理實驗】 -- 詞法分析程序設計原理與實現(xiàn)(C語言實現(xiàn))。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

目標任務

設計要求

一、程序功能描述

二、正則文法

三、程序結(jié)構描述

四、代碼

?五、程序測試

?測試用例1

測試結(jié)果1

測試用例2

測試結(jié)果2


目標任務

以下為正則文法所描述的 C 語言子集單詞符號的示例,請補充單詞符號:++,--, >>, <<, += , -= ,*=, /= ,&&(邏輯與),||(邏輯或),?。ㄟ壿嫹牵┑鹊龋o出補充后描述 C 語言子集單詞符號的正則文法,設計并實現(xiàn)其詞法分析程序。

<標識符>→字母︱ <標識符>字母︱ <標識符>數(shù)字

<無符號整數(shù)>→數(shù)字︱ <無符號整數(shù)>數(shù)字

<單字符分界符> →+ ︱- ︱* ︱;︱, ︱(︱) ︱{︱} <雙字符分界符>→<大于>=︱<小于>=︱<小于>>︱<感嘆號>=︱<等于>=︱<斜豎>*

<小于>→<

<等于>→=

<大于>→>

<斜豎> →/

?<感嘆號>→!

該語言的保留字 :void、int、float、double、if、else、for、do、while 等等(也可補充)。

設計要求

1)可將該語言設計成大小寫不敏感,也可設計成大小寫敏感,用戶定義的標識符最長不超過 32 個字符;

(2)字母為 a-z A-Z,數(shù)字為 0-9;

(3)可以對上述文法進行擴充和改造;

(4)“/*……*/”和“//”(一行內(nèi))為程序的注釋部分。

(5)給出各單詞符號的類別編碼;

(6)詞法分析程序應能發(fā)現(xiàn)輸入串中的錯誤;

(7)詞法分析作為單獨一遍編寫,詞法分析結(jié)果為二元式序列組成的中間文件;

(8)設計兩個測試用例(盡可能完備),并給出測試結(jié)果。
?


一、程序功能描述

輸入源程序,詞法分析后,能發(fā)現(xiàn)其中的錯誤;

能夠識別注釋的開始結(jié)束、單字符分界符、雙字符分界符;

分析結(jié)果為二元式序列組成的中間文件。

二、正則文法

G[<單詞符號>]:

<單詞符號>→<標識符>|<無符號整數(shù)>|<單字符分界符>|<雙字符分界符>

<標識符>→字母|<標識符>字母|<標識符>數(shù)字

<無符號整數(shù)>→數(shù)字|<無符號整數(shù)>數(shù)字

<單字符分界符>→% | ; | , | ( | ) | { | } | [ | ]

<雙字符分界符>→<大于>=|<小于>=|<感嘆號>=|<等于>=|<斜號>*|<加號>+|<加號>=|<減號>-|<減號>=|<星號>=|<斜豎>=|<大于>>|<小于><|<與符號>&|<或符號>| |<斜號>/|<星號>/

<小于>→< ???????????? <等于>→= ?????????? <大于>→>????????????? <感嘆號>→!

<斜號>→/??????????????? <加號>→+???????????? <減號>→-?????????????? <星號>→*

<與符號>→&?????????? <或符號>→|

三、程序結(jié)構描述

設計方法

單詞符號類別編碼

單詞符號

類別編碼

單詞符號

類別編碼

標識符

1

%

20

無符號整數(shù)

2

;

21

void

3

,

22

int

4

(

23

float

5

)

24

double

6

{

25

If

7

}

26

else

8

[

27

for

9

]

28

do

10

>

29

while

11

<

30

return

12

=

31

break

13

!

32

continue

14

>=

33

char

15

<=

34

+

16

!=

35

-

17

==

36

*

18

++

37

/

19

--

38

+=

39

<<

44

-=

40

&&

45

*=

41

||

46

/=

42

&

47

>>

43

|

48

狀態(tài)轉(zhuǎn)換圖

【編譯原理實驗】 -- 詞法分析程序設計原理與實現(xiàn)(C語言實現(xiàn))

【編譯原理實驗】 -- 詞法分析程序設計原理與實現(xiàn)(C語言實現(xiàn))

函數(shù)定義及函數(shù)之間的調(diào)用關系

isLetter:判斷是否是字母a-z,A-Z

isDigit:判斷是否是數(shù)字0-9

getIdentifier_ID:返回保留字或標識符編號

getSinglechar_ID:返回單字符分界符編號

四、代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int isLetter(char c){ 
	if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) return 1;
	return 0;
}
int isDigit(char c){
	if(c>='0'&&c<='9') return 1;
	return 0;
}
int getIdentifier_ID(char s[]){
	if(strcmp(s,"void")==0) return 3;
	else if(strcmp(s,"int")==0) return 4;
	else if(strcmp(s,"float")==0) return 5;
	else if(strcmp(s,"double")==0) return 6;
	else if(strcmp(s,"if")==0) return 7;
	else if(strcmp(s,"else")==0) return 8;
	else if(strcmp(s,"for")==0) return 9;
	else if(strcmp(s,"do")==0) return 10;
	else if(strcmp(s,"while")==0) return 11;
	else if(strcmp(s,"return")==0) return 12;
	else if(strcmp(s,"break")==0) return 13;
	else if(strcmp(s,"continue")==0) return 14;
	else if(strcmp(s,"char")==0) return 15;
	else return 1;//是標識符 
}
int getSinglechar_ID(char c){
	if(c==';') return 21;
	else if(c=='%') return 20;
	else if(c==',') return 22;
	else if(c=='(') return 23;
	else if(c==')') return 24;
	else if(c=='{') return 25;
	else if(c=='}') return 26;
	else if(c=='[') return 27;
	else if(c==']') return 28;
	else return 0;//非單字符 
}
int main(){
	FILE *fp=NULL;//輸入文件 
	fp=fopen("demo_in.txt","r");
	FILE *fw=NULL;//輸出文件 
	fw=fopen("demo_out.txt","w");
	char ch;//接收字符 
	char s1[32];//標識符 
	char s2[32];//無符號整數(shù) 
	int i=0;
	int id;
	int flag=0;
	ch=fgetc(fp);
	while(!feof(fp)){
		if(ch==' '||ch=='\t'){//為空格或制表符則不處理,獲取下一個字符 
			ch=fgetc(fp);
			continue;
		}else if(ch=='\n'){
			fprintf(fw,"\n");
			ch=fgetc(fp);
			continue;
		}else if(isLetter(ch)==1){//標識符 
			i=0;
			s1[i++]=ch;
			while(isLetter(ch)==1||isDigit(ch)==1){
				ch=fgetc(fp);
				s1[i++]=ch;
			}
			s1[i-1]='\0';
			id=getIdentifier_ID(s1);
			fprintf(fw,"(%d,%s)",id,s1);
		}else if(isDigit(ch)==1){//無符號整數(shù) 
			i=0;
			s2[i++]=ch;
			while(isDigit(ch)==1){
				ch=fgetc(fp);
				s2[i++]=ch;
			}
			s2[i-1]='\0';
			fprintf(fw,"(2,%s)",s2);
		}else if(getSinglechar_ID(ch)!=0){//單字符分界符 
			fprintf(fw,"(%d,%c)",getSinglechar_ID(ch),ch);
			ch=fgetc(fp);
		}else if(ch=='>'){//大于 
			ch=fgetc(fp);
			if(ch=='='){
				fprintf(fw,"(33,>=)");
				ch=fgetc(fp);
			}else if(ch=='>'){
				fprintf(fw,"(43,>>)");
				ch=fgetc(fp);
			}else{
				fprintf(fw,"(29,>)");
			}
		}else if(ch=='<'){//小于 
			ch=fgetc(fp);
			if(ch=='='){
				fprintf(fw,"(34,<=)");
				ch=fgetc(fp);
			}else if(ch=='<'){
				fprintf(fw,"(44,<<)");
				ch=fgetc(fp);
			}else{
				fprintf(fw,"(30,<)");
			}
		}else if(ch=='!'){//感嘆號 
			ch=fgetc(fp);
			if(ch=='='){
				fprintf(fw,"(35,!=)");
				ch=fgetc(fp);
			}else{
				fprintf(fw,"(32,!)");
			}
		}else if(ch=='='){//等于 
			ch=fgetc(fp);
			if(ch=='='){
				fprintf(fw,"(36,==)");
				ch=fgetc(fp);
			}else{
				fprintf(fw,"(31,=)");
			}
		}else if(ch=='/'){//斜號 
			ch=fgetc(fp);
			if(ch=='*'){
				fprintf(fw,"(處理注釋,/*)");
				while(1){
					flag=0;
					ch=fgetc(fp);
					while(ch=='*'){//不用if,while可以處理/*后多個*的問題 
						ch=fgetc(fp);
						if(ch=='/'){
							fprintf(fw,"(注釋結(jié)束,*/)");
							ch=fgetc(fp);
							flag=1;
						}
					}
					if(flag==1) break;
				}
			}else if(ch=='/'){
				fprintf(fw,"(處理注釋,//)");
				while(ch!='\n'){
					ch=fgetc(fp);
				}
				fprintf(fw,"\n");
				ch=fgetc(fp);
			}else if(ch=='='){
				fprintf(fw,"(42,/=)");
				ch=fgetc(fp);
			}else{
				fprintf(fw,"(19,/)");
			}
		}else if(ch=='&'){//與符號 
			ch=fgetc(fp);
			if(ch=='&'){
				fprintf(fw,"(45,&&)");
				ch=fgetc(fp);
			}else{
				fprintf(fw,"(47,&)");
			}
		}else if(ch=='|'){//或符號 
			ch=fgetc(fp);
			if(ch=='|'){
				fprintf(fw,"(46,||)");
				ch=fgetc(fp);
			}else{
				fprintf(fw,"(48,|)");
			}
		}else if(ch=='+'){//加號 
			ch=fgetc(fp);
			if(ch=='='){
				fprintf(fw,"(39,+=)");
				ch=fgetc(fp);
			}else if(ch=='+'){
				fprintf(fw,"(37,++)");
				ch=fgetc(fp);
			}else{
				fprintf(fw,"16,+");
			}
		}else if(ch=='-'){//減號 
			ch=fgetc(fp);
			if(ch=='='){
				fprintf(fw,"(40,-=)");
				ch=fgetc(fp);
			}else if(ch=='-'){
				fprintf(fw,"(38,--)");
				ch=fgetc(fp);
			}else{
				fprintf(fw,"(17,-)");
			}
		}else if(ch=='*'){//星號 
			ch=fgetc(fp);
			if(ch=='='){
				fprintf(fw,"(41,*=)");
				ch=fgetc(fp);
			}else{
				fprintf(fw,"(18,*)");
			}
		}else{//其他,出錯 
			fprintf(fw,"\n錯誤:未定義->%c",ch);
			printf("錯誤:未定義->%c\n",ch);
			break;
		}
	}
	fclose(fp);
	fclose(fw);
	printf("二元式序列組成的中間文件已經(jīng)生成!\n");
	return 0;
}

?五、程序測試

?測試用例1

【編譯原理實驗】 -- 詞法分析程序設計原理與實現(xiàn)(C語言實現(xiàn))

?

測試結(jié)果1

【編譯原理實驗】 -- 詞法分析程序設計原理與實現(xiàn)(C語言實現(xiàn))

?

測試用例2

【編譯原理實驗】 -- 詞法分析程序設計原理與實現(xiàn)(C語言實現(xiàn))

?

測試結(jié)果2

【編譯原理實驗】 -- 詞法分析程序設計原理與實現(xiàn)(C語言實現(xiàn))


?如果對你有幫助的話,可以考慮點個贊~~文章來源地址http://www.zghlxwxcb.cn/news/detail-431056.html

到了這里,關于【編譯原理實驗】 -- 詞法分析程序設計原理與實現(xiàn)(C語言實現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • HNU-編譯原理-實驗1-利用FLEX構造C-Minus-f詞法分析器

    HNU-編譯原理-實驗1-利用FLEX構造C-Minus-f詞法分析器

    計科210X 甘晴void 202108010XXX 詳細的實驗項目文檔為 https://gitee.com/coderwym/cminus_compiler-2023-fall/tree/master/Documentations/lab1 學習和掌握詞法分析程序的邏輯原理與構造方法。通過 FLEX 進行實踐, 構造 C-Minus-f 詞法分析器。具體完成過程如下: 學習 C-Minus-f 的詞法規(guī)則 學習 FLEX 工具使

    2024年01月20日
    瀏覽(85)
  • 編譯原理———詞法分析器

    編譯原理———詞法分析器

    設計并實現(xiàn)一個包含預處理功能的詞法分析程序,加深對編譯中詞法分析過程的理解。 輸入:所給文法的源程序字符串。 輸出:二元組(syn,token或sum)構成的序列。其中, ?syn為單詞種別碼。 ?Token為存放的單詞自身字符串。 ?Sum為整型常量。 具體實現(xiàn)時,可以將單詞的二

    2024年02月08日
    瀏覽(90)
  • 編譯原理詞法分析器(C/C++)

    編譯原理詞法分析器(C/C++)

    ? ? ? ? 詞法分析器不用多說,一開始我還不知道是什么樣的,看了下別人的博客,再看看書,原來是輸出二元組,這不就是字符串操作嘛。然后細看幾篇博客,發(fā)現(xiàn)大都是用暴力判斷來寫的。我對代碼重復性比較高的方法不太感冒,不是說我編程有多好,就是單純的不喜歡

    2024年02月06日
    瀏覽(86)
  • 編譯原理1.6習題 程序設計語言基礎

    編譯原理1.6習題 程序設計語言基礎

    圖源:文心一言 編譯原理習題整理~???? 作為初學者的我,這些習題主要用于自我鞏固。由于是自學,答案難免有誤,非常歡迎各位小伙伴指正與討論!???? 第1版:自己的解題,與AI老師的判卷~???? 編輯: 梅頭腦??? 審核: 文心一言 題源: 龍書《編譯原理》 Alfre

    2024年01月19日
    瀏覽(94)
  • 算法設計與分析實驗:分治與減治算法實驗:題目1 數(shù)字旋轉(zhuǎn)方陣程序設計

    算法設計與分析實驗:分治與減治算法實驗:題目1 數(shù)字旋轉(zhuǎn)方陣程序設計

    目錄 前言 一、數(shù)字旋轉(zhuǎn)方陣 二、實驗內(nèi)容 三、實驗目的 四、實驗步驟 五、實驗過程 ?總結(jié) 算法同樣是計算機四大件的一個很重要的內(nèi)容,本實驗的目的是通過編寫一個數(shù)字旋轉(zhuǎn)方陣程序,來掌握分治與減治算法的基本思想和實現(xiàn)方法。 數(shù)字旋轉(zhuǎn)方陣是一個n×n的矩陣,其

    2024年02月01日
    瀏覽(120)
  • 網(wǎng)絡程序設計實驗-TCP/IP協(xié)議棧源代碼分析

    ? inet_init代碼如下: 調(diào)用inet_init的過程中,涉及到的函數(shù)如下: 1. start_kernel: start_kernel 是Linux內(nèi)核的啟動函數(shù),定義在 init/main.c 文件中。 在啟動過程中,首先執(zhí)行 start_kernel ,這個函數(shù)負責進行內(nèi)核的初始化工作。 2. rest_init: 在 start_kernel 中,會調(diào)用 rest_init 函數(shù),該函數(shù)的

    2024年02月03日
    瀏覽(100)
  • 網(wǎng)絡程序設計實驗:TCP/IP協(xié)議棧源代碼分析

    深入理解TCP/IP協(xié)議棧的源代碼結(jié)構和功能,探究其與上層套接口和下層數(shù)據(jù)鏈路層的關聯(lián)方式。 分析TCP的三次握手過程,理解其狀態(tài)轉(zhuǎn)換和數(shù)據(jù)傳輸機制。 掌握send和recv操作在TCP/IP協(xié)議棧中的執(zhí)行路徑,探究其與上層應用程序的交互方式。 了解路由表、ARP緩存以及IP到MAC地址

    2024年02月03日
    瀏覽(123)
  • 網(wǎng)絡程序設計專題實驗:TCP/IP協(xié)議棧源代碼分析

    inet_init是如何被調(diào)用的?從start_kernel到inet_init調(diào)用路徑 跟蹤分析TCP/IP協(xié)議棧如何將自己與上層套接口與下層數(shù)據(jù)鏈路層關聯(lián)起來的? TCP的三次握手源代碼跟蹤分析,跟蹤找出設置和發(fā)送SYN/ACK的位置,以及狀態(tài)轉(zhuǎn)換的位置 send在TCP/IP協(xié)議棧中的執(zhí)行路徑 recv在TCP/IP協(xié)議棧中的執(zhí)

    2024年02月02日
    瀏覽(92)
  • 編譯原理實驗三:預測分析法語法分析器的設計

    編譯原理實驗三:預測分析法語法分析器的設計

    ? 根據(jù)文法編制預測分析法語法分析程序,以便對輸入的符號串進行語法分析。通過編寫預測分析法語法分析程序掌握預測分析法的基本原理、FIRST和FOLLOW集的計算、預測分析表的構造方法以及語法分析法主控程序的設計。 對于給定的上下文無關文法,編程完成以下功能:

    2024年02月05日
    瀏覽(92)
  • 編譯原理實驗三:算符優(yōu)先分析算法的設計與實現(xiàn)

    編譯原理實驗三:算符優(yōu)先分析算法的設計與實現(xiàn)

    實驗三 算符優(yōu)先分析算法的設計與實現(xiàn) 一、 實驗目的 根據(jù)算符優(yōu)先分析法,對表達式進行語法分析,使其能夠判斷一個表達式是否正確。通過算符優(yōu)先分析方法的實現(xiàn),加深對自下而上語法分析方法的理解。 二、 實驗要求 1、輸入文法??梢允侨缦滤阈g表達式的文法(你

    2024年02月06日
    瀏覽(98)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包