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

📄 00045.cpp

📁 词法分析器 用c或c++描述toyl语言词法分析器
💻 CPP
字号:
#include"iostream"
using namespace std;

#define NUMBER 1
#define IDEN   2

#define is_letter(ch) ((ch)>='a' && (ch)<='Z')
#define is_digit(ch) ((ch)>='0' && (ch)<='9')
#define is_layout(ch) ((ch)==' ')
#define MAXSIZE 100

typedef struct 
{
        int classe;
        char seman1[];0
        int seman2; 
}token;

token str[MAXSIZE];

int* k;
int i=0;
k=&i;

void next_token(char* p)
{
     if(is_layout(*p))
                      *(p++);
     if(is_digit(*p))
                     recognize_number(*p);
     else if(is_letter(*p))
                           recognize_name(*p);
     switch(*p)
     {
               case '+': str[(*k)++)].seman1="PLUS";break;
               case '*': str[*(k++)].seman1="MULT";break;
               case '(': str[*(k++)].seman1="OPEN";break;
               case ')': str[*(k++)].seman1="CLOSE";break;
               case ';': str[*(k++)].seman1="SEMI";break;
               case ':': if(*(++p)!='=')     
                                             exit(1);
                         str[*(k++)].seman1="ASS";break;
               default : exit(1);
     }
}
                           

void recognize_number(char *p)
{
     int N=0;
     while((is_digit(*p)
     {
                        N=N*10+(*p-'0');
                        *(p++);
     }
     str[*k].classe=1;
     str[*k].seman2=N;
     *(k++);
}
void recognize_name(char *p)
{
     char name[]="";
     int i=0;
     name[i]=*p;
     *(p++);
     while(is_digit(*p) || is_letter(*p))
                        name[i++]=*(p++);
     name[i]='\0';
     switch(name)
     {
                 case "begin" : str[*(k++)].seman1="BEGIN";break;
                 case "end"   : str[*(k++)].seman1="END";break;
                 case "read"  : str[*(k++)].seman1="READ";break;
                 case "write" : str[*(k++)].seman1="WRITE";break;
                 default      : str[*k].classe=2;str[*(k++)].seman1=name;break;
     }
} 
int main()
{
      char str1[]="begin x:=10; read(y); x:=x+y end#";
      char* p;
      p=str1;
      while(*(p++)!='#')
      {
                        next_token(p);
      }
      getchar();
}
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
       

⌨️ 快捷键说明

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