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

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

本程序实现一个分析C语言的词法分析+语法分析。

注意:

1.文法简略,没有实现的部分,可以在此文法的基础上进行扩充,本程序的采用自顶向下的LL(1)文法。

2.可以自动实现求First 集和 Follow 集。

3.处终结符外(有些硬编码的成分),终结符的文法可以自定义,也就是说读者可以自定义文法。

4.为方便理解,C语言的文法描述写成中文。

5.程序将词法分析和语法分析结合起来,词法分析的结果作为语法分析的输入。

6.最终结果在控制台显示的有:词法分析、First集、Follow集、Select集,在preciateResult.txt 中写入了语法分析结果,在preciateTable.txt 中写入了预测分析表。

7.文法的词素之间必须有空格分开。

项目结构如下:


文法如下:

wenfa.txt:

[plain] 
<函数定义> -> <修饰词闭包> <类型> <变量> ( <参数声明> ) { <函数块> } 
<修饰词闭包> -> <修饰词> <修饰词闭包> | $ 
<修饰词> -> describe 
<类型> -> type <取地址> 
<取地址> -> <星号闭包> 
<星号闭包> -> <星号> <星号闭包> | $ 
<星号> -> * 
<变量> -> <标志符> <数组下标> 
<标志符> -> id 
<数组下标> -> [ <因式> ] | $ 
<因式> -> ( <表达式> ) | <变量> | <数字> 
<数字> -> digit 
<表达式> -> <因子> <项> 
<因子> -> <因式> <因式递归> 
<因式递归> -> * <因式> <因式递归> | / <因式> <因式递归> | $ 
<项> -> + <因子> <项> | - <因子> <项> | $ 
<参数声明> -> <声明> <声明闭包> | $ 
<声明> -> <修饰词闭包> <类型> <变量> <赋初值> 
<赋初值> -> = <右值> | $ 
<右值> -> <表达式> | { <多个数据> } 
<多个数据> -> <数字> <数字闭包> 
<数字闭包> -> , <数字> <数字闭包> | $ 
<声明闭包> -> , <声明> <声明闭包> | $ 
<函数块> -> <声明语句闭包> <函数块闭包> 
<声明语句闭包> -> <声明语句> <声明语句闭包> | $ 
<声明语句> -> <声明> ; 
<函数块闭包> -> <赋值函数> <函数块闭包> | <for循环> <函数块闭包> | <条件语句> <函数块闭包> | <函数返回> <函数块闭包> | $ 
<赋值函数> -> <变量> <赋值或函数调用> 
<赋值或函数调用> -> = <右值> ; | ( <参数列表> ) ; 
<参数列表> -> <参数> <参数闭包> 
<参数闭包> -> , <参数> <参数闭包> | $ 
<参数> -> <标志符> | <数字> | <字符串> 
<字符串> -> string 
<for循环> -> for ( <赋值函数> <逻辑表达式> ; <后缀表达式> ) { <函数块> } 
<逻辑表达式> -> <表达式> <逻辑运算符> <表达式> 
<逻辑运算符> -> < | > | == | != 
<后缀表达式> -> <变量> <后缀运算符> 
<后缀运算符> -> ++ | -- 
<条件语句> -> if ( <逻辑表达式> ) { <函数块> } <否则语句> 
<否则语句> -> else { <函数块> } | $ 
<函数返回> -> return <因式> ; 

词法分析头文件:
LexAnalysis.h

[cpp]
//LexAnalysis.h 
#ifndef _LEXANALYSIS_H 
#define _LEXANALYSIS_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 补充:软件开发 , C++ ,

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,