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

詞法分析器的設計與實現(xiàn)

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

1、實驗目的及要求

1.1、實驗目的

????????加深對詞法分析器的工作過程的理解;加強對詞法分析方法的掌握;能夠采用一種編程語言實現(xiàn)簡單的詞法分析程序;能夠使用自己編寫的分析程序?qū)唵蔚某绦蚨芜M行詞法分析。

1.2、實驗要求

? ? ? ? 1)對單詞的構詞規(guī)則有明確的定義;

? ? ? ? 2)編寫的分析程序能夠正確識別源程序中的單詞符號;

? ? ? ? 3)識別出的單詞以<種別碼,值>的形式保存在符號表中,正確設計和維護符號表;

? ? ? ? 4)對于源程序中的詞法錯誤,能夠做出簡單的錯誤處理,給出簡單的錯誤提示,保證順利完成整個源程序的詞法分析;

2、實驗步驟

2.1、詞法分析規(guī)則

????????<標識符>::=<字母>|<標識符><字母>|<標識符><數(shù)字>

????????<常數(shù)>::=<數(shù)字>|<數(shù)字序列><數(shù)字>

????????<數(shù)字序列>::=<數(shù)字序列><數(shù)字>|<數(shù)字>|<.>

????????<字母>::=a|b|c|……|x|y|z

????????<數(shù)字>::=0|1|2|3|4|5|6|7|8|9

????????<運算符>::=<關系運算符>|<算術運算符>|<邏輯運算符>|<位運算符>|<賦值運算符>

????????<算數(shù)運算符>::=+|-|*|/|...|--

????????<關系運算符>::=<|>|!=|>=|<=|==

????????<邏輯運算符>::=&&| || |!

????????<位運算符>::=&| | |!

????????<賦值運算符>::==|+=|-=|/=|*=

????????<分界符>::=,|;|(|)|{|}|:| // |/**/

????????<保留字>::=main|if|else|while|do|for|...|void

2.2、單詞符號的編碼

單詞符號

種別碼

單詞符號

種別碼

main

0

>

26

if

1

>=

27

else

2

<

28

while

3

<=

29

do

4

!

30

for

5

!=

31

switch

6

=

32

case

7

==

33

int

8

(

34

double

9

)

35

float

10

{

36

long

11

}

37

void

12

;

38

+

13

39

+=

14

|

40

++

15

||

41

-

16

數(shù)字

42

-=

17

標識符

43

--

18

,

44

&

19

//

45

&&

20

/**/

46

#

21

*

22

*=

23

/

24

/=

25

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

詞法分析器的設計與實現(xiàn),課程設計,c語言,課程設計

2.4、算法分析

????????①詞法分析器工作的第一步是輸入源程序文本。為了更好地對單詞符號識別,把輸入串預處理一下。預處理主要濾掉空格,跳過注釋、換行符等。

????????②對預處理后的輸入串依次掃描單個字符,使用if-while嵌套語句和switch case語句判斷字符的類型,具體識別方法可看狀態(tài)轉(zhuǎn)換圖。有時為了確定詞性,需要超前掃描,若超前掃描的字符對識別當前單詞無用處,則需要退還給輸入串,以備識別下一單詞字符時使用。

????????③若讀入的字符與單詞符號編碼表的字符匹配不上,則報錯,并輸出出錯行數(shù)。對識別處的單詞符號以(單詞符號,種別碼)二元式的形式輸出。

3、實驗內(nèi)容

3.1、流程圖

詞法分析器的設計與實現(xiàn),課程設計,c語言,課程設計

3.2、程序的變量與函數(shù)說明

  • input:全局字符數(shù)組,用來存放輸入串
  • word:全局字符數(shù)組,用來存放獲取到的單詞符號,限定長度為8
  • ch:全局字符變量,用來存放最新讀入的字符
  • syn:全局整型變量,表示單詞符號的編碼
  • p:全局整型變量,表示當前字符在input數(shù)組的位置
  • m:全局整型變量,表示最新讀入的字符在word數(shù)組的下標
  • line:全局整型變量,當前行數(shù)
  • keyword:全局字符數(shù)組,存放關鍵字
  • init():獲取輸入串
  • isKey():判斷關鍵字的函數(shù),若參數(shù)數(shù)組中是關鍵字,則把syn置為該關鍵字對應的編碼并返回1,否則返回0
  • isLetter():判斷字母的函數(shù),若參數(shù)字符是字母,則返回1,否則返回0
  • isDigit():判斷數(shù)字的函數(shù),若參數(shù)字符是數(shù)字,則返回1,否則返回0
  • isSpace():判斷空白符的函數(shù),若參數(shù)字符是空格、TAB或換行符,則返回1,否則返回0
  • scaner():掃描輸入串的函數(shù),對讀出的字符進行判斷,若是單詞符號表中的符號,則將syn置為對應的編碼

