*词法分析器graphic*不管是啥都识别成' ','\t','\n'!!!

程序媛雪利 2012-11-19 12:31:05
RT
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
enum Token_Type // 记号的类别,共22个
{ ORIGIN, SCALE, ROT, IS, // 保留字(一字一码)
TO, STEP, DRAW,FOR, FROM, // 保留字
T, // 参数
SEMICO, L_BRACKET, R_BRACKET, COMMA,// 分隔符
PLUS, MINUS, MUL, DIV, POWER, // 运算符
FUNC, // 函数(调用)
CONST_ID, // 常数
NONTOKEN, // 空记号(源程序结束)
ERRTOKEN // 出错记号(非法输入)
};

typedef struct Token // 记号的数据结构
{ Token_Type type; // 类别
char * lexeme; // 属性,原始输入的字符串
double value; // 属性,若记号是常数则是常数的值
double (* FuncPtr)(double); // 属性,若记号是函数则是函数指针
}Token;

static Token TokenTab[]=
{
{CONST_ID,"PI", 3.1415926, NULL},//0
{CONST_ID,"E", 2.71828, NULL},//1
{T, "T", 0.0, NULL},//2
{FUNC, "SIN", 0.0, sin},//3
{FUNC, "COS", 0.0, cos},//4
{FUNC, "TAN", 0.0, tan},//5
{FUNC, "LN", 0.0, log},//6
{FUNC, "EXP", 0.0, exp},//7
{FUNC, "SQRT", 0.0, sqrt},//8
{ORIGIN, "ORIGIN",0.0, NULL},//9
{SCALE, "SCALE", 0.0, NULL},//10
{ROT, "ROT", 0.0, NULL},//11
{IS, "IS", 0.0, NULL},//12
{FOR, "FOR", 0.0, NULL},//13
{FROM, "FROM", 0.0, NULL},//14
{TO, "TO", 0.0, NULL},//15
{STEP, "STEP", 0.0, NULL},//16
{DRAW, "DRAW", 0.0, NULL},//17

{SEMICO, ";", 0.0, NULL},//18
{L_BRACKET,"(", 0.0, NULL},//19
{R_BRACKET,")", 0.0, NULL},//20
{COMMA, ",", 0.0, NULL},//21
{PLUS, "+", 0.0, NULL},//22
{MINUS, "-", 0.0, NULL},//23
{MUL, "*", 0.0, NULL},//24
{DIV, "/", 0.0, NULL},//25
{POWER, "**", 0.0, NULL},//26
{ERRTOKEN, " ", 0.0, NULL}//27
};

char* tokenEnum[] =
{
"CONST_ID","CONST_ID",
"T",
"FUNC","FUNC","FUNC","FUNC","FUNC","FUNC",
"ORIGIN","SCALE","ROT","IS","FOR","FROM","TO","STEP","DRAW",
"SEMICO","L_BRACKET","R_BRACKET","COMMA","PLUS","MINUS","MUL","DIV","POWER"
};

Token t=TokenTab[27];

int PrintToken(Token t,int i)
{
printf("<%s %s %f %p>\n",tokenEnum[i],t.lexeme,t.value,t.FuncPtr);/////??????????
return 0;
}

int main()
{
char c;
int i,j,radix; //i记录记号在TokenTab中的标志,j为循环变量,radix记录小数点出现情况
int errornum=0;
char s[100];
printf("请输入:");
c = getchar();
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>记号流<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
while(c!='#') //以#为输入结束标志
{
strcpy(s,"");
radix=0;

if(c == ' '||'\n'||'\t') //无效字符
{
printf("IdleChar!!!nima!!!\n");
c=getchar();
continue; //屏蔽掉末尾的打印命令
}
else if(isalpha(c)) //以字母开头的情况
{
for(j=0;isalpha(c);j++,c=getchar())
s[j]=c;
for(i=0;i<18;i++)
if(strcmp(s,TokenTab[i].lexeme)) //比较关键字
break;
if(i!=18)
t=TokenTab[i];
else
{
i=27; //27为错误记号标志
t=TokenTab[i];
strcpy(t.lexeme,s);
errornum++;
}
}
else if(isdigit(c)) //以数字开头的情况
{
for(j=0;isdigit(c);j++,c=getchar()) //把数字读到头
s[j]=c;
if(c=='.')
{
s[j]='.';
for(;isdigit(c);j++,c=getchar()) //把数字读到头
s[j]=c;
}

if(c==' '||'\n'||'\t'||'+'||'-'||'*'||'/'||'('||')'||','||';')//如果下一个是合法符号就将前面的数字整理进入t
{
t=TokenTab[0];
t.value=atof(s);
t.lexeme=s;
}
else
{
printf("DigitError!");
errornum++;
i=27;
for(;c!=' '||'\n'||'\t'||'+'||'-'||'*'||'/'||'('||')'||','||';' ; j++,c=getchar())//把这个错误的参数读完为止
s[j]=c;
strcpy(t.lexeme,s);
}
}

else //合法符号
switch(c){
case ';' :
i=18;
t=TokenTab[i];
c=getchar();
break;
case '(':
i=19;
t=TokenTab[i];
c=getchar();
break;
case ')':
i=20;
t=TokenTab[i];
c=getchar();
break;
case ',':
i=21;
t=TokenTab[i];
c=getchar();
break;
case '+':
i=22;
t=TokenTab[i];
c=getchar();
break;
case '-':
if(c=getchar() == '-')
while(c!='\n')
c=getchar();
else
{
i=23;
t=TokenTab[i];
c=getchar();
}
break;
case '/':
if(c=getchar() == '/')
while(c!='\n')
c=getchar();
else
{
i=25;
c=getchar();
t=TokenTab[i];
}
break;
case '*':
if(c=getchar() == '*')
{
i=26;////////////////////////////???????????????????????????????????????????????
c=getchar();
t=TokenTab[i];
}
else
{
i=24;
c=getchar();
t=TokenTab[i];
}
break;
default:
errornum++;
i=27;
}
//////////////////////////////
PrintToken(t,i);
}
printf("%d ERRORS\ns=%s",errornum,s);
return 0;
}




这里可能还有不少错,但是现在就在进入判断字母开头的部分就出问题了。不管我输入什么,输出永远是一堆“IdleChar!!!nima!!!”,也就是说不管我输入什么它都识别为无效字符了(空格,\t,\n)...我看了好久实在不知道是哪出问题。。。求大家帮忙T^T
...全文
126 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
科比布莱恩特 2012-11-19
  • 打赏
  • 举报
回复
引用 楼主 Lolith8023 的回复:
RT 代码如下: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include <math.h> enum Token_Type // 记号的类别,共22个 { ORIGIN, SCALE, ROT, IS, // 保留字(一字一码)……
好长呀,~~~~~

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