基于vc++可视化界面的c语言编译器

    一个对c语言进行编译的程序完成对赋值语句,if语句,while语句,do while语句的编译,要求将含有上述语句的c语言源程序进行编译生成中间代码和汇编指令序列。

    SLR分析表为:

     1.赋值语句的SLR分析表

  

状态

ACTION

GOTO

i

+

-

*

/

(

)

#

E

0

S3

 

 

 

 

S2

 

 

1

1

 

S4

S5

S6

S7

 

 

Acc

 

2

S3

 

 

 

 

S2

 

 

 

3

 

R6

R6

R6

R6

 

R6

R6

 

4

S3

 

 

 

 

S2

 

 

9

5

S3

 

 

 

 

S2

 

 

1

6

S3

 

 

 

 

S2

 

 

11

7

S3

 

 

 

 

S2

 

 

12

8

 

S4

S5

S6

S7

 

S13

 

 

9

 

R1

R1

S6

S7

 

R1

R1

 

10

 

R2

R2

S6

S7

 

R2

R2

 

11

 

R3

R3

R3

R3

 

R3

R3

 

12

 

R4

R4

R4

R4

 

R4

R4

 

13

 

R5

R5

R5

R5

 

R5

R5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 2.BOOL 表达式的SLR分析表

 

i

r

!

&&

||

(

)

#

E

A

O

0

1

-1

4

-1

5

-1

-1

-1

13

7

8

1

-1

2

-1

101

-1

101

101

101

-1

-1

-1

2

3

-1

-1

-1

-1

-1

-1

-1

-1

-1

-1

3

-1

-1

-1

102

-1

102

102

102

-1

-1

-1

4

1

-1

4

-1

5

-1

-1

-1

11

7

8

5

1

-1

4

-1

5

-1

-1

-1

6

7

8

6

-1

-1

-1

104

-1

104

104

104

-1

-1

-1

7

1

-1

4

-1

5

-1

-1

-1

14

7

8

8

1

-1

4

-1

5

-1

-1

-1

15

7

8

9

105

-1

105

-1

105

-1

-1

-1

-1

-1

-1

10

107

-1

107

-1

107

-1

-1

-1

-1

-1

-1

11

-1

-1

-1

12

-1

9

10

-1

-1

-1

-1

12

-1

-1

-1

103

-1

103

103

103

-1

-1

-1

13

-1

-1

-1

-1

-1

9

10

2

-1

-1

-1

14

-1

-1

-1

106

-1

106

106

106

-1

-1

-1

15

-1

-1

-1

108

-1

9

108

108

-1

-1

-1

 

 

 

 

 

 

 

 

 

 

 

 主要数据结构说明

 struct SqStack//栈的定义

{int *base;

 int *top;

 int stacksize;

};

struct node //关键字和相应的代号

{char symbol[30];//符号

 char code[5];//代号

};

struct node1

{char name[30];//变量名

 char cat[20];

 char type[20];

 int value;//变量值

};

struct node2//存放四元式

{char op[10];//操作符

 char arg1[10];//操作数1

 char arg2[10];//操作数2

 char result[10];//结果

};

struct node3//程序的每个单词及相应的代号

{char sign[10];//单词名

 int code;//单词的代号

};

struct node4//存放汇编结果

{ int L;//判断是否需要标志符

  char label[10];//记录标号

  int num;

  char op[10];

  char arg1[10];

  char arg2[10];

};

struct node5

{ int i;

  int ci;

};

 

struct node0//存放二元式

{

       int num;

    char code[20];

       int type;//0:error,1:id,2:num,3:keyword and operator,-1:end note

};

struct node6

{

       int L;//判断是否需要标志符

       int num;//标志符号

       char op[10];//操作符

       char arg1[10];//操作数1

       char arg2[10];//操作数2

};

struct node7

{

       int num;

       int value;

};

struct InterfaceType//源程序和前台可视化用户界面的接口

{

       node0 *cifa;//存放二元式

       node2 *yuyi;//存放四元式

       char * SourseBuffer;//存放源程序

       USER_TYPE_cha100 ErrorMessageTable;//出错信息表

    int ErrorCount;//语法语义错误数

       int ErrorNumber[number];//错误代码

       int ErrorAddress;//出错信息在源程序中的地址

       node4 *compile;//存放汇编指令 格式一

       node6 *compile_next;//存放汇编指令 格式二

       int quad_num;//四元式的个数

       int com_num;//汇编指令条数

       int com_num_next;//汇编指令条数2

};

 

 

 

 

 

 

 

 

 

主要功能函数说明

 public:

    InterfaceType * GetTable();//源程序和用户界面的接口

    CCompiler();//构造函数

    virtual ~CCompiler();//析构函数

    void Pushback(char c);//返回上一个字符

    char GetC( );//获起一个字符

    int SearchKey( );//匹配关键字

    void GetNextWord( );//词法分析

   

    void Initial();//进行变量初始化

    void  InitStack(SqStack *S);//初始化栈

    void Push(SqStack *S,int e);//入栈

    int Pop(SqStack *S,int *e);//出栈

    char GetTop(SqStack *S);//获起栈顶元素

    int changestring(char *p); //把数字字符转化为数值

    int findstring(int x); //查找单词在symbol中的位置

    void Create();//此函数为把文件中的转化到结构体中propertytable

    int entry(char *p); //SLR分析表函数

    void findcreate(char *p);

    int newtemp(char op,int E1_place,int E2_place); //产生标号函数

    void find(char *p); //相当于翻译程序,把程序中的单词和相应的代码存入结构体symbol

    void test(char *p);

    int precede1(int a); //查找所查符号在对应的action1数组中列号

    int precede2(int a); //查找所查符号在对应的action2数组中列号

    void gen(char *op,int arg1,int arg2,char *result); //产生四元式函数

    bool E();//算术表达式的翻译函数

    int Merg(int p1,int p2); //并链函数

    void Backpatch(int p,int t); //回填函数

    bool EB();//布尔表达式的翻译函数

    void Program();/if,while,do-while,变量定义和赋值语句的实现

    void yuyifx();//进行语义分析,产生四元式

    void init();//存放汇编指令结构体数组的初始化

    void huibianzhilin();//产生汇编指令格式一

    void compile();//产生汇编指令格式二

    int com_num(int x);//跟踪标志

    void equal(int num);//产生MOV指令

    void add(int num);//产生加法指令

    void sub(int num);//产生减法指令

    void mul(int num);//产生乘法指令

    void div(int num);//产生除法指令

    void jnz(int num);//产生JNZ跳转指令

    void jmp(int num); /JMP跳转指令

    void jb(int num); /产生JB跳转指令

    void jbe(int num); /产生JBE跳转指令

    void ja(int num); /产生JA跳转指令

    void jae(int num); /产生JAE跳转指令

    void je(int num); /产生JE跳转指令

    void jne(int num); /产生JNE跳转指令

 界面

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值