3.3、源代碼

#include <stdio.h>
#include <string.h>

char input[1000];//輸入串 
char word[8];//獲取到的單詞 
char ch;
int syn;//種別碼 
int p; 
int m;
int line;//行數(shù) 
//關鍵字 
char keyword[][8]={"main","if","else","while","do","for","switch","case","int","double","float","long","void"};

void scaner(void);
//獲取輸入串 
void init()
{
	int i=0;
	printf("\n please input a string(end with '#'):\n");
 	do{
		scanf("%c",&ch);
		input[i++]=ch;
	}while(ch!='#');
} 
//判斷是不是關鍵字 
int isKey(char *str)
{	
	int n; 
	for(n=0;n<13;n++)
	{
		if(strcmp(str,keyword[n])==0)
       	{
		   syn=n;
		   return 1;
       	}
	}
	return 0;
}

//判斷是不是數(shù)字
int  isDigit(char c)
{
	if (c>='0'&&c<='9')
		return 1;
	else
		return 0;
}
//判斷是不是字母
int isLetter(char c)
{
	if ((c<='z'&&c>='a')||(c>='A'&&c<='Z'))
		return 1;
	else
		return 0;
} 
int isSpace(char c)
{
	if (c==' '||c=='\t'||c=='\n')
	{
		return 1;
	}
	return 0;
}
void main()
{
	init();//輸入字符串 
	line=0;
 	p=0;
	do{
		scaner();
		switch(syn)
	 	{
  			case -1:
  				printf("you have input a wrong string in line %d\n",line);
      			break;
			default: 
	  			printf("( %s,%d )\n",word,syn);
	      		break;
	  	}
	}while(syn!=21);
 }

