labelstack.h

来自「一个面向对像语言的编译器」· C头文件 代码 · 共 114 行

H
114
字号
// LabelStack.h: interface for the LabelStack class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_LABELSTACK_H__8213DBEA_9C6C_4957_A9F3_2AEAE9A67D36__INCLUDED_)
#define AFX_LABELSTACK_H__8213DBEA_9C6C_4957_A9F3_2AEAE9A67D36__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "string.h"
#include "codegen.h"
#define MAX_LABEL_STACK_COUNT 512
#include "Assert.h"
#define Assert assert
#define MAX_NO_OF_FUNC 512
extern CodeGenerator * cg;

class FunNameList
{
private:
	int size;
	const char * fns[256];
public:
	void Clear()
	{
		size=0;
	}
	FunNameList()
	{
		size=0;
	}
	~FunNameList()
	{
	}
	void Insert(const char * fn)
	{

		if(!LookUp(fn))
		{
			fns[size]=strdup(fn);
			size++;
		}

	}
	bool LookUp(const char * fn)
	{
		int i;
		for(i=0;i<size;i++)
			if(!strcmp(fns[i],fn))
				return true;
		return false;
	}
	int GetCount(){return size;};
    const char * GetAt(int i )
	{
		return fns[i];
	}
	


	
};

class LabelStack
{
public:
	LabelStack(){ top=-1;}
	~LabelStack()
	{
		top=-1;
	}
	void Push(const char * name)
	{
		top++;
		Assert(top<MAX_LABEL_STACK_COUNT);
		stack[top]=strdup(name);

	}
	void Push(int n)
	{
		
		Assert(n>0);
		int i;
		for(i=0;i<n;i++)
		{
			Push(cg->NewLabel());
		}
	}
	void Pop()
	{
		Assert(top>=0);
		top--;
	}
	void Pop(int n)
	{
		Assert(n>0);
		int i;
		for(i=0;i<n;i++)
			Pop();
	}
	const char * GetFromTop(int n=0)
	{
		Assert(top-n>=0);
		return stack[top-n];
	}
private:
	const char * stack[MAX_LABEL_STACK_COUNT];
	int  top;
};


#endif // !defined(AFX_LABELSTACK_H__8213DBEA_9C6C_4957_A9F3_2AEAE9A67D36__INCLUDED_)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?