当前位置 博文首页 > 缘分锝天空的博客:编译原理课程设计:模型语言的语法分析器设计

    缘分锝天空的博客:编译原理课程设计:模型语言的语法分析器设计

    作者:[db:作者] 时间:2021-07-21 09:48

    ????????编译原理这门课期末有个课程设计,我们是让做一个模型语言的词法分析器的,这门课是我一年前学的,刚刚正好看到电脑里面有我当年做课程设计时的程序,在此我整理一下分享给大家,大家可以参考学习一下

    ?参考程序:

    #include<iostream>
    #include <string>
    using namespace std;
    char prog[80], token[8], ch;
    int syn, p, m, n, sum;
    const char *rwtab[6] = { "begin","if","then","while","do","end" };
    void scaner(void);
    void P();
    void L();
    void V();
    void V1();
    void S();
    void X();
    string s;
    int i;
    int ERR;
    int SwitchNum;
    int main()
    {
    	cout << endl;
    	p = 0;
    	printf("输入一个字符串(以'#'结束):\n");
    
    
    	do {
    		scanf_s("%c", &ch);
    		prog[p++] = ch;
    	} while (ch != '#');
    	cout << "词法分析结果:(词法信息,语义信息)" << endl;
    
    	p = 0;
    	do {
    		scaner();
    		switch (syn)
    		{
    		case 11:
    			printf("( %-10d%5d )\n", sum, syn);
    			break;
    
    		case -1:
    			printf("you have input a wrong string\n");
    			//getch();
    			return 0;
    			break;
    
    		default:
    			printf("( %-10s%5d )\n", token, syn);
    			break;
    		}
    	} while (syn != 0);
    	//getch();
    	do
    	{
    		s = "";
    		i = 0;
    		ERR = 0;
    		cout << "请输入一个句子(以#号结束):" << endl;
    		cin >> s;
    		s.resize(s.size() + 1);
    		s[s.size() - 1] = '#';
    		E();
    		if (s[i] == '#')
    			cout << "语法分析结果:success" << endl;
    		else
    			cout << endl;
    		cout << "输入一个整数继续,其它类型退出:";
    	} while (cin >> SwitchNum);
    
    
    	system("pause");
    	return 0;
    }
    void P()
    {
    	if (ERR == 0)
    	{
    		if (s[i] == '{') {
    			++i;
    			L();
    		}
    	}
    }
    void L()
    {
    	if (ERR == 0)
    	{
    		V();
    		if (s[i] == ';')
    		{
    			++i;
    			S();
    		}
    		else if (s[i] != '#')
    		{
    			cout << "语法分析结果:fail" << endl;
    			ERR = 1;
    		}
    	}
    }
    void V()
    {
    	if (ERR == 0)
    	{
    		if(s[i]=='a'){
    			++i;
    			if (s[i] == 'i') {
    				++i;
    				V1();
    			}
    	}
    	}
    void V1()
    {
    	if (ERR == 0)
    	{
    		if (s[i] == ',')
    		{
    			++i;
    			if (s[i] == 'i') {
    				++i;
    				V1();
    			}
    		}
    		else if (s[i] != '#')
    		{
    			cout << "语法分析结果:fail" << endl;
    			ERR = 1;
    		}
    	}
    }
    void S()
    {
    	if (ERR == 0)
    	{
    		if (s[i] == 'i')
    		{
    			++i;
    			
    			if (s[i] == '=') {
    				++i;
    				X();
    			}
    			else if (s[i] == '#')
    			{
    				cout << "语法分析结果:fail" << endl;
    				ERR = 1;
    				++i;
    			}
    		}
    		
    	}
    }
    void X() 
    {
    	if (ERR == 0) {
    		if (s[i] = 'i') {
    			++i;
    		
    
    		}
    		else
    		{
    			cout << "语法分析结果:fail" << endl;
    		}
    		if (s[i]='x')
    		{
    			++i;
    		}
    		else
    		{
    			cout << "语法分析结果:fail" << endl;
    		}
    	}
    }
    void scaner(void)
    {
    	sum = 0;
    
    	for (m = 0; m < 8; m++)
    		token[m++] = NULL;
    
    	ch = prog[p++];
    	m = 0;
    
    	while ((ch == ' ') || (ch == '\n'))
    		ch = prog[p++];
    
    	if (((ch <= 'z') && (ch >= 'a')) || ((ch <= 'Z') && (ch >= 'A')))
    	{
    		while (((ch <= 'z') && (ch >= 'a')) || ((ch <= 'Z') && (ch >= 'A')) || ((ch >= '0') && (ch <= '9')))
    		{
    			token[m++] = ch;
    			ch = prog[p++];
    		}
    
    		p--;
    		syn = 10;
    		for (n = 0; n < 6; n++)
    			if (strcmp(token, rwtab[n]) == 0)
    			{
    				syn = n + 1;
    				break;
    			}
    	}
    	else if ((ch >= '0') && (ch <= '9'))
    	{
    		while ((ch >= '0') && (ch <= '9'))
    		{
    			sum = sum * 10 + ch - '0';
    			ch = prog[p++];
    		}
    		p--;
    		syn = 11;
    	}
    	else
    	{
    		switch (ch)
    		{
    		case '<':
    			token[m++] = ch;
    			ch = prog[p++];
    			if (ch == '=')
    			{
    				syn = 22;
    				token[m++] = ch;
    			}
    			else
    			{
    				syn = 20;
    				p--;
    			}
    			break;
    		case '>':
    			token[m++] = ch;
    			ch = prog[p++];
    			if (ch == '=')
    			{
    				syn = 24;
    				token[m++] = ch;
    			}
    			else
    			{
    				syn = 23;
    				p--;
    			}
    			break;
    
    		case '+':
    			token[m++] = ch;
    			ch = prog[p++];
    			if (ch == '+')
    			{
    				syn = 17;
    				token[m++] = ch;
    			}
    			else
    			{
    				syn = 13;
    				p--;
    			}
    			break;
    
    		case '-':
    			token[m++] = ch;
    			ch = prog[p++];
    			if (ch == '-')
    			{
    				syn = 29;
    				token[m++] = ch;
    			}
    			else
    			{
    				syn = 14;
    				p--;
    			}
    			break;
    
    		case '!':
    			ch = prog[p++];
    			if (ch == '=')
    			{
    				syn = 21;
    				token[m++] = ch;
    			}
    			else
    			{
    				syn = 31;
    				p--;
    			}
    			break;
    
    		case '=':
    			token[m++] = ch;
    			ch = prog[p++];
    			if (ch == '=')
    			{
    				syn = 25;
    				token[m++] = ch;
    			}
    			else
    			{
    				syn = 18;
    				p--;
    			}
    			break;
    
    		case '*':
    			syn = 15;
    			token[m++] = ch;
    			break;
    
    		case '/':
    			syn = 16;
    			token[m++] = ch;
    			break;
    
    		case '(':
    			syn = 27;
    			token[m++] = ch;
    			break;
    
    		case ')':
    			syn = 28;
    			token[m++] = ch;
    			break;
    
    		case '{':
    			syn = 5;
    			token[m++] = ch;
    			break;
    
    		case '}':
    			syn = 6;
    			token[m++] = ch;
    			break;
    
    		case ';':
    			syn = 26;
    			token[m++] = ch;
    			break;
    
    		case '\"':
    			syn = 30;
    			token[m++] = ch;
    			break;
    
    		case '#':
    			syn = 0;
    			token[m++] = ch;
    			break;
    
    		case ':':
    			syn = 17;
    			token[m++] = ch;
    			break;
    
    		default:
    			syn = -1;
    			break;
    		}
    	}
    	token[m++] = '\0';
    }
    

    调试与运行:


    ?当时我呢也不是很有思路做这个,也是参考了一些别人写的程序,有不对的地方欢迎各位小伙伴来指正哈!!!

    觉得不错三连支持一下哦!

    cs