void scaner(void)
{  
 	//清空word 
    for(m=0;m<8;m++) 
	{
		word[m] = ' ';
	} 
	//讀取字符 
	ch=input[p++];
	m=0;
	//當ch為空格或換行符時,繼續(xù)往下讀 
    while(isSpace(ch))
    {
    	if (ch=='\n')
    	{
    		line++;
		}
    	ch=input[p++];
	}
	
	//如果以字母開頭 
    if(isLetter(ch))
    {
		//如果往后是字母或數(shù)字,把字符存入word中,然后往下繼續(xù)讀 
		//串長超過8則截斷 
      	while((isLetter(ch)||isDigit(ch))&&m<8)
      	{
      		word[m++]=ch;
       		ch=input[p++];
     	}
      	p--;
      	syn=43;
      	word[m++]='\0';
      	isKey(word);//判斷是不是關鍵字 
     }
     //如果是以數(shù)字開頭,并且往后是數(shù)字 
	 else if(isDigit(ch))
     {
      	while((isDigit(ch)||ch=='.')&&m<8)
    	{
	    	word[m++]=ch;
	      	ch=input[p++];
    	}
    	//如果數(shù)字之后是字母 ,則出錯 
    	if (isLetter(ch))
    	{
    		while(!isSpace(ch))
    		{
    			ch=input[p++];
			}
			syn=-1;
			return ;
		}
		p--;
   		syn=42;

    }
    else 
    {
		switch(ch)
		{
			//比較運算符 
			case '<':
				word[m++]=ch;
				ch=input[p++];
				if(ch=='=')
				{
					syn=29;
					word[m++]=ch;
				}
				else
				{
					syn=28;
					p--;
				}
				break;
			case '>':
				word[m++]=ch;
				ch=input[p++];
				if(ch=='=')
				{
					syn=27;
					word[m++]=ch;
				}
				else
				{
					syn=26;
					p--;
				}
				break;
			case '!':
				ch=input[p++];
				if(ch=='=')
				{
					syn=31;
					word[m++]=ch;
				}
				else
				{
					syn=30;
					p--;
				}
				break;
			case '=':
				word[m++]=ch;
				ch=input[p++];
				if(ch=='=')
				{
					syn=33;
					word[m++]=ch;
				}
				else
				{
					syn=32;
					p--;
				}
				break;
			//算術運算符+、-、*、/ 
			case '+':
				word[m++]=ch;
				ch=input[p++];
				if(ch=='+')
				{
					syn=15;
					word[m++]=ch;
				}
				else if(ch=='=')
				{
					syn=14;
					word[m++]=ch;
				}
				else
				{
					syn=13;
					p--;
				}
				break;
			case '-':
				word[m++]=ch;
				ch=input[p++];
				if(ch=='-')
				{
					syn=18;
					word[m++]=ch;
				}
				else if(ch=='=')
				{
					syn=17;
					word[m++]=ch;
				}
				else if (isDigit(ch))
				{
					while(isDigit(ch))
			    	{
				    	word[m++]=ch;
				      	ch=input[p++];
			    	}
			    	p--;
			   		syn=42;
				}
				else
				{ 
					syn=16;
					p--;
				}
				break;
			case '*':
				word[m++]=ch;
				ch=input[p++];
				if(ch=='=')
				{
					syn=23;
					word[m++]=ch;
				}
				else
				{
					syn=22;
					p--;
				}
				break;
			case '/':
				word[m++]=ch;
				ch=input[p++];
				if(ch=='=')
				{
					syn=25;
					word[m++]=ch;
				}
				//如果是單行注釋,則讀到換行符為止 
				else if (ch=='/')
				{
					word[m++]=ch;
					syn=45;
					while (ch!='\n')
					{
						ch=input[p++];
					}
					line++;
				}
				//如果是多行注釋,則讀到匹配的*/為止
				else if(ch=='*')
				{
					word[m++]=ch;
					syn=46;
					int flag=1;
					while (flag)
					{
						ch=input[p++];
						if (ch=='*')
						{
							if (input[p++]=='/')
							{
								word[m++]='*';
								word[m++]='/';
								flag=0;
							}
							else
							{
								p--;
							}
						}
						if (ch=='\n')
						{
							line++;
						}
					}
				}
				else
				{
					syn=24;
					p--;
				}
				break;
			//界符 
			case '(': 
				syn=34;
				word[m++]=ch;
				break;
			case ')':
				syn=35;
				word[m++]=ch;
				break;
			case '{': 
				syn=36;
				word[m++]=ch;
				break;
			case '}': 
				syn=37;
				word[m++]=ch;
				break;
			case ';':
				syn=38;
				word[m++]=ch;
				break;
			case '#': 
				syn=21;
				word[m++]=ch;
				break;
			case ':':
				syn=39;
				word[m++]=ch;
				break;
			case ',':
				syn=44;
				word[m++]=ch;
				break;
			//邏輯運算符
			case '&':
				word[m++]=ch;
				ch=input[p++];
				if(ch=='&')
				{
					syn=20;
					word[m++]=ch;
				}
				else
				{ 
					syn=19;
					p--;
				}
				break;
			case '|':
				word[m++]=ch;
				ch=input[p++];
				if(ch=='|')
				{
					syn=41;
					word[m++]=ch;
				}
				else
				{ 
					syn=40;
					p--;
				}
				break;
			default:
				syn=-1;
				break;
			}
	}
	//字符串結(jié)束符 
	word[m++]='\0';
}

4、實驗結(jié)果

詞法分析器的設計與實現(xiàn),課程設計,c語言,課程設計

因為printf和""不是單詞符號表中的符號,因而判定輸入有錯

?詞法分析器的設計與實現(xiàn),課程設計,c語言,課程設計

?詞法分析器的設計與實現(xiàn),課程設計,c語言,課程設計

?完整實驗報告:詞法分析器的設計與實現(xiàn)-C文檔類資源-CSDN文庫文章來源地址http://www.zghlxwxcb.cn/news/detail-646746.html

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

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

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

