編譯原理 詞法分析部分

2021-03-31 18:23:52 字數 1837 閱讀 9889

這學期的編譯原理課語法分析已經快講完了。整個編譯器的前端主要就包括了詞法分析和語法分析兩個部分。現在自己開始著手用c語言寫編譯器的前端。以下是程式的說明。

1)該程式是詞法分析部分lexical analyse。

2)只支援無符號整數型別。不支援陣列和指標等高階特性。

3)不支援函式。注釋為c++式的「//」。

4)使用vc++.***編譯。

//lexical.h

#ifndef _lexical_h_

#define _lexical_h_

//狀態機狀態列舉

typedef enum lextokentype;

//狀態轉換結構

typedef struct transstate;

//關鍵字描述結構

typedef struct tokendes;

//記號結構

typedef struct lextoken;

lextoken* getnexttoken(char *psource);

#endif//_lexical_h_

//lexical.c

#include

#include

#include

#include "lexical.h"

//有限狀態機狀態轉換描述

transstate trans =,,,

,,,,

,,,,

,,,,

,,,,

,,,,

,,,,

};//關鍵字(保留字)描述

tokendes reserve =,,,

,,

};lextoken* getnexttoken(char *psource)

}if (i == sizestatetrans)//未找到合適的狀態轉換

ptoken->type = unknown;//認定為:遇到未知字元

ptoken->strname = null;

return ptoken;

}else//找到乙個新的記號

tokenlen = posnow - posstart;

ptoken->strname = (char*)malloc(tokenlen+1);

strncpy(ptoken->strname, psource+posstart, tokenlen);

ptoken->strname[tokenlen] = '/0';

ptoken->type = curstate;

if (ptoken->type == identi)//如果該記號被認為是識別符號}}

return ptoken;}}

else//轉換了狀態}}

///main.c

#include

#include

#include "lexical.h"

int main ()

return 0;

}//以下是測試文字(ansi格式)///

//用來測試程式,這裡是注釋

if today is monday

and 1+1=23

2123/4==6

///以下是輸出(節點名稱和節點型別編號)/

if,  4

today,  3

is,  3

monday,  3

and,  3

1,  2

+,  11

1,  2

=,  9

23,  2

2123,  2

/,  14

4,  2

==,  10

6,  2

編譯原理詞法分析

編譯原理實驗一 詞法分析練習 include include include define tokenmax 100 define progmax 1000 define k esc 27 void analytics 詞法分析 void scanner 輸入掃瞄 bool isletter cha...

詞法分析(編譯原理)

詞法分析 英語 lexical analysis 是電腦科學中將字串行轉換為單詞 token 序列的過程。進行詞法分析的程式或者函式叫作詞法分析器 lexical analyzer,簡稱lexer 也叫掃瞄器 scanner 詞法分析器一般以函式的形式存在,供語法分析器呼叫。完成詞法分析任務的程式稱...

編譯原理詞法分析

1 注意識別符號和無符號整數的重複問題,本人採用map解決。2 cin ch自動忽略空白字元。include include include include using namespace std struct pairs int isboundaries char ch return 3 case...