词法分析

源程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct node{
char zifuji[20];
struct node *next;
}NODE;

typedef struct stack{
char num[20];
int size;
}STACK;

void cmp(char *ch);
int shizi(char ch[]);
//字转词
void zizhuanci(NODE *node){

NODE *p;
p=node->next;

while(p!=NULL){

cmp(p->zifuji);

p=p->next;
}

}
//判断词义
void cmp(char *ch){
int key;

if(strcmp(ch,"begin")==0){
printf("<%s 1 > ",ch);
}

else if(strcmp(ch,"if")==0){
printf("<%s 2 > ",ch);
}
else if(strcmp(ch,"then")==0){
printf("<%s 3 > ",ch);
}
else if(strcmp(ch,"while")==0){
printf("<%s 4 > ",ch);
}
else if(strcmp(ch,"do")==0){
printf("<%s 5 > ",ch);
}
else if(strcmp(ch,"end")==0){
printf("<%s 6 > ",ch);
}
else if(strcmp(ch,"+")==0){
printf("<%s 13> ",ch);
}
else if(strcmp(ch,"-")==0){
printf("<%s 14> ",ch);
}
else if(strcmp(ch,"*")==0){
printf("<%s 15> ",ch);
}
else if(strcmp(ch,"/")==0){
printf("<%s 16> ",ch);
}
else if(strcmp(ch,":")==0){
printf("<%s 17> ",ch);
}
else if(strcmp(ch,":=")==0){
printf("<%s 18> ",ch);
}
else if(strcmp(ch,"<")==0){
printf("<%s 20> ",ch);
}
else if(strcmp(ch,"<=")==0){
printf("<%s 21> ",ch);
}
else if(strcmp(ch,"<>")==0){
printf("<%s 22> ",ch);
}
else if(strcmp(ch,">")==0){
printf("<%s 23> ",ch);
}
else if(strcmp(ch,">=")==0){
printf("<%s 24> ",ch);
}
else if(strcmp(ch,"=")==0){
printf("<%s 25> ",ch);
}
else if(strcmp(ch,";")==0){
printf("<%s 26> ",ch);
}
else if(strcmp(ch,"(")==0){
printf("<%s 27> ",ch);
}
else if(strcmp(ch,")")==0){
printf("<%s 28> ",ch);
}
else if(strcmp(ch,"#")==0){
printf("<%s 0> ",ch);
}
else{

key=shizi(ch);

if(key==1)
printf("<%s 12> ",ch,key);
else if(key==2)
printf("<%s 11> ",ch,key);
else
printf("<%s 错误> ",ch,key);
}
}
//判断数字词义
int shizi(char ch[]){
int i;
int key=0;
for(i=0;i<=sizeof(ch);i++)
if((ch[i]>='0'&&ch[i]<='9')||(ch[i]>='a'&&ch[i]<='z'))
key=1;
else if(ch[i]>='0'&&ch[i]<='9')
key=2;
return key;
}
//字分成词
int word_splitter(char* str,NODE *node){

NODE *p,*q;
p=node;
int length = strlen(str);
char aword[20];
int number = 0;
int start = 0;

memset(aword, 0, 20);
for(int i = start; i < length; ++i){
if(str[i] == ' '){
memcpy(aword, str + start, i - start);
++number;
//printf("%d %s ", number, aword);

q=(NODE *)malloc(sizeof(NODE));
q->next=NULL;
strcpy(q->zifuji,aword);
p->next=q;
p=q;

memset(aword, 0, 20);
start = i + 1;
}
}

if(start < length)
{
memcpy(aword, str + start, length - start);
++number;
//printf("%d %s ", number, aword);

q=(NODE *)malloc(sizeof(NODE));
q->next=NULL;
strcpy(q->zifuji,aword);
p->next=q;
p=q;


}

return number;
}

int main(){

NODE *node,*p,*q;
int i;
STACK *stack;
int size=-1;

node = p =(NODE *)malloc(sizeof(NODE));
stack=(STACK *)malloc(sizeof(STACK));

printf("请输入: ");
for(i=0;i<1;i++){
q=(NODE *)malloc(sizeof(NODE));
gets(node->zifuji);
q=p->next;
puts(node->zifuji);
//printf("%d",sizeof(node->zifuji));

}

i=word_splitter(node->zifuji,node);

/*
p=node->next;
while(p){

puts(p->zifuji);
printf(" ");
p=p->next;
}
*/
zizhuanci(node);

return 0;

}

运行结果

原文地址:https://www.cnblogs.com/hui1005039632/p/4863138.html