cx.cpp

来自「一个用C++实现的C的Compiler。 代码风格良好。 原作者自己写了」· C++ 代码 · 共 145 行

CPP
145
字号
#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 + =
减小字号Ctrl + -
显示快捷键?