永发信息网

怎么用c语言编一个词法分析器

答案:1  悬赏:50  手机版
解决时间 2021-03-21 19:22
怎么用c语言编一个词法分析器
最佳答案
简而言之就是先画一个状态图,然后根据图来编码就行
一个简单的xml的词法分析器供参考

#include
#include
#include

typedef struct
{
char *p;
int len;
}
xml_Text;

typedef enum {
xml_tt_U,
xml_tt_H,
xml_tt_E,
xml_tt_B,
xml_tt_BE,
xml_tt_T
}
xml_TokenType;

typedef struct
{
xml_Text text;
xml_TokenType type;
}
xml_Token;

int xml_initText(xml_Text *pText, char *s)
{
pText->p = s;
pText->len = strlen(s);
return 0;
}

int xml_initToken(xml_Token *pToken, xml_Text *pText)
{
pToken->text.p = pText->p;
pToken->text.len = 0;
pToken->type = xml_tt_U;
return 0;
}

int xml_print(xml_Text *pText)
{
int i;
for (i = 0; i < pText->len; i++)
{
putchar(pText->p[i]);
}
return 0;
}

int xml_println(xml_Text *pText)
{
xml_print(pText);
putchar('\n');
return 0;
}

int xml_getToken(xml_Text *pText, xml_Token *pToken)
{
char *start = pToken->text.p + pToken->text.len;
char *p = start;
char *end = pText->p + pText->len;
int state = 0;

pToken->text.p = p;
pToken->type = xml_tt_U;

for (; p < end; p++)
{
switch(state)
{
case 0:
switch(*p)
{
case '<':
state = 1;
break;
default:
state = 7;
break;
}
break;
case 1:
switch(*p)
{
case '?':
state = 2;
break;
case '/':
state = 4;
break;
default:
state = 5;
break;
}
break;
case 2:
switch(*p)
{
case '?':
state = 3;
break;
default:
state = 2;
break;
}
break;
case 3:
switch(*p)
{
case '>':
pToken->text.len = p - start + 1;
pToken->type = xml_tt_H;
return 1;
default:
state = -1;
break;
}
break;
case 4:
switch(*p)
{
case '>':
pToken->text.len = p - start + 1;
pToken->type = xml_tt_E;
return 1;
default:
state = 4;
break;
}
break;
case 5:
switch(*p)
{
case '>':
pToken->text.len = p - start + 1;
pToken->type = xml_tt_B;
return 1;
case '/':
state = 6;
break;
default:
state = 5;
break;
}
break;
case 6:
switch(*p)
{
case '>':
pToken->text.len = p - start + 1;
pToken->type = xml_tt_BE;
return 1;
default:
state = -1;
break;
}
break;
case 7:
switch(*p)
{
case '<':
p--;
pToken->text.len = p - start + 1;
pToken->type = xml_tt_T;
return 1;
default:
state = 7;
break;
}
break;
default:
pToken->text.len = p - start + 1;
pToken->type = xml_tt_T;
return 1;
}
}
return 0;
}

int main()
{
int ret = 0;

xml_Text xml;
xml_initText(&xml, " ss hoho");

xml_Token token;
xml_initToken(&token, &xml);

ret = xml_getToken(&xml, &token);
printf("ret=%d;text=",ret);
xml_print(&token.text);
printf(";type=%d;\n\n", token.type);

ret = xml_getToken(&xml, &token);
printf("ret=%d;text=",ret);
xml_print(&token.text);
printf(";type=%d;\n\n", token.type);

ret = xml_getToken(&xml, &token);
printf("ret=%d;text=",ret);
xml_print(&token.text);
printf(";type=%d;\n\n", token.type);

ret = xml_getToken(&xml, &token);
printf("ret=%d;text=",ret);
xml_print(&token.text);
printf(";type=%d;\n\n", token.type);

ret = xml_getToken(&xml, &token);
printf("ret=%d;text=",ret);
xml_print(&token.text);
printf(";type=%d;\n\n", token.type);

ret = xml_getToken(&xml, &token);
printf("ret=%d;text=",ret);
xml_print(&token.text);
printf(";type=%d;\n\n", token.type);

ret = xml_getToken(&xml, &token);
printf("ret=%d;text=",ret);
xml_print(&token.text);
printf(";type=%d;\n\n", token.type);

return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
人们为什么夸奖罗蒙诺索夫
王者荣耀和天天酷跑哪个好玩
眼睛失明能治好吗
分解因式:m3-2m2-4m+8
单选题There________amapoftheworld______
德国马牌新县轮胎总汇地址在什么地方,想过去
什么专业好考研,化学专业考研方向
从广东中山回宁波的话坐什么车方便
ACfun怎么打出彩色字体
运行如图的程序后,输出的结果为(  )A.13,
我手机保修到期时间是3月13号。3月3号就坏了
务虚和务实的区别是什么?
DA16进制转换成10进制,答案是218,请问怎
枸杞泡什么养胃
青岛汽车北站售票厅地址有知道的么?有点事想
推荐资讯
我的是新款桑塔纳一万公里啦!我想换嘉实多金
穿山园在什么地方啊,我要过去处理事情
asp中关于check form的问题
卵泡10个以上5*4mm内膜厚(双层)影响备孕吗
湖南省吉美科技产业有限公司董事长是谁
我们不需要牌子货 不需要多贵的东西 哪怕是地
我的儿子睡觉时很会打呼噜可他只有五岁我真不
北方诗词,关于北方的诗句
手机如何能把电影下载到内存卡,然后放到电视
为什么我侠盗飞车罪恶都市进不了以前的存档
为什么我的电脑摄像头每次开机只能打开一次,
adobe dreamweaver cs6多少m
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?