這學期的編譯原理課語法分析已經快講完了。整個編譯器的前端主要就包括了詞法分析和語法分析兩個部分。現在自己開始著手用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...