詞法分析(英語: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 語言上的運算 正規表示式 正則集合 正規表示式的代數定律...