最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言實(shí)現(xiàn)詞法分析器

 更新時(shí)間:2019年01月31日 16:06:44   作者:flamingobaby  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)詞法分析器,一個(gè)簡(jiǎn)單的詞法分析程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

問(wèn)題描述:

用C或C++語(yǔ)言編寫(xiě)一個(gè)簡(jiǎn)單的詞法分析程序,掃描C語(yǔ)言小子集的源程序,根據(jù)給定的詞法規(guī)則,識(shí)別單詞,填寫(xiě)相應(yīng)的表。如果產(chǎn)生詞法錯(cuò)誤,則顯示錯(cuò)誤信息、位置,并試圖從錯(cuò)誤中恢復(fù)。簡(jiǎn)單的恢復(fù)方法是忽略該字符(或單詞)重新開(kāi)始掃描。

相關(guān)詞法規(guī)則

<標(biāo)識(shí)符>::=<字母>
<標(biāo)識(shí)符>::=<標(biāo)識(shí)符><字母>
<標(biāo)識(shí)符>::=<標(biāo)識(shí)符><數(shù)字>
<常量>::=<無(wú)符號(hào)整數(shù)>
<無(wú)符號(hào)整數(shù)>::=<數(shù)字序列>
<數(shù)字序列>::=<數(shù)字序列><數(shù)字>
<數(shù)字序列>::=<數(shù)字>
<字母>::=a|b|c|……|x|y|z
<數(shù)字>::=0|1|2|3|4|5|6|7|8|9
<加法運(yùn)算符>::=+|-
<乘法運(yùn)算符>::=*|/
<關(guān)系運(yùn)算符>::=<|>|!=|>=|<=|==
<分界符>::=,|;|(|)|{|}
<保留字>::=main|int|if|else|while|do

編寫(xiě)詞法分析程序的步驟:

(1)確定所要翻譯的語(yǔ)言(或其子集)。

C語(yǔ)言

(2)設(shè)計(jì)屬性字,及各類表格,如標(biāo)識(shí)符表、常量表、符號(hào)及其機(jī)內(nèi)表示對(duì)照表等。

與詞法分析有關(guān)的表格:

1. 字符表

保留字:main,int,if,else,while,do
字母(全小寫(xiě)):a|b|c|……|x|y|z
數(shù)字:0,1,2,3,4,5,6,7,8,9
運(yùn)算符和界符:<,>,!=,>=,<=,==,,,;,(,),{,}

2. 特定單詞機(jī)內(nèi)表示表

3.畫(huà)出總控流程圖及各個(gè)子程序的流程圖。

4. 程序

輸入:一個(gè)存放C語(yǔ)言程序的s.txt文件
輸出:存放以(單詞,種別碼)形式輸出的result.txt文件

需要6個(gè)數(shù)組:

1. 存儲(chǔ)關(guān)鍵字 key[6]
2. 存儲(chǔ)對(duì)應(yīng)下標(biāo)關(guān)鍵字的種別碼 keyNum[6]
3. 存儲(chǔ)運(yùn)算符和界符 symbol[17]
4. 存儲(chǔ)運(yùn)算符對(duì)應(yīng)下標(biāo)的種別碼 symbolNum[17]
5. 存儲(chǔ)從文件中取出的每個(gè)字符(不包括括號(hào))letter[1000]

主要函數(shù):

TakeWord();

功能:將文件letter[]中每個(gè)字符進(jìn)行提取,找出關(guān)鍵字,輸出種別碼

Num作為全局變量保存提取到字符的哪個(gè)下標(biāo)

1. 先提取一個(gè)字符,如果是字母,進(jìn)入case1,調(diào)用identifier(),不斷的提取字母或數(shù)字進(jìn)行連接,沒(méi)連接一個(gè)字符用int isKeyWord()程序(返回關(guān)鍵字種別碼)判斷是否為關(guān)鍵字,是就退出函數(shù)返回string,不是就繼續(xù)執(zhí)行函數(shù),直到連接的字符不再是字母或數(shù)字,即此時(shí)字符串為標(biāo)識(shí)符

2. 如果是數(shù)字,進(jìn)入case 2,調(diào)用Number()函數(shù),不斷進(jìn)行字符串連接,知道下一個(gè)連接字符不再是數(shù)字

3. 如果是符號(hào),進(jìn)入case 3,調(diào)用symbolStr()函數(shù),如果是=,>,<,!,則要繼續(xù)進(jìn)行下個(gè)字符判斷,其余符號(hào)可以直接返回

