社区
C语言
帖子详情
词法分析程序c语言实现(请各位高手帮帮忙)
yaogip
2007-05-25 03:26:43
选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。
输入:由无符号数和+,—,*,/, ( , ) 构成的算术表达式。
输出:单词串的输出形式,所输出的每一单词均按形如(CLASS,VALUE)的二元式编码。
单词符号 类别码(CLASS) 单词值(VALUE)
无符号数 1 数字值
+ 2 无值
— 3 无值
* 4 无值
/ 5 无值
( 6 无值
) 7 无值
...全文
824
3
打赏
收藏
词法分析程序c语言实现(请各位高手帮帮忙)
选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。 输入:由无符号数和+,—,*,/, ( , ) 构成的算术表达式。 输出:单词串的输出形式,所输出的每一单词均按形如(CLASS,VALUE)的二元式编码。 单词符号类别码(CLASS)单词值(VALUE) 无符号数 1 数字值 + 2 无值 — 3 无值 * 4 无值 / 5 无值 ( 6 无值 ) 7 无值
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
rabbit5455
2007-05-25
打赏
举报
回复
我最近在做一个正则表达式的解析工具,
里面有一部分是分析词法的代码:
在我的博客中,有一张UML状态图和一个getSymbol()函数:
http://hi.baidu.com/rabbit5455/blog/item/5b94bc02b2bd080e4bfb511c.html
代码如下:
/*词法分析,取得一个符号*/
SymbolType getSymbol() {
char *cc = &g_symbol_charvalue;
char tmp; /*临时变量*/
*cc = g_strRegExp[++g_scan_pos];
if ((*cc>='0' && *cc<='9') || (*cc>='a' && *cc<='z') || (*cc>='A' && *cc<='Z')) {
return g_symbol_type=INPUT_ELE;
}
/*正则表达式结尾*/
if (*cc == NULL) {return g_symbol_type=END_REGEXP;}
if (*cc == '(') {return g_symbol_type=AND_MACHINE_BEGIN;}
if (*cc == ')') {return g_symbol_type=AND_MACHINE_END;}
if (*cc == '[') {return g_symbol_type=OR_MACHINE_BEGIN;}
if (*cc == ']') {return g_symbol_type=OR_MACHINE_END;}
if (*cc == '|') {return g_symbol_type=BACKTRACE;}
if (*cc == '^') {return g_symbol_type=NOT_OP;}
if (*cc == '.') {return g_symbol_type=DOT;}
/*转义字符*/
if (*cc == '\\') {
*cc = g_strRegExp[++g_scan_pos];
if (*cc == 'd') {return g_symbol_type=NUMBER;}
if (*cc == 'D') {return g_symbol_type=NOT_NUMBER;}
if (*cc == 'f') {*cc = '\f'; return g_symbol_type=INPUT_ELE;}
if (*cc == 'n') {*cc = '\n'; return g_symbol_type=INPUT_ELE;}
if (*cc == 'r') {*cc = '\r'; return g_symbol_type=INPUT_ELE;}
if (*cc == 't') {*cc = '\t'; return g_symbol_type=INPUT_ELE;}
if (*cc == 'v') {*cc = '\v'; return g_symbol_type=INPUT_ELE;}
if (*cc == 's') {return g_symbol_type=ALL_SPACE;}
if (*cc == 'S') {return g_symbol_type=NOT_ALL_SPACE;}
if (*cc == 'w') {return g_symbol_type=AZaz09_;}
if (*cc == 'W') {return g_symbol_type=NOT_AZaz09_;}
/*16进制*/
if (*cc == 'x') {
tmp = g_strRegExp[++g_scan_pos];
if (tmp>='0' && tmp<='9') {
*cc = tmp - '0';
} else if (tmp>='a' && tmp<='f') {
*cc = tmp - 'a' + 10;
} else if (tmp>='A' && tmp<='F') {
*cc = tmp - 'A' + 10;
} else {
/*不是16进制数字,返回原字符'x'*/
g_scan_pos--;
return g_symbol_type=INPUT_ELE;
}
tmp = g_strRegExp[++g_scan_pos];
if (tmp>='0' && tmp<='9') {
*cc *= 16;
*cc += tmp - '0';
} else if (*cc>='a' && *cc<='f') {
*cc *= 16;
*cc += tmp - 'a' + 10;
} else if (*cc>='A' && *cc<='F') {
*cc *= 16;
*cc += tmp - 'A' + 10;
} else {
/*这个不是16进制数字,只有一位:\xF*/
g_scan_pos--;
return g_symbol_type=INPUT_ELE;
}
return g_symbol_type=INPUT_ELE;
}
/*8进制*/
if (*cc>='0' && *cc<='3') {
*cc -= '0';
tmp = g_strRegExp[++g_scan_pos];
if (tmp>='0' && tmp<='7') {
*cc *= 8;
*cc += tmp - '0';
} else {
/*只有一位8进制数字:\7*/
g_scan_pos--;
return g_symbol_type=INPUT_ELE;
}
tmp = g_strRegExp[++g_scan_pos];
if (tmp>='0' && tmp<='7') {
*cc *= 8;
*cc += tmp - '0';
} else {
/*只有两位8进制数字:\77*/
g_scan_pos--;
return g_symbol_type=INPUT_ELE;
}
return g_symbol_type=INPUT_ELE;
}
if (*cc>='4' && *cc<='7') {
*cc -= '0';
tmp = g_strRegExp[++g_scan_pos];
if (tmp>='0' && tmp<='7') {
*cc *= 8;
*cc += tmp - '0';
} else {
/*只有一位8进制数字:\7*/
g_scan_pos--;
return g_symbol_type=INPUT_ELE;
}
return g_symbol_type=INPUT_ELE;
} else {
/*[^x0-7dDfnrtvsSwW]*/
return g_symbol_type=INPUT_ELE;
}
}
/*重复运算*/
if (*cc == '*') {return g_symbol_type=REPEAT_ZERO_MORE;}
if (*cc == '+') {return g_symbol_type=REPEAT_ONCE_MORE;}
if (*cc == '?') {return g_symbol_type=REPEAT_ZERO_ONCE;}
if (*cc == '{') {
*cc = g_strRegExp[++g_scan_pos];
if (*cc>'9' || *cc<'0') {return g_symbol_type=UNKNOWN;}
g_repeat_m = 0; /*取{m,n}的m*/
while (*cc>='0' && *cc<='9') {
g_repeat_m *= 10;
g_repeat_m += *cc-'0';
*cc = g_strRegExp[++g_scan_pos];
}
/*{m}*/
if (*cc == '}') {return g_symbol_type=REPEAT_RANGE_M;}
if (*cc != ',') {return g_symbol_type=UNKNOWN;}
*cc = g_strRegExp[++g_scan_pos];
/*{m,}*/
if (*cc == '}') {return g_symbol_type=REPEAT_RANGE_M_MORE;}
/*{m,n}*/
if (*cc>'9' || *cc<'0') {return g_symbol_type=UNKNOWN;}
g_repeat_n = 0; /*取{m,n}的n*/
while (*cc>='0' && *cc<='9') {
g_repeat_n *= 10;
g_repeat_n += *cc-'0';
*cc = g_strRegExp[++g_scan_pos];
}
if (*cc == '}') {
return g_symbol_type=REPEAT_RANGE_MN;
} else {
return g_symbol_type=UNKNOWN;
}
}
return g_symbol_type=UNKNOWN;
}
================================================
E-mail:qfhuazi@163.com
todototry
2007-05-25
打赏
举报
回复
fstream类和string类,查msdn看看,即可以okokok
todototry
2007-05-25
打赏
举报
回复
看看文件操作,字符串操作
编译原理
C语言
词法分析
程序
的设计与
实现
本文介绍了一款用于
C语言
源代码的
词法分析
程序
的设计与
实现
细节,包括如何识别关键字、标识符、常量及特殊符号,并能正确处理注释及报告词法错误。
【编译原理实验】 --
词法分析
程序
设计原理与
实现
(
C语言
实现
)
本文介绍了一个
C语言
子集的
词法分析
程序
设计案例,包括正则文法定义、
程序
结构和编码规则等内容,并提供了测试用例。
【编译原理】简单
词法分析
程序
的
实现
C语言
本文介绍了一种基于
C语言
的
词法分析
程序
设计方法,包括如何识别关键字、运算符、标识符、常数和界符等词法元素,并讨论了注释处理技巧。
使用
c语言
编写
词法分析
程序
,用
C语言
编写一个简单的
词法分析
程序
这篇博客介绍如何使用
C语言
编写一个简单的
词法分析
程序
,针对
C语言
小子集的源
程序
,根据预设的词法规则进行识别。
程序
包括关键字识别、数字和运算符的处理,并具备错误恢复功能。
程序
涉及的关键字、运算符和界符等词法规则被详细列出,以及
词法分析
的主要函数和辅助函数的
实现
。
实验一:
词法分析
程序
的设计
该实验旨在通过设计
词法分析
程序
,理解其功能和构造过程。实验涉及定义语言子集,绘制状态转换图,并编写代码
实现
词法分析
。测试涵盖不同单词类型,包括保留字、标识符、常数、运算符和界符。实验中,非法字符和分支覆盖被特别关注。
C语言
70,039
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章