資源簡介
手工構造一個能夠識別 C語言的所有典型單詞,如:標識符、數字、運算
符,和 if、while 等保留字的確定有限自動機,并寫出對應該自動機的程
序;然后以一個簡化的 C語言程序為輸入文件,通過所設計的基于上述自
動機的詞法分析程序獲得輸入文件中的各個單詞及其內碼對照表,并以文
件形式保存結果(也就是TOKEN序列) 。

代碼片段和文件信息
#include?
#include?
#define?HEAD_BEGIN?1
#define?HEAD_END?2
#define?layer_ID?3
#define?BEGIN?4
#define?ERROR?5
#include?“lex.h“
#pragma?once
#pragma?warning(disable:4786)
#pragma?warning(disable:4503)
using?namespace?std;
int?lineno?=?1;
void?replaceRe(string?&re);
ifstream?reader;
ofstream?writer;
vector?actionTable;
int?check(char?c);
struct?ReItem
{
string?id;
string?re;
};
ReItem?IdReTable[20];
///////////////////////////////////////////////////將正規式替換定義符號
void?replaceRe(string?&re1)
{
char?c;
int?j?=?1;
string?re;
int?m?=?re1.length();
if(re1[0]?==?‘{‘?&&?m?!=?1)
{
c?=?re1[j];
while(c?!=?‘}‘)
{
re?+=?c;
j++;
c?=?re1[j];
}
for(int?i?=?0?;?i?20;?i++)
{
if(re?==?IdReTable[i].id)
{
re1?=?IdReTable[i].re;
}
else
{
}
}
}
else
{
}
}
////////////////////////////////////檢查用戶所給的輸入是否符合輸入的要求
int?check(char?c)
{
c?=?reader.get();
switch(c)
{
case?‘{‘:return?HEAD_BEGIN;
case?‘}‘:return?HEAD_END;
case?‘$‘:return?layer_ID;
default:?reader.putback(c);
break;
}
return?ERROR;
}
/////////////將正規式首先進行預處理,將[]運算符替換成()和|結合的形式
string?recognizeRE(string?RE)
{
string?realRE;
for(int?i=0;i {
if(RE[i]==‘\\‘)
{
realRE+=RE[i];
realRE+=RE[i+1];
++i;
continue;
}
else?if(RE[i]==‘[‘)
{
realRE+=‘(‘;
++i;
while(RE[i]!=‘]‘)
{
if(RE[i]!=‘-‘)
{
realRE+=RE[i++];
realRE+=‘|‘;
}
else
{
for(char?c=++RE[i-1];c {
realRE+=c;
realRE+=‘|‘;
}
++i;
}
}
realRE[realRE.size()-1]=‘)‘;
}
else?realRE+=RE[i];
}
return?realRE;
}
////////////////////////////////////////////在預處理中加入鏈接符號@
string?expandConcat(string?RE)
{
string?expandedRE;
for(int?i=0;i {
expandedRE+=RE[i];
if(RE[i]==‘\\‘)
{
i++;
expandedRE+=RE[i];
if(i+1 if(RE[i+1]==‘(‘||!isOperator(RE[i+1])||RE[i+1]==‘\\‘)
expandedRE+=‘@‘;
}
else?if(RE[i]==‘*‘||RE[i]==‘)‘||!isOperator(RE[i]))
if(i+1 if(RE[i+1]==‘(‘||!isOperator(RE[i+1])||RE[i+1]==‘\\‘)
expandedRE+=‘@‘;
}
return?expandedRE;
}
////////////////////////////////////////////將正規式轉換為后綴表達式
string?toSuffixRE(string?RE)
{
???stack?tempStack;
???string?suffixRE;
???for(int?i=0;i ???{???
???if(RE[i]==‘\\‘)
???{
???suffixRE+=RE[i++];
???suffixRE+=RE[i];
???}
???else?if(RE[i]==‘*‘||RE[i]==‘|‘||RE[i]==‘@‘||RE[i]==‘(‘)
??{
??if(tempStack.empty())
??????????????tempStack.push(RE[i]);
??else
??{
??char?temp=tempStack.top();
??while(isp(temp)>=icp(RE[i]))
??{
??suffixRE+=temp;
??tempStack.pop();
??if(!tempStack.empty())
?????temp=tempStack.top();
??else?break;
??}
??tempStack.push(RE[i]);
??}
??}
??else?if(RE[i]==‘)‘)
??{
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2014-02-07?19:09??Course?Project\
?????文件???????14042??2014-01-01?14:13??Course?Project\Lexical.cpp
?????文件?????????979??2014-01-01?14:14??Course?Project\Lexical.h
?????文件????????1673??2014-01-01?14:29??Course?Project\define.h
?????文件?????????454??2014-01-01?14:09??Course?Project\input.l
?????文件????????6604??2014-01-01?14:29??Course?Project\output.cpp
?????文件???????52736??2014-01-01?14:09??Course?Project\tessss.exe
?????目錄???????????0??2014-02-07?19:08??Course?Project\測試2輸入復雜版\
?????文件????????1673??2014-01-01?14:23??Course?Project\測試2輸入復雜版\define.h
?????文件????????2275??2014-01-01?14:25??Course?Project\測試2輸入復雜版\input.l
?????文件??????881808??2014-01-01?14:30??Course?Project\測試2輸入復雜版\output.cpp
?????文件??????534016??2014-01-01?14:24??Course?Project\測試2輸入復雜版\tesss.exe
- 上一篇:VB.NET寫的FFT算法
- 下一篇:控制臺俄羅斯方塊C++源碼
評論
共有 條評論