相關文章

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

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

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

    2024年02月06日
    瀏覽(86)
  • 編譯原理C++單詞拼裝器&詞法分析器實驗思路

    編譯原理C++單詞拼裝器&詞法分析器實驗思路

    本文只涉及功能實現(xiàn)的思路,針對期末復習,不涉及制作操作界面。 實驗內(nèi)容 1. 把C++源代碼中的各類單詞(記號)進行拼裝分類。 C++語言包含了幾種類型的單詞(記號):標識符,,數(shù)(包括整數(shù)、浮點數(shù)),字符串、注釋、特殊符號(分界符)和運算符號等【詳細

    2024年04月08日
    瀏覽(90)
  • 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)
  • 編譯原理實驗三:預測分析法語法分析器的設計

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

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

    2024年02月05日
    瀏覽(92)
  • 基于PyTorch的中文情緒分析器設計與開發(fā)

    基于PyTorch的中文情緒分析器設計與開發(fā)

    收藏和點贊,您的關注是我創(chuàng)作的動力 ?? 情感分析在最近的十年內(nèi)得到了快速的發(fā)展,這歸功于大數(shù)據(jù)的支持。相較于英語而言,中文的使用同樣廣泛。如何把握中文里的情感也是服務行業(yè)所關注的問題。本文旨在研究中文情緒分析的設計與開發(fā),意在基于Pytorch平臺,利

    2024年02月06日
    瀏覽(23)
  • 編譯原理——語法分析器(C/C++代碼實現(xiàn))

    編譯原理——語法分析器(C/C++代碼實現(xiàn))

    編寫一個簡單的LL(1)語法分析器。(注意:此實驗是簡化版的LL(1)文法,已給出預測分析表,不需要求FIRST和FOLLOW集,直接根據(jù)預測分析表編寫程序即可) 根據(jù)編譯原理理論課中學習的算術表達式文法,以及該文法LL(1)分析表,用C語言編寫接受算術表達式為輸入的語法

    2023年04月26日
    瀏覽(65)
  • 編譯原理——SLR(1)語法分析器(C/C++代碼實現(xiàn))

    編譯原理——SLR(1)語法分析器(C/C++代碼實現(xiàn))

    設計、編制、實現(xiàn)并調(diào)試SLR(1)語法分析器,加深對語法分析的理解。 根據(jù)編譯原理理論課中學習的算術表達式文法以及該文法的LR分析表,用C語言編寫接受算術表達式為輸入的語法分析器,以控制臺(或文本文件,也可以結(jié)合詞法分析器完成)為輸入,控制臺(或文件)

    2024年02月11日
    瀏覽(24)
  • 【一步步開發(fā)AI運動小程序】十二、自定義一個運動分析器,實現(xiàn)計時計數(shù)02

    【一步步開發(fā)AI運動小程序】十二、自定義一個運動分析器,實現(xiàn)計時計數(shù)02

    隨著人工智能技術的不斷發(fā)展,阿里體育等IT大廠,推出的“樂動力”、“天天跳繩”AI運動APP,讓 云上運動會、線上運動會、健身打卡、AI體育指導 等概念空前火熱。那么,能否將這些在APP成功應用的場景搬上小程序,分享這些概念的紅利呢?本系列文章就帶您一步一步從

    2024年02月13日
    瀏覽(22)
  • 【一步步開發(fā)AI運動小程序】十二、自定義一個運動分析器,實現(xiàn)計時計數(shù)01

    【一步步開發(fā)AI運動小程序】十二、自定義一個運動分析器,實現(xiàn)計時計數(shù)01

    隨著人工智能技術的不斷發(fā)展,阿里體育等IT大廠,推出的“樂動力”、“天天跳繩”AI運動APP,讓 云上運動會、線上運動會、健身打卡、AI體育指導 等概念空前火熱。那么,能否將這些在APP成功應用的場景搬上小程序,分享這些概念的紅利呢?本系列文章就帶您一步一步從

    2024年02月09日
    瀏覽(19)
  • 分析器:常見問題

    分析器:常見問題

    源生成器(增量生成器)由于它特殊的定位,關于它的調(diào)試十分困難。在這里分享一些調(diào)試它的經(jīng)驗。 另外經(jīng)常有寫類庫,然后提供可以生成代碼的Attribute給用戶的需求,此時需要用到傳遞引用的知識點。 源生成器項目和普通的項目不同。 普通的會在你按下運行或調(diào)試后才

    2024年02月01日
    瀏覽(15)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包