C语言实现词法分析器

  

<强>问题描述:

  

用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语言实现词法分析器

  

  

 C语言实现词法分析器

  

  

输入:一个存放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语言实现词法分析器