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

📄 dy.cpp

📁 次代码是编译原理中的简单的扫描器设计 主要是针对在校大学生在编译原理实验中 对简单的扫描器设计实验有困难的同学
💻 CPP
字号:
#include <stdio.h>
#include<iostream>
#include <string>
using namespace std;
#define N 15

struct TokenType
{   int code,value;  };
char *keywords[]={"program","procedure","begin","end","while","do",
"+","*",":",":=","=",",",";","(",")"};              //关键字表、界符表
char ID[10][10];                                             //符号表
int m;
int Cons[10];                                                //常数表
int n;

void Print(struct TokenType token)                               //输出Token
{
	printf("(%d %d)",token.code,token.value);
}
void ProcError()
{
	printf("err!");
}

int IsLetter(char ch)                       //判断ch是否为字母
{  if (ch>='A' && ch<='Z' || ch>='a' && ch<='z')
       return 1;
   else 
       return 0;
}
int IsDigit(char ch)                       //判断ch是否为数字
{  if (ch>='0' && ch<='9')
       return 1;
   else 
       return 0;
}

int Reserve(char *strToken)      
        //用strToken中的单词去查关键字表。查到了,则返回该关键字的编码;
                //否则,返回0
{   int i=0;
    while (i<N)                        //设N为关键字表中元素的个数
    {  if (!strcmp(keywords[i], strToken))
           return (i+3);
       i++;
     }
     return 0;
}

int InsertID(char *strToken)              
//用strToken中的单词去查符号表。查到了,则返回该单词在表中的位置值;
            //否则,将strToken中的单词插入符号表的尾部,并返回位置值
{   int i=0;
    while (i<m)                   //设m为符号表中已有的标识符的个数
    {   if (!strcmp(ID[i], strToken))
           return i;
        i++;
     }
     strcpy(ID[i],strToken);
     m++;
     return i;
}

int trans(char *str)
{
	int num,i;
	num=i=0;
	while (str[i])
		num=10*num+str[i++]-48;
	return num;
}

int InsertConst(char *strToken)             
 //用strToken中的单词去查常数表。查到了,则返回该单词在表中的位置值;
                 //否则,将strToken中的单词插入常数表的尾部,并返回位置值
{   int i=0;
    int num;             
    num=trans(strToken);                                 //将常数串转换为数字
    while (i<n)                                  //设n为常数表中已有的常数的个数
    {  if (Cons[i]==num)
           return i;
       i++;
     }
     Cons[i]=num;
     n++;
     return i;
}

int main(int argc, char* argv[])
{
    char line[]="  x:=a*b+2;";
	int i_line;
	char ch;                                                    //当前字符
    char strToken[15];                                            //当前单词
	int i_str;
    struct TokenType Token[50];                                     //Token数组
    int code,value;
    int i;
	i=0;
    i_line=0;
	ch=line[i_line++];                             //读取当前字符到ch     
	while (ch)
	{
	    i_str=0;
		                           
        while (ch==' ')
            ch=line[i_line++];

  	    if (IsLetter(ch))
		{
            while (IsLetter(ch)||IsDigit(ch))       //拼关键字或标识符
			{  
				strToken[i_str++]=ch;               //将ch中的字符拼接到strToken中
                ch=line[i_line++];
			}
		    i_line--;                          //Retract()
			strToken[i_str]='\0';
            code=Reserve(strToken);                   //查关键字表;
            if (!code)                                //未查到,是一个标识符
			{
                value=InsertID(strToken);        //将strToken中的单词插入到符号表中
                Token[i].code=1; 
                Token[i].value=value;
                Print(Token[i++]);                      //输出Token
			}
            else
			{
                Token[i].code=code; 
                Token[i].value=-1;
                Print(Token[i++]);                      //输出Token
			}
		} 
        else if (IsDigit(ch))                          //           处理常数;
		{
            while (IsDigit(ch))                     //拼常数
			{   strToken[i_str++]=ch;               //将ch中的字符拼接到strToken中
                ch=line[i_line++];
			}
		    i_line--;                              //Retract()
            strToken[i_str]='\0';
            value=InsertConst(strToken);          //将strToken中的单词插入到常数表中
            Token[i].code=2; 
            Token[i].value=value;
            Print(Token[i++]);                      //输出Token
		}
        else                                    //  处理界符或错误处理;
		{
            strToken[i_str++]=ch;               //将ch中的字符拼接到strToken中;
            if (ch==':')                           //    处理双界符":=";
			{
                ch=line[i_line++];
                if (ch=='=')
                    strToken[i_str++]=ch;
                else
                    i_line--;                         //回溯一个字符
			}
            strToken[i_str]='\0';
            code=Reserve(strToken);                   //查界符表
            if (!code)                                //未查到 
                ProcError();                        //错误处理
            else                                    //生成并输出一个界符Token;
			{
                Token[i].code=code; 
                Token[i].value=-1;
                Print(Token[i++]);                      //输出Token
			}
		}
     ch=line[i_line++];
    }
	printf("\n");
    for (i=0;i<m;i++)
		printf("%s ",ID[i]);
	printf("\n");
    for (i=0;i<n;i++)
		printf("%d ",Cons[i]);
	printf("\n");
	return 0;
}

⌨️ 快捷键说明

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