#define _CRT_SECURE_NO_WARNINGS;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <string>
#include "head.h"
#include <vector>
using namespace std;
char KeyWord[] = "保留字";
char ID[] = "标识符";
char keyWord[50][100] = { "void","main","printf","if","else","return","int" };
int currentNum = 0;
char entry[40];
FILE* cstream, * outstream;
ChainList keyWordList;
ChainList idList;
int move(int s, char ch);
void AutoForId(FILE* cstream, FILE* outstream);
int getLength(char ch[]);
int main()
{
ChainListNode* temp;
while (strcmp("",keyWord[currentNum])!=0)
{
if (keyWordList.Insert(keyWord[currentNum], currentNum, KeyWord))
printf("%s\n", "插入成功!");
else
printf("%s\n","插入失败!");
currentNum++;
}
currentNum = 0;
if ((cstream = fopen("d:/sample.txt", "r")) == NULL)
{
printf("Failed to open sample.txt!");
exit(0);
}
if ((outstream = fopen("d:/text.txt", "w")) == NULL)
{
printf("Failed to open text.txt");
exit(0);
}
AutoForId(cstream, outstream);
fclose(cstream);
fclose(outstream);
system("pause");
}
void AutoForId(FILE* cstream, FILE* outstream)
{
char ch;
int currentNum = 0;
int s0 = 0;
int sEnd = 2;
int s = s0;
memset(entry,'\0',sizeof(entry));
ch = fgetc(cstream);
while (ch != EOF)
{
s = move(s, ch);
if (s == sEnd)
{
//if (keyWordList.Search(entry) && !idList.Search(entry))
{
idList.Insert(entry, currentNum, KeyWord);
printf("%s\n",entry);//fprintf(outstream, "%d %s %s\n", currentNum, KeyWord, entry);
currentNum++;
}
/*else if (!keyWordList.Search(entry) && !idList.Search(entry))
{
idList.Insert(entry, currentNum, ID);
fprintf(outstream, "%d %s %s\n", currentNum, ID, entry);
currentNum++;
}*/
memset(entry, '\0', sizeof(entry));
s = s0;
}
ch = fgetc(cstream);
}
}
int move(int s, char ch)
{
if (((int)ch >= 65 && (int)ch <= 90) || ((int)ch >= 97 && (int)ch <= 122) && s == 0)
{
entry[getLength(entry)] = ch;
return 1;
}
else if (s == 0)
return 0;
else if (((((int)ch >= 65 && (int)ch <= 90) || ((int)ch >= 97 && (int)ch <= 122) || ((int)ch >= 48 && (int)ch <= 57))) && s == 1)
{
entry[getLength(entry)] = ch;
return 1;
}
else if(s==1)
return 2;
}
int getLength(char ch[])
{
int length = 0;
while (ch[length] != '\0')
length++;
return length;
}
head.h
#pragma once
#include <string.h>
#include<stdio.h>
struct Data
{
public:
char* name;
int num;
char* type;
};
class ChainListNode
{
public:
Data data;
ChainListNode* nextNode;
};
class ChainListHeadNode
{
public:
ChainListNode* nextNode;
};
class ChainList
{
public:
ChainListHeadNode* firstNode;
ChainList()
{
length = 0;
firstNode = new ChainListHeadNode;
firstNode->nextNode= nullptr;
}
~ChainList()
{
ChainListNode* current;
current = firstNode->nextNode;
while (firstNode->nextNode)
{
current = current->nextNode;
delete firstNode->nextNode;
firstNode->nextNode = current;
}
delete firstNode;
}
bool Insert(char *newName,int newNum,char* newType)
{
ChainListNode* newNode = new ChainListNode;
newNode->data.name = newName;
newNode->data.num = newNum;
newNode->data.type = newType;
newNode->nextNode = firstNode->nextNode;
firstNode->nextNode = newNode;
length++;
return true;
}
bool Search(char *searchKey)
{
ChainListNode* current = firstNode->nextNode;
while (current && strcmp(searchKey,current->data.name)!=0)
current = current->nextNode;
if (current)
return true;
else
return false;
}
void Display()
{
ChainListNode* current = firstNode->nextNode;
while (current)
{
printf("%s\n",current->data.name);
current = current->nextNode;
}
}
int getListLength()
{
return length;
}
private:
int length ;
};
这是老师布置的一个识别简单代码中标识符自动机的代码。我构造了一个保留字链表,在之后自动机代码段执行的过程中,被注释掉的if语句中的Search函数除了第一个void值,之后对所有entry执行的返回值都是true,也就是说我的第二个链表只有void一个元素。真心求教。
void main()
{
int i,j,sum;
i=j=1;
sum=0;
sum=i+j;
printf("%d\n",sum);
}