当前位置:编程学习 > C/C++ >>

C++写的一个简单的词法分析器(分析C语言)

实验用:

几点注意:

1.代码又长又臭,时间关系,没有优化,冗余项多(我都看不下去了。囧)

2.加了一下简单的错误检测。(在mapping.h中定义了错误类型,可以查阅)

3.使用头文件宏定义来模拟符号表,也可以用文件

4.对于标志符的入口地址,无非是为了唯一识别,只要名字相同,都作为一个,使用自增的Int来模拟入口地址,即唯一标识。不考虑变量类型。

5.最后输出有三个表:Token表,错误表,标志符表。

6.一个字符一个字符的读文件,其实可以每次读到一个固定长度的缓冲区,双缓冲区进行分析。也可以读每一行。

代码:

mapping.h:

[cpp]
/*
头文件:mapping.h
*/ 
 
//关键字 
#define AUTO 1 
#define BREAK 2 
#define CASE 3 
#define CHAR 4 
#define CONST 5 
#define CONTINUE 6 
#define DEFAULT 7 
#define DO 8 
#define DOUBLE 9 
#define ELSE 10 
#define ENUM 11 
#define EXTERN 12 
#define FLOAT 13 
#define FOR 14 
#define GOTO 15 
#define IF 16 
#define INT 17 
#define LONG 18 
#define REGISTER 19 
#define RETURN 20 
#define SHORT 21 
#define SIGNED 22 
#define SIZEOF 23 
#define STATIC 24 
#define STRUCT 25 
#define SWITCH 26 
#define TYPEDEF 27 
#define UNION 28 
#define UNSIGNED 29 
#define VOID 30 
#define VOLATILE 31 
#define WHILE 32 
#define KEY_DESC "关键字" 
 
//标志符 
#define IDENTIFER 40 
#define IDENTIFER_DESC "标志符" 
 
//常量 
#define INT_VAL 51 //整形常量 
#define CHAR_VAL 52 //字符常量 
#define FLOAT_VAL 53 //浮点数常量 
#define STRING_VAL 54 //双精度浮点数常量 
#define MACRO_VAL 55 //宏常量 
#define CONSTANT_DESC "常量" 
 
//运算符 
#define NOT 61   // ! 
#define BYTE_AND 62 //& 
#define COMPLEMENT 63 // ~ 
#define BYTE_XOR  64 // ^ 
#define MUL 65 // * 
#define DIV 66// / 
#define MOD 67 // % 
#define ADD 68 // + 
#define SUB 69 // - 
#define LES_THAN 70 // < 
#define GRT_THAN 71 // > 
#define ASG 72 // = 
#define ARROW 73 // -> 
#define SELF_ADD 74 // ++ 
#define SELF_SUB 75 // -- 
#define LEFT_MOVE 76 // << 
#define RIGHT_MOVE 77 // >> 
#define LES_EQUAL 78 // <= 
#define GRT_EQUAL 79 // >= 
#define EQUAL 80 // == 
#define NOT_EQUAL 81 // != 
#define AND 82 // && 
#define OR 83 // || 
#define COMPLETE_ADD 84 // += 
#define COMPLETE_SUB 85 // -= 
#define COMPLETE_MUL 86 // *= 
#define COMPLETE_DIV 87 // /= 
#define COMPLETE_BYTE_XOR 88 // ^= 
#define COMPLETE_BYTE_AND 89 // &= 
#define COMPLETE_COMPLEMENT 90 // ~= 
#define COMPLETE_MOD 91 //%= 
#define BYTE_OR 92 // | 
 
#define OPE_DESC "运算符" 
 
//限界符 
#define LEFT_BRA 100 // ( 
#define RIGHT_BRA 101 // ) 
#define LEFT_INDEX 102 // [ 
#define RIGHT_INDEX 103 // ] 
#define L_BOUNDER 104 //  { 
#define R_BOUNDER 105 // } 
#define POINTER 106 // . 
#define JING 107 // # 
#define UNDER_LINE 108 // _ 
#define COMMA 109 // , 
#define SEMI 110 // ; 
#define SIN_QUE 111 // ' 
#define DOU_QUE 112 // " 
 
#define CLE_OPE_DESC "限界符" 
 
#define NOTE1 120 // "/**/"注释 
#define NOTE2 121 // "//"注释 
#define NOTE_DESC "注释" 
 
 
#define HEADER 130 //头文件 
#define HEADER_DESC "头文件" 
 
//错误类型 
#define FLOAT_ERROR "float表示错误" 
#define FLOAT_ERROR_NUM 1 
#define DOUBLE_ERROR "double表示错误" 
#define DOUBLE_ERROR_NUM 2 
#define NOTE_ERROR "注释没有结束符" 
#define NOTE_ERROR_NUM 3 
#define STRING_ERROR "字符串常量没有结束符" 
#define STRING_ERROR_NUM 4 
#define CHARCONST_ERROR "字符常量没有结束符" 
#define CHARCONST_ERROR_NUM 5 
#define CHAR_ERROR "非法字符" 
#define CHAR_ERROR_NUM 6 
#define LEFT_BRA_ERROR "'('没有对应项" 
#define LEFT_BRA_ERROR_NUM 7 
#define RIGHT_BRA_ERROR "')'没有对应项" 
#define RIGHT_BRA_ERROR_NUM 8 
#define LEFT_INDEX_ERROR "'['没有对应项" 
#define LEFT_INDEX_ERROR_NUM 9 
#define RIGHT_INDEX_ERROR "']'没有对应项" 
#define RIGHT_INDEX_ERROR_NUM 10 
#define L_BOUNDER_ERROR "'{'没有对应项" 
#define L_BOUNDER_ERROR_NUM 11 
#define R_BOUNDER_ERROR "'}'没有对应项" 
#define R_BOUNDER_ERROR_NUM 12 
#define PRE_PROCESS_ERROR "预处理错误" //头文件或者宏定义错误 
#define PRE_PROCESS_ERROR_NUM  13 
 
#define _NULL "无" 

main.cpp:
[cpp] 
//main.cpp 
 
#include <iostream> 
#include <fstream> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <iomanip> 
#include "mapping.h" 
 
using namespace std; 
 
const char * key[] = {"auto","break","case","char","const","continue","default","do","double", 
                      "else","enum","extern","float","for","goto","if","int","long","register", 
                      "return","short","signed","sizeof","static","struct","switch","typedef", 
                      "union","unsigned","void","volatile","while" 
                     };//C语言的关键字 
int leftSmall = 0;//左小括号 
int rightSmall = 0;//右小括号 
int leftMiddle = 0;//左中括号 
int rightMiddle = 0;//右中括号 
int leftBig = 0;//左大括号 
int rightBig = 0;//右大括号 
int lineBra[6][1000] = {0};//括号和行数的对应关系,第一维代表左右6种括号 
int static_iden_number = 0;//模拟标志符的地址,自增 
//Token节点 
struct NormalNode 

    char content[30];//内容 
    char describe[30];//描述 
    int type;/

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,