其他輔助函數(shù):

int isSymbol()判斷運(yùn)算符和界符,并返回種別碼
bool isNum() 判斷是否為數(shù)字
bool isLetter()判斷是否為字母
int isKeyWord()判斷是否為關(guān)鍵字,是返回種別碼
int typeword()返回單個(gè)字符的類型
string identifier()標(biāo)識(shí)符的連接
string symbolStr()符號(hào)和界符的連接
string Number()數(shù)字的連接
void print()輸出

程序:

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;

//關(guān)鍵字 
string key[6]={"main","int","if","else","while","do"}; 
//關(guān)鍵字的種別碼
int keyNum[6]={1,2,3,4,5,6}; 
//運(yùn)算符和界符 
string symbol[17]={"<",">","!=",">=","<=","==",",",";","(",")","{","}","+","-","*","/","="};
//char symbol[12]={'<','>','!=','>=','<=','==',',',';','(',')','{','}'};
//運(yùn)算符和界符的種別碼 
int symbolNum[17]={7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};
//存放文件取出的字符 
string letter[1000];
//將字符轉(zhuǎn)換為單詞
string words[1000];
int length; //保存程序中字符的數(shù)目 
int num;

int isSymbol(string s){ //判斷運(yùn)算符和界符 
 int i;
 for(i=0;i<17;i++){
  if(s==symbol[i])
   return symbolNum[i]; 
 }
 return 0;
} 

//判斷是否為數(shù)字 
bool isNum(string s){
 if(s>="0" && s<="9")
  return true;
 return false;
}

//判斷是否為字母 
bool isLetter(string s)
{
 if(s>="a" && s<="z")
  return true;
 return false;
}

//判斷是否為關(guān)鍵字,是返回種別碼 
int isKeyWord(string s){
 int i;
 for(i=0;i<6;i++){
  if(s==key[i])
   return keyNum[i];
 }
 return 0;
}

//返回單個(gè)字符的類型 
int typeword(string str){
 if(str>="a" && str<="z") // 字母 
  return 1;

 if(str>="0" && str<="9") //數(shù)字 
  return 2;

 if(str==">"||str=="="||str=="<"||str=="!"||str==","||str==";"||str=="("||str==")"||str=="{"||str=="}"
  ||str=="+"||str=="-"||str=="*"||str=="/") //判斷運(yùn)算符和界符 
  return 3; 

}

string identifier(string s,int n){
 int j=n+1;
 int flag=1;

 while(flag){
  if(isNum(letter[j]) || isLetter(letter[j])){
   s=(s+letter[j]).c_str();
   if(isKeyWord(s)){
    j++;
    num=j;
    return s;
   }
   j++;
  }
  else{
   flag=0;
  }
 } 

 num=j;
 return s;
}

string symbolStr(string s,int n){
 int j=n+1;
 string str=letter[j];
 if(str==">"||str=="="||str=="<"||str=="!") {
  s=(s+letter[j]).c_str();
  j++;
 }
 num=j;
 return s;
}

string Number(string s,int n){
 int j=n+1;
 int flag=1;

 while(flag){
  if(isNum(letter[j])){
   s=(s+letter[j]).c_str();
   j++;
  }
  else{
   flag=0;
  }
 }

 num=j;
 return s;
}

void print(string s,int n){
 cout<<"("<<s<<","<<n<<")"<<endl;
}

void TakeWord(){ //取單詞 
 int k;

 for(num=0;num<length;){
  string str1,str;
  str=letter[num];
  k=typeword(str);
  switch(k){
   case 1:
    {
     str1=identifier(str,num);
     if(isKeyWord(str1))
      print(str1,isKeyWord(str1));
     else
      print(str1,0);
     break;
    }

   case 2:
    {
     str1=Number(str,num);
     print(str1,24);
     break;
    }

   case 3:
    {
     str1=symbolStr(str,num);
     print(str1,isSymbol(str1));
     break; 
    }

  }

 } 
}

int main(){
 char w;
 int i,j;

 freopen("s.txt","r",stdin);
 freopen("result.txt","w",stdout); //從控制臺(tái)輸出,而不是文本輸出

 length=0;
 while(cin>>w){
  if(w!=' '){
   letter[length]=w;
   length++;
  } //去掉程序中的空格
 }

 TakeWord();
// for(j=0;j<length;j++){
//  cout<<letter[j]<<endl;
// } 

 fclose(stdin);//關(guān)閉文件 
 fclose(stdout);//關(guān)閉文件 
 return 0;
} 

