⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cx.cpp

📁 一个用C++实现的C的Compiler。 代码风格良好。 原作者自己写了这个编译器
💻 CPP
字号:
#include <cstdio>
#include <string>

using namespace std;

int MAKE_EXE = 0;

void printhelp()
{
	puts("Usage: cx [options] file");
	puts("Options:");
	puts("    --help                   Display this information");
	puts("    -m[sub options]          Designate target mode of compilation");
	puts("      k                      Kernel mode, this is the default mode");
	puts("      u                      User mode");
	puts("    -s[stacksize]            Arrange stack size in user mode, ");
	puts("                                              the default size is 256 words");
	puts("    -o[filename]             Designate output file name, ");
	puts("                                              the default name is code.cod");
}

int main(int argc, char* argv[])
{
	int kernel_mode = 1;
	int filecnt = -1;
	puts("Compiler of Xaser version 0.6 [2007/12/16] for mips16e by Zhou Yuan");
	for (int i = 1; i < argc; i++)
	{
		if (filecnt == -1 && argv[i][0] != '-')
		{
			filecnt = i;
		}
		if (argv[i][0] == '-' && argv[i][1] == '-' && argv[i][2] == 'h' && argv[i][3] == 'e' && argv[i][4] == 'l' && argv[i][5] == 'p' && argv[i][6] == 0)
		{
			printhelp();
			return 0;
		}
		else for (int i = 1; i < argc; i ++)
		{
			if (argv[i][0] == '-')
			{
				if (argv[i][1] == 'm')
				{
					if (argv[i][2] == 'k')
					{
						kernel_mode = 1;
					}
					else if (argv[i][2] == 'u')
					{
						kernel_mode = 0;
					}
					else
					{
						printf("cx: invalid compilation mode controller.\n");
						return 1;
					}
				}
				else if (argv[i][1] == 's')
				{
					int num = -1;
					sscanf(argv[i] + 2, "%d", &num);
					if (kernel_mode)
					{
						printf("cx: cannot define stack size in kernel mode.\n");
						return 1;
					}
					if (num < 10)
					{
						printf("cx: invalid stack size of stack size defined less than 10.\n");
						return 1;
					}
				}
			}
		}
	}

	if (filecnt == -1)
	{
		printf("cx: no input file\n");
		return 1;
	}

	FILE* chkfile = fopen(argv[filecnt], "r");
	if (chkfile == NULL)
	{
		printf("cx: %s: No such file\n", argv[filecnt]);
		return 1;
	}
	fclose(chkfile);

	char cmd[1000];

	printf("Checking %s...\n", argv[filecnt]);
	int ptr = 0;
	sprintf(cmd + ptr, "checker"); for (; cmd[ptr]; ptr ++);
	for (int i = 1; i < argc; i++)
	{
		if (!(argv[i][0] == '-' && argv[i][1] == 'E' && argv[i][2] == 0))
		{
			sprintf(cmd + ptr, " %s", argv[i]); for (; cmd[ptr]; ptr ++);
		}
	}

	if (system(cmd))
	{
		printf("cx checker: fatal error: compilation aborted\n");
		return 1;
	}

	printf("Compiling %s...\n", argv[filecnt]);
	ptr = 0;
	sprintf(cmd + ptr, "toTAC"); for (; cmd[ptr]; ptr ++);
	for (int i = 1; i < argc; i++)
	{
		if (!(argv[i][0] == '-' && argv[i][1] == 'E' && argv[i][2] == 0))
		{
			sprintf(cmd + ptr, " %s", argv[i]); for (; cmd[ptr]; ptr ++);
		}
	}

	if (system(cmd))
	{
		printf("cx compiler: fatal error: compilation aborted\n");
		return 1;
	}

	printf("Making binary file...\n");
	ptr = 0;
	sprintf(cmd + ptr, "toBIN"); for (; cmd[ptr]; ptr ++);
	for (int i = 1; i < argc; i++)
	{
		if (argv[i][0] == '-' && (argv[i][1] == 'm' || argv[i][1] == 's' || argv[i][1] == 'o'))
		{
			sprintf(cmd + ptr, " %s", argv[i]); for (; cmd[ptr]; ptr ++);
		}
	}
	if (system(cmd))
	{
		printf("cx compiler: fatal error: compilation aborted\n");
		return 1;
	}

	return 0;
}

⌨️ 快捷键说明

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