simple c语言,一个SimpleC语言解释器的实现 1语言定义和实现步骤简介

一个SimpleC语言解释器的实现 1语言定义和实现步骤简介

一个SimpleC语言解释器的实现 1语言定义和实现步骤简介

最近在学习编译原理的知识,从最初的感觉很神秘,到后来的豁然开朗,走了很多弯路,在这里做一个记录,希望能和大家交流,一起学习。

我们这里实现的是一个简单的无类型的语言,我把它叫做SimpleC,语法格式与C语言基本一致,下面对其做一个简单的定义:

SimpleC语言定义

1.变量没有类型声明 ,一个声明语句中可以声明多个变量,以逗号分割,且声明以var 开头,以分号结尾,如 var  a,b;

2.可以声明全局变量和局部变量,作用域与C语言的一致

3.函数的声明以fun开头 ,函数参数没有类型,以逗号分割,下面是一个例子

fun getName(id){}

4.语句分为 if,while,return,表达式语句 几类(简单起见,这里没有实现for 语句),if 和while 语句就不解释了,

return 语句是return 之后有一个表达式或没有表达式,最后以分号结尾的语句

5. 运算符支持 算术(+,-,*,/,%, ~,|,&,<>) ,关系(==,  !=,  > ,>=,

6.不支持自加 (++a,a++) 自减(--a,a--)表达式

7.不支持三态运行符,

8.不支持逗号表达式

9.字符串常量以双引号开头和结尾,特殊字符转义与C语言一致

10字符常量以单引号开头和结尾,特殊字符转义与C语言一致

11.十六进制整数以0x或0X开头,八进制整数以0开头,否则表示十进制整数,并且只支持32位整数

12.实数类型只支持double 类型

13.程序必须有且只能有一个main函数 ,main函数 不能有参数

解释器实现步骤

9d4bc8bcaa26967d389ed678c4114905.png

词法分析(lexical analysis):词法分析也称作扫描,是编译器(解释器)的第一个步骤,词法分析器读入组成源程序的字符流,并且将它们组织成为有意义的词素的序列,对于每一个词素,词法分析器产生如下形式的词法单元作为输出。实际上就是从字符流到单词流的过程。

语法分析:也称作解析,语法分析器使用由词法分析器生成的各个词法单元的第一个分量来创建树形的中间表示。该中间表示给出了词法分析产生的词法单元流的语法结构。一个常用的表示方法是语法树,树中的每个内部结点表示一个运算,而该结点的子结点表示该运算的分量。

语义分析:语义分析器使用语法树和符号表中的信息来检查源程序是否和语言定义的语义一致。它同时也收集类型信息,并把这些信息存放在语法树或符号表中,以便在随后的中间代码生成过程中使用。语义分析的一个重要部分是类型检查,编译器检查每个运算符是否具有匹配的运算分量,比如数组下标必须是整数,若用一个浮点数来做下标,编译器就会报错。程序设计语言可能允许某些类型转换,这被称作自动类型转换。

一个SimpleC语言解释器的实现 1语言定义和实现步骤简介相关教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用C语言simple gui和libgraphics实现图形链表存储,可以按照以下步骤进行操作: 1. 定义链表节点结构体,包含数据和指向下一个节点的指针,使用typedef定义别名。 ```c typedef struct node { int data; struct node *next; } Node; ``` 2. 编写添加节点的函数,接收数据和链表头指针,将新节点插入到链表头部。 ```c Node* addNode(int data, Node *head) { Node *newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = head; return newNode; } ``` 3. 编写绘制链表的函数,将链表中的数据绘制成图形,并显示在GUI界面上。 ```c void drawList(Node *head) { int x = 100, y = 100; while (head != NULL) { char str[10]; sprintf(str, "%d", head->data); drawText(x, y, str); head = head->next; y += 20; } } ``` 4. 编写GUI界面的初始化函数,创建窗口和画布等控件。 ```c void initGUI() { createWindow(800, 600, "Linked List"); createCanvas(800, 600); } ``` 5. 在main函数中初始化GUI界面,创建链表并添加节点,然后调用绘制链表的函数。 ```c int main() { initGUI(); Node *head = NULL; head = addNode(1, head); head = addNode(2, head); head = addNode(3, head); drawList(head); show(); return 0; } ``` 以上就是使用C语言simple gui和libgraphics实现图形链表存储的基本步骤。需要注意的是,这只是一个简单的示例,并没有进行错误处理和完整的界面设计,具体实现还需要根据实际需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值