運(yùn)行結(jié)果:

s.txt

Result.txt

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語(yǔ)言新手入門(mén)之格式化輸出和變量類型

    C語(yǔ)言新手入門(mén)之格式化輸出和變量類型

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中格式化輸出和變量類型的相關(guān)資料,文中的教程非常適合新手零基礎(chǔ)的朋友們參考學(xué)習(xí),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • C++中的Lambda表達(dá)式詳解

    C++中的Lambda表達(dá)式詳解

    這篇文章主要介紹了C++中的Lambda表達(dá)式詳解,本文講解了基本語(yǔ)法、Lambda的使用等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • C語(yǔ)言下快速排序(挖坑法)詳解

    C語(yǔ)言下快速排序(挖坑法)詳解

    大家好,本篇文章主要講的是C語(yǔ)言下快速排序(挖坑法)詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++中動(dòng)態(tài)綁定和內(nèi)存管理的實(shí)現(xiàn)

    C++中動(dòng)態(tài)綁定和內(nèi)存管理的實(shí)現(xiàn)

    本文主要介紹了C++中動(dòng)態(tài)綁定和內(nèi)存管理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • C++ OpenCV實(shí)現(xiàn)圖像去水印功能

    C++ OpenCV實(shí)現(xiàn)圖像去水印功能

    本文將介紹如何使用OpenCV C++ 進(jìn)行簡(jiǎn)單圖像水印去除。我們?cè)诰W(wǎng)上download圖片時(shí),經(jīng)常因?yàn)榘鏅?quán)問(wèn)題有水印。本案例通過(guò)編寫(xiě)算法進(jìn)行簡(jiǎn)單水印去除。需要的可以參考一下
    2022-01-01
  • C/C++最短路徑算法之迪杰斯特拉Dijkstra的實(shí)現(xiàn)詳解

    C/C++最短路徑算法之迪杰斯特拉Dijkstra的實(shí)現(xiàn)詳解

    Dijkstra(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑。本文將詳解該算法的圖解與實(shí)現(xiàn),需要的可以參考一下
    2022-07-07
  • C++游戲教程基本技巧之隨機(jī)化詳解

    C++游戲教程基本技巧之隨機(jī)化詳解

    在小游戲的制作中時(shí)常常會(huì)要用到隨機(jī)數(shù),這篇文章就來(lái)和大家談?wù)凜++中這個(gè)所謂的“隨機(jī)”。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-11-11
  • C++使用FFmpeg實(shí)現(xiàn)YUV數(shù)據(jù)編碼轉(zhuǎn)視頻文件

    C++使用FFmpeg實(shí)現(xiàn)YUV數(shù)據(jù)編碼轉(zhuǎn)視頻文件

    這篇文章主要介紹了C++如何使用FFmpeg實(shí)現(xiàn)把一個(gè)YUV原始視頻數(shù)據(jù)(時(shí)間序列圖像)經(jīng)過(guò)h264編碼為視頻碼流,然后在使用mp4封裝格式封裝,感興趣的可以了解一下
    2023-06-06
  • C++二分查找(折半查找)算法實(shí)例詳解

    C++二分查找(折半查找)算法實(shí)例詳解

    這篇文章主要介紹了C++二分查找(折半查找)算法,結(jié)合實(shí)例形式詳細(xì)分析了二分查找算法的原理、思想、實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • C語(yǔ)言使用普通循環(huán)方法和遞歸求斐波那契序列示例代碼

    C語(yǔ)言使用普通循環(huán)方法和遞歸求斐波那契序列示例代碼

    這篇文章主要介紹了C語(yǔ)言使用普通循環(huán)方法和遞歸求斐波那契序列示例代碼,大家參考使用吧
    2013-11-11

最新評(píng)論

安塞县| 霍山县| 霸州市| 德庆县| 武平县| 常熟市| 军事| 平果县| 泰顺县| 霸州市| 思南县| 金山区| 宜黄县| 共和县| 南雄市| 光山县| 当雄县| 南京市| 周宁县| 武城县| 房产| 永和县| 巴彦淖尔市| 河源市| 汨罗市| 鹤壁市| 福安市| 偏关县| 晋宁县| 湖北省| 高唐县| 琼中| 高淳县| 亚东县| 隆安县| 陵川县| 仙桃市| 滁州市| 理塘县| 彰武县| 中方县|