<强>问题描述:强>
用C或c++语言编写一个简单的词法分析程序,扫描C语言小子集的源程序,根据给定的词法规则,识别单词,填写相应的表。如果产生词法错误,则显示错误信息,位置,并试图从错误中恢复。简单的恢复方法是忽略该字符(或单词)重新开始扫描。
<强>相关词法规则强>
& lt;标识符祝辞::=& lt;字母比;
& lt;标识符祝辞::=& lt;标识符祝辞& lt;字母比;
& lt;标识符祝辞::=& lt;标识符祝辞& lt;数字比;
& lt;常量祝辞::=& lt;无符号整数比;
& lt;无符号整数祝辞::=& lt;数字序列在
& lt;数字序列祝辞::=& lt;数字序列祝辞& lt;数字比;
& lt;数字序列祝辞::=& lt;数字比;
& lt;字母祝辞::=c b | | |……| | x y | z
& lt;数字祝辞::=0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
& lt;加法运算符祝辞::=+ | -
& lt;乘法运算符祝辞::=* |/
& lt;关系运算符祝辞::=& lt; |祝辞| !=|祝辞=| & lt;=|==
& lt;分界符祝辞::=|:| (|)| {|}
& lt;保留字祝辞::=主要| int |如果其他| | |做
<强>编写词法分析程序的步骤:
强>
(1)确定所要翻译的语言(或其子集)。
C语言
(2)设计属性字,及各类表格,如标识符表,常量表,符号及其机内表示对照表等。
与词法分析有关的表格:
保留字:主要,int,如果,,,
字母(全小写):c b | | |……| | x y | z
数字:0,1,2,3,4,5,6,7,8,9
运算符和界符:& lt;,祝辞!=祝辞=& lt;=,==,,,, (,), {,}
输入:一个存放C语言程序的年代。txt文件
输出:存放以(单词,种别码)形式输出的result.txt文件
需要6个数组:
1。存储关键字键[6]
2. 存储对应下标关键字的种别码keyNum [6]
3.存储运算符和界符符号[17]
4. 存储运算符对应下标的种别码symbolNum [17]
5. 存储从文件中取出的每个字符(不包括括号)函[1000]
<强>主要函数:强>
TakeWord ();
功能:将文件信[]中每个字符进行提取,找出关键字,输出种别码
Num作为全局变量保存提取到字符的哪个下标
1。先提取一个字符,如果是字母,进入case1,调用标识符(),不断的提取字母或数字进行连接,没连接一个字符用int isKeyWord()程序(返回关键字种别码)判断是否为关键字,是就退出函数返回字符串,不是就继续执行函数,直到连接的字符不再是字母或数字,即此时字符串为标识符
2。如果是数字,进入2情况下,调用数量()函数,不断进行字符串连接,知道下一个连接字符不再是数字
3。如果是符号,进入情况3,调用symbolStr()函数,如果是=ⅰ? lt; !,则要继续进行下个字符判断,其余符号可以直接返回
<强>其他辅助函数:强>
int isSymbol()判断运算符和界符,并返回种别码
bool isNum()判断是否为数字
bool胰岛()判断是否为字母
int isKeyWord()判断是否为关键字,是返回种别码
int typeword()返回单个字符的类型
字符串标识符()标识符的连接
符串symbolStr()号和界符的连接
字符串数量()数字的连接
无效的print()输出
<强>程序:强>
# include & lt; iostream> # include# include # include 使用名称空间性病;//关键字 字符串键[6]={“主要”、“int”、“如果”、“其他”、“时”,“做”};//关键字的种别码 int keyNum [6]={1, 2, 3, 4, 5, 6};//运算符和界符 字符串象征[17]={" & lt;“,“在”,“!=?“祝辞="," & lt;="、“==?“,”,“;”,“(”、“)”,“{”、“}”、“+”、“-”,“*”,“/?“="};//字符符号[12]={“& lt;”,“在”,“!=?“祝辞=',' & lt;=', '==', ', ', '; ', ' (', ') ', ' {', '}};//运算符和界符的种别码 int symbolNum[17]={7 8 9 10 11、12、13、14、15、16、17、18、19日,20日,21日,22日,23日};//存放文件取出的字符 字符串字母[1000];//将字符转换为单词 字符串字[1000]; int长度;//保存程序中字符的数目 int num; int isSymbol (string s){//判断运算符和界符 int我; (我=0;i C语言实现词法分析器