Lex Version0.4到此为止已经完成了编译原理的实验,实现了从词法分析到语法分析再到语义分析生成三地址码的过程。
class Heap部分根据语义分析生成三地址码的需要进行了部分修改。全部代码稍后放出。
#ifndef _HEAP_H_
#define _HEAP_H_
class Heap {
private:
int syn[100];//存储词法分析后的符号表种别码
char token[100][10];//存储词法分析后的符号表词素
int head, tail;//游标,head表示当前使用的位置,tail表示当前可用的第一个位置。
public:
Heap();
~Heap();
int first();//head=0并返回该syn。-1表示失败。
int prev();//head前移并返回该syn。-1表示失败。
int next();//head后移并返回该syn。-1表示失败。
bool append(int, char*);//加入syn和token
char* getToken();//获得当前词素
};
#endif
#include “StdAfx.h”
#include “Heap.h”
#include <string.h>
Heap::Heap()
{
for(int i = 0; i < 100; i++)
syn[i] = -1;
memset(token, 0, sizeof(token));
head = tail = 0;
}
Heap::~Heap()
{
}
int Heap::first()
{
head = 0;
return syn[head];
}
int Heap::prev()
{
if(head == 0)
return -1;
return syn[–head];
}
int Heap::next()
{
if(head == tail – 1)
return -1;
return syn[++head];
}
bool Heap::append(int tempsyn, char* temptoken)
{
if(tail >= 100)
return false;
syn[tail] = tempsyn;
strcpy(token[tail++], temptoken);
return true;
}
char* Heap::getToken()
{
return token[head];
}