詞法分析(編譯原理)

2021-06-29 07:44:59 字數 2686 閱讀 9201

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

本文介紹如何將掃瞄單詞,進行詞法的分析和提取

針對pascal語言的乙個程式進行分析,c語言與此相似。

首先讀入文字(test.txt)

begin

integer k;

integer m;

integer function f(n);

begin

integer n;

if n<=0 then f:=1

else f:=n*f(n-1)

end;

read(m);

k:=f(m);

write(k);

end

處理程式

mylex.c

#include #include #include #include #include #define max_id_length 256

#define max_table_size 2048

#define success 1

/*token序列*/

typedef enum token

token;

/*符號表中的結構*/

typedef struct symtableitem

symtableitem;

int line=1;/*全域性計數變數,主要用於顯示處理所在行的行數*/

symtableitem symtable[max_table_size];

/*保留字*/

char *reserved_table =

;/*運算元*/

char* operator_table=

;/*函式宣告*/

void initscanner(void);

int scanonetoken(file* fp,char* temp);

void deal_one_token(char* temp);

void deal_error(char* temp);

void write_to_lex(char*temp,int count);

void write_to_error(char*temp);

void write_to_symtab1(char*temp,int count);

//************************************

// method: initscanner

// fullname: initscanner

// access: public

// returns: void

// qualifier:

//************************************

void initscanner(void)

else

ungetc(ch,fp);/*回退乙個讀進的字元*/

return success;

break;

case '!':

case ':':

case '=':

temp[temp_count++]=ch;

ch=getc(fp);

if (ch!='=')

else

temp[temp_count++]=ch;

return success;

break;

case '(':

case ')':

case ',':

case ';':

case '+':

case '-':

case '*':

case '/':

temp[temp_count++]=ch;

return success;

break;

default:

temp[temp_count++]=ch;

write_to_error(temp);/*錯誤處理*/

system("pause");

break;

}return !success;

}//************************************

// method: deal_one_token

// fullname: deal_one_token

// access: public

// returns: void

// qualifier:

// parameter: char * temp

//************************************

void deal_one_token(char* temp)

}/*判斷是不是運算子*/

for (count=0; count<15; count++)

}/*檢視是不是在符號表中已經標記出來,如果標記則返回,否則在符號表中標記*/

for(count=0; symtable[count].init&&(count

編譯原理詞法分析

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

編譯原理詞法分析

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

編譯原理 詞法分析

根據龍書 編譯原理 和 網易雲課堂華保健的 編譯原理 整理而成的。下面是思維導圖的筆記 技術過程 詞法分析的整體流程 2.詞法分析 詞法分析階段 生成詞法單元 一些基礎概念 模式 詞素 詞法單元的規約 串 string 語言 language 語言上的運算 正規表示式 正則集合 正規表示式的代數定律...