#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _KEY_WORD_END "waiting for your expanding"
typedef struct
{
int typenum;
char* word;
} WORD;
struct {
char result[8];
char ag1[8];
char op[8];
char ag2[8];
}quad[20];
typedef struct node{ //修改
WORD *data;
struct node* next;
}Node;
char input[255];
char token[255] = "";
int p_input;
int p_token;
char ch;
int kk = 0;
int count=0,k=0;
char* rwtab[] = { "begin", "if", "then", "while", "do", "end", _KEY_WORD_END };
WORD* scaner();
Node* yucu(Node* word);
Node* expression(Node* word);
Node* factor(Node* word);
void lrparser(Node* word); //(WORD* word);
char *expression(void);
int statement();
int yucu();
char *term(void);
char *factor(void);
int lrparser();
int main()
{
int over = 1;
Node* oneword = NULL, * pt = NULL, * p; //= (WORD*)malloc(sizeof(WORD));
//memset(oneword, 0, sizeof(WORD));
printf("Enter Your words (end with #):");
scanf("%[^#]", input);
p_input = 0;
printf("Your words:\n%s\n", input);
while (over < 1000) //(over < 1000 && over != -1)
{
pt = (Node*)malloc(sizeof(Node));
pt->data = scaner();
pt->next = NULL;
if (oneword == NULL)
oneword = pt;
else
p->next = pt;
p = pt;
over = p->data->typenum;
}
p = oneword;
while (p) {
printf("(%d,%s)", p->data->typenum, p->data->word);
p = p->next;
}
lrparser(oneword);
//printf("\npress # to exit:");
//scanf("%[^#]", input);
return 0;
}
char m_getch()
{
ch = input[p_input];
p_input = p_input + 1;
return (ch);
}
void getbc()
{
while (ch == ' ' || ch == 10)
{
ch = input[p_input];
p_input = p_input + 1;
}
}
void concat()
{
token[p_token] = ch;
p_token = p_token + 1;
token[p_token] = '\0';
}
int letter()
{
if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z')
return 1;
else
return 0;
}
int digit()
{
if (ch >= '0' && ch <= '9')
return 1;
else
return 0;
}
int reserve()
{
int i = 0;
while (strcmp(rwtab[i], _KEY_WORD_END))
{
if (!strcmp(rwtab[i], token))
{
return i + 1;
}
i = i + 1;
}
return 10;
}
void retract()
{
p_input = p_input - 1;
}
char* dtb(char* bstr)
{
itoa(atoi(bstr), bstr, 2);
return bstr;
}
WORD* scaner()
{
WORD* myword = (WORD*)malloc(sizeof(WORD));
memset(myword, 0, sizeof(WORD));
myword->typenum = 10;
myword->word = " ";
p_token = 0;
m_getch();
getbc();
if (letter())
{
while (letter() || digit())
{
concat();
m_getch();
}
retract();
myword->typenum = reserve();
myword->word = (char*)malloc(33);
strcpy(myword->word, token);
//myword->word = token;
return (myword);
}
else if (digit())
{
while (digit())
{
concat();
m_getch();
}
retract();
myword->typenum = 11;
myword->word = (char*)malloc(33);
strcpy(myword->word, dtb(token));
//myword->word = dtb(token);
//lrparser(myword);
return (myword);
}
else
switch (ch)
{
case '=':
m_getch();
if (ch == '=')
{
myword->typenum = 39;
myword->word = (char*)"==";
return (myword);
}
retract();
myword->typenum = 21;
myword->word = (char*)"=";
return (myword);
break;
case '+':
myword->typenum = 22;
myword->word = (char*)"+";
return (myword);
break;
case '-':
myword->typenum = 23;
myword->word = (char*)"-";
return (myword);
break;
case '*':
myword->typenum = 24;
myword->word = (char*)"*";
return (myword);
break;
case '/':
myword->typenum = 25;
myword->word = (char*)"/";
return (myword);
break;
case '(':
myword->typenum = 26;
myword->word = (char*)"(";
return (myword);
break;
case ')':
myword->typenum = 27;
myword->word = (char*)")";
return (myword);
break;
case '[':
myword->typenum = 28;
myword->word = (char*)"[";
return (myword);
break;
case ']':
myword->typenum = 29;
myword->word = (char*)"]";
return (myword);
break;
case '{':
myword->typenum = 30;
myword->word = (char*)"{";
return (myword);
break;
case '}':
myword->typenum = 31;
myword->word = (char*)"}";
return (myword);
break;
case ',':
myword->typenum = 32;
myword->word = (char*)",";
return (myword);
break;
case ':':
myword->typenum = 33;
myword->word = (char*)":";
return (myword);
break;
case ';':
myword->typenum = 34;
myword->word = (char*)";";
return (myword);
break;
case '>':
m_getch();
if (ch == '=')
{
myword->typenum = 37;
myword->word = (char*)">=";
return (myword);
}
retract();
myword->typenum = 35;
myword->word = (char*)">";
return (myword);
break;
case '<':
m_getch();
if (ch == '=')
{
myword->typenum = 38;
myword->word = (char*)"<="</span>;
return (myword);
}
retract();
<span class="hljs-function">myword->typenum = 36;
myword->word = (char*)"<";
return (myword);
break;
case '!':
m_getch();
if (ch == '=')
{
myword->typenum = 40;
myword->word = (char*)"!=";
return (myword);
}
retract();
myword->typenum = 41;
myword->word = (char*)"!";
//myword->typenum = -1;
//myword->word = (char*)"ERROR";
return (myword);
break;
case '\0':
myword->typenum = 1000;
myword->word = (char*)"OVER";
return (myword);
break;
default:
myword->typenum = 0;
//myword->typenum = -1;
myword->word = (char*)"ERROR";
return (myword);
}
}
void lrparser(Node* word)
{
Node* w = word;
if (w->data->typenum == 1) //begin
{
w = w->next;
w = yucu(w);
if (w->data->typenum == 6) //end
{
printf("success\n");
}
else if (w->data->typenum == 0)
{
printf("中文符号错误\n");
}
else //缺end
{
if (kk != 1)
{
printf("缺end错误\n");
kk = 1;
}
}
}
else
{
printf("begin错误\n");
kk = 1;
}
}
Node* statement(Node* word)
{
Node* w = word;
if (w->data->typenum == 10)
{
w = w->next;
if (w->data->typenum == 21)
//(word->typenum == 18)
{
w = w->next;
w = expression(w);
}
else{
printf("fuzhi error!\n");
kk = 1;
}
}else{
printf("yuju error!\n");
kk = 1;
}
return w;
}
Node* yucu(Node* word)
{
Node* w = word;
w = statement(w);
while (w->data->typenum == 34)
//(w->data->typenum == 26)
{
w = w->next;
w = statement(w);
}
return w;
}
Node* term(Node* word)
{
Node* w = word;
w = factor(w);
while (w->data->typenum == 23 || w->data->typenum == 24) {
w = w->next;
w = factor(w);
}
return w;
}
Node* expression(Node* word)
{
Node* w = word;
w = term(w);
while (w->data->typenum == 22 || w->data->typenum == 23)
//(w->data->typenum == 13 || w->data->typenum == 14)
{
w = w->next;
w = term(w);
}
return w;
}
Node* factor(Node* word)
{
Node* w = word;
if (w->data->typenum == 10 || w->data->typenum == 11)
w = w->next;
else if (w->data->typenum == 26){
w = w->next;
w = expression(w);
if (w->data->typenum == 27)
w = w->next;
else
{
printf("error!\n");
kk = 1;
}
}
else{
printf("biaoda error!\n");
kk = 1;
}
return w;
}
void emit(char * result,char * ag1,char * op,char * ag2)
{
strcpy(quad[count].result,result);
strcpy(quad[count].ag1,ag1);
strcpy(quad[count].op,op);
strcpy(quad[count].ag2,ag2);
count++;
return;
}
char *newtemp(void)
{
char *p;
char m[8];
p=(char *)malloc(8);
k++;
itoa(k,m,10);
strcpy(p+1,m);
p[0]='t';
return(p);
}
int lrparser()
{
int schain=0;
kk=0;
if(syn==1)
{
scaner();
schain=yucu();
if(syn==6)
{
scaner();
if((syn==0)&&(kk==0))
printf("sucess");
}
else
{
if(kk!=1) printf("缺少end!");
kk=1;
}
return (schain);
}
int yucu(){
int schain=0;
schain=statement();
while(syn!=6&&p!=length-1&&syn!=0)
{
if(syn!=26)
scaner();
while(syn==26) //26==;
{
scaner();
if (syn!=0&&syn!=6)
{
schain=statement();
}
}
}
return (schain);
}
int statement()
{
int schain=0;
char tt[8],eplace[8];
switch(syn){
case 10:
strcpy(tt,token);
scaner();
if(syn==18) //:= 18
{
scaner();
strcpy(eplace,expression());
emit(tt,eplace," "," ");
schain=0;
}
else
{
printf("赋号值错误!\n");
kk=1;
}
return (schain);
break;}
}
char * expression()
{
char *tp,*ep2,*eplace,*tt;
tp=(char *)malloc(12);/*分配空间*/
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt =(char *)malloc(12);
strcpy(eplace,term ());/*调用term分析产生表达式计算的第一项eplace*/
while(syn==13||syn==14)
{
if(syn==13)
{
tt[0]='+';
tt[1]='\0';
}
else if(syn==14)
{
tt[0]='-';
tt[1]='\0';
}
scaner();
strcpy(ep2,term());/*/调用term分析产生表达式计算的第二项ep2/*/
strcpy(tp,newtemp());/*/调用newtemp产生临时变量tp存储计算结果/*/
emit(tp,eplace,tt,ep2);/*/生成四元式送入四元式表/*/
strcpy(eplace,tp);
//term();
}
return (eplace);
}
char *term(void)
{
char *tp,*ep2,*eplace,*tt;
tp=(char *)malloc(12);/*分配空间*/
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt =(char *)malloc(12);
strcpy(eplace,factor());
while(syn==15||syn==16)
{
if(syn==15)
{
tt[0]='*';
tt[1]='\0';
}
else if(syn==16)
{
tt[0]='/';
tt[1]='\0';
}
scaner();
strcpy(ep2,factor());
strcpy(tp,newtemp()); //tp为临时变量
emit(tp,eplace,tt,ep2); //将三地址代码送到四元式表
strcpy(eplace,tp);
//factor();
}
return (eplace);
}
char * factor(void)
{
char *fplace;
fplace=(char *)malloc(12);
strcpy(fplace, " ");
if(syn==10)
{
strcpy(fplace,token);
scaner();
}
else if (syn==11)
{
itoa(sum,fplace,10);
scaner();
}
else
if(syn==27) //( 27
{
scaner();
fplace=expression();
if(syn==28)scaner();
else
{
printf("')' 出错!\n");
kk=1;
}
}
else
{
printf("'(' 出错!错误!\n");
kk=1;
}
return (fplace);
}