📄 dy.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 + -