📄 recognize_0011.cpp
字号:
// Recognize_Token.cpp: implementation of the Recognize_Token class.
//
//////////////////////////////////////////////////////////////////////
#include "Recognize_Token.h"
#include <string.h>
#include <stdio.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Recognize_Token::Recognize_Token(char strinFile[20],char stroutFile[20])
{
point = -1;
int i=0;
p_type = 0;
for(int j=0;j<100;j++)
{
Tokens[j].CLASS = 0;
strcpy(Tokens[j].SEMAN,"init");
}
/*
fstream inFile;
inFile.open(strinFile,ios::in);
if(!inFile)
{
cout<<"File can't open.\n";
abort();
}
char ch;
while(inFile.get(ch))
{
str_token[i++]=ch;
}t
str_token[i]='\0';
cout<<str_token;
inFile.close();
*/
cout<<"input source:"<<endl;
i=0;
char c;
c = getchar( );
while(c!='#')
{
str_token[i++] = c;
c = getchar( );
}
str_token[i] = '\0';
while(str_token[point] != '\0')
{
next_token( );
}
print_token(stroutFile);
/*
while(str_token[point] != '\0')
{
char ch = next_avail_char();
cout<<ch;
}
*/
}
Recognize_Token::~Recognize_Token()
{
}
void Recognize_Token::print_token(char stroutFile[20])
{
/*
fstream outFile;
outFile.open(stroutFile,ios::out);
if(!outFile)
{
cout<<stroutFile<<"can't open.\n";
abort();
}
for(int i=0;i<p_type;i++)
{
outFile<<Tokens[i].CLASS<<" "<<Tokens[i].SEMAN<<endl;
}
*/
for(int i=0;i<p_type;i++)
{
cout<<Tokens[i].CLASS<<" "<<Tokens[i].SEMAN<<endl;
}
//outFile.close();
}
void Recognize_Token::next_token( )
{
char ch = next_avail_char();
if(ch>='0' && ch<='9')
recognize_number(ch);
else if((ch>='a' && ch<='z') || (ch>= 'A' && ch<= 'Z'))
recognize_name(ch) ;
else if(ch == '+')
{
Tokens[p_type].CLASS =PLUS;
strcpy(Tokens[p_type].SEMAN ,"加号");
p_type++;
}
else if(ch == '*')
{
Tokens[p_type].CLASS =MULT;
strcpy(Tokens[p_type].SEMAN ,"乘号");
p_type++;
}
else if(ch == ':')
{
next_char( );
if(str_token[point] != '=')
error(1);
else
Tokens[p_type].CLASS =ASS;
strcpy(Tokens[p_type].SEMAN ,"赋值号");
p_type++;
}
else if(ch == ';')
{
Tokens[p_type].CLASS =SEMI;
strcpy(Tokens[p_type].SEMAN ,"分号");
p_type++;
}
else if(ch == '(')
{
Tokens[p_type].CLASS =OPEN;
strcpy(Tokens[p_type].SEMAN ,"左括号");
p_type++;
}
else if(ch == ')')
{
Tokens[p_type].CLASS =CLOSE;
strcpy(Tokens[p_type].SEMAN ,"右括号");
p_type++;
}
else if(ch == '\0')
{
Tokens[p_type].CLASS =TEOF;
strcpy(Tokens[p_type].SEMAN ,"结束号");
p_type++;
}
else
error(0);
}
void Recognize_Token::next_char( )
{
point ++;
}
char Recognize_Token::next_avail_char( )
{
point++;
while(str_token[point] == ' ' || str_token[point] == '\n')
{
point ++;
}
return str_token[point];
}
void Recognize_Token::back()
{
point--;
}
void Recognize_Token::recognize_number(char ch)
{
int N=0;
//不成功
/*
while(is_digit(str_token[point]))
{
N = N*10+(ch-'0');
next_char();
}
Tokens[p_type++].CLASS =NUMB;
strcpy(Tokens[p_type].SEMAN ,N);
*/
char name[20];
int np=0;
while(is_digit(str_token[point]))
{
name[np++] = str_token[point];
next_char( );
}
name[np] = '\0';
Tokens[p_type].CLASS =NUMB;
strcpy(Tokens[p_type].SEMAN ,name);
p_type++;
back();
}
void Recognize_Token::recognize_name(char ch)
{
char name[20];
int np=0;
name[np++] = ch;
next_char();
while((is_digit(str_token[point])) || (is_letter(str_token[point])))
{
name[np++] = str_token[point];
next_char();
}
name[np] = '\0';
int num_name;
if(!strcmp(name,"begin"))
num_name = 1;
else if(!strcmp(name,"end"))
num_name = 2;
else if(!strcmp(name,"read"))
num_name = 3;
else if(!strcmp(name,"write"))
num_name = 4;
else
num_name = 5;
switch(num_name)
{
case 1 :
Tokens[p_type].CLASS = BEGIN ;
strcpy(Tokens[p_type].SEMAN ,"begin");
p_type++;
break;
case 2 :
Tokens[p_type].CLASS = END;
strcpy(Tokens[p_type].SEMAN , "end");
p_type++;
break;
case 3 :
Tokens[p_type].CLASS = READ;
strcpy(Tokens[p_type].SEMAN , "read");
p_type++;
break;
case 4 :
Tokens[p_type].CLASS = WRITE;
strcpy(Tokens[p_type].SEMAN , "write");
p_type++;
break;
default :
Tokens[p_type].CLASS = IDEN;
strcpy(Tokens[p_type].SEMAN , name);
p_type++;
break;
}
back( );
}
bool Recognize_Token::is_digit(char ch)
{
return (ch>='0' && ch<='9');
}
bool Recognize_Token::is_letter(char ch)
{
return ((ch>='a' && ch<='z') || (ch>= 'A' && ch<= 'Z'));
}
void Recognize_Token::error(int mark)
{
if(mark == 0)
cout<<"输入了非法字符!";
else if(mark == 1)
cout<<"赋值符号错误!";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -