资源简介

手工构造一个能够识别 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< string> 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

评论

共有 条评论