minic 词法单元建立
#include <stdio.h>
#include "symbol_table_def.h"
//前面的那个词法和文法说明只是大概的说明,现在又有了改动,把指针运算符改为了@,把取地址运算符改为了$
//但是类型声明的时候的指针类型仍然是*
//现在所有的符号都用了,除了让人恶心的逗号和问号
//现在开始定义词法单元的枚举类型
enum lex_type
{
name,//代表字符串,包括所有的关键字和变量声明
delimit,//代表分号,以及大括号
char_type,//代表字符
an_operator,//代表操作符
constant,//代表常量
string_phrase,//代表字符串
new_line//代表换行,因为在处理的时候换行是一个很重要的符号
};
enum basic_operator_type
{
array_op=,//代表数组分量运算
parenthesis,//代表括号
p_str_sub,//代表结构体指针分量运算
str_sub,//代表结构体分量运算
not,//代表!
bit_rev,//代表~
get_adr,//代表$
get_mem,//代表@
type_cast,//代表强制类型转换
negative,//代表负号运算
get_size,//代表sizeof
multi,//代表乘法
div,//代表除法
module,//代表模
add,//代表加法
minus,//代表减法
left_shift,//左移
right_shift,//右移
larger,//大于
smaller,//小于
lar_eqa,//大于等于
sma_eqa,//小于等于
equal,//等于
nequal,//不等于
bit_and,//&
bit_xor,//^
bit_or,//|
and,//&&
or// ||
}; struct first_lex_token
{
enum lex_type current_lex_type;//在第一遍处理的时候我们把所有的词素分为前面所说的六种
char* token_name;
};
struct first_token_chain//这个链表将所有的词法单元串联起来
{
struct first_lex_token* current_first_token;
struct first_token_chain* next;
};
struct first_token_chain* first_chain_head=NULL;//这里是所有节点的头节点
struct first_token_chain* first_chain_tail=NULL;//这里是所有节点的末尾节点,为了插入用.
//在第一趟处理的时候我们开两个2000个字节的缓冲区,用来读文件,并不断的切换
//为了表明文件的结束,我们找来了我们的老朋友 '17' ,我们用这个字符来表示缓冲区的文件末尾
char end_of_file=;
char* buff_zone[];//这个代表两个缓冲区
int buffer_pointer;//这个代表在缓冲区内的偏移
int file_read_byte;//这个代表在读取文件到缓冲区的时候,读取了多少个字符
int buff_zone_index;//代表使用的是那一个缓冲区
char* current_buff;//这个代表当前的缓冲区
int seek_begin(void )
{
//吃掉所有的空格和制表符
while(buffer_pointer<)
{
switch(*(buffer_zone[buffer_zone_index]+buffer_pointer))
{
case :
return -;//直接返回,文件已经处理完毕了
break;
case ' ':
buffer_pointer++;
break;
case '\t':
buffer_pointer++;
break;
default:
break;
}
}
if(buffer_pointer==)//越过缓冲区了
{
buffer_zone_index=-buffer_zone_index;//切换缓冲区
current_buff=buff_zone[buff_zone_index];
file_read_byte=fread(current_buff,sizeof(char),,input_file_name);
if(file_read_byte!=)//如果碰到文件的结束了
{
*(current_buff+file_read_byte)=;//标记为文件末尾
//因为我们遇到的是字符文件,所以不会出现17这个字符
}
buffer_pointer=;
//重新开始读取输入,这里我们默认制表符和空格符不会占用整个缓冲
//吃掉所有的空格和制表符
while(buffer_pointer<)
{
switch(buffer_zone[buffer_zone_index]+buffer_pointer)
{
case :
return -;//直接返回,文件已经处理完毕了
break;
case ' ':
buffer_pointer++;
break;
case '\t':
buffer_pointer++;
break;
default:
break;
}
}
} return ;//代表正常的返回
}
int lex_char_type(char current)//返回当前字符的前缀集
{
char test;
test=current;
if((test>='a'&&test<='z')||(test>='A'&&test<='Z')||(test=='_'))
{
return ;//代表名字
}
else
{
if(test>=''&&test<='')
{
return ;//数字
}
else
{
if(test==';'||test=='{'||test=='}')
{
return ;//代表分隔符
}
else
{
if(test=='\'')
{
return ;//代表字符
}
else
{
if(test=='\"')
{
return ;//代表字符串
}
else
{
return ;//代表运算符
}
}
}
}
}
} void first_procedure(FILE* input_file_name)
{
char* temp_name;//代表词法单元的内容
int token_length;//代表读取的词法单元的长度
int lex_mode;//代表开始字符所处的token种类
int seek_return;
char current_char;
int for_i,for_j;
struct first_lex_token* temp_token;
struct first_token_chain token_chain_node;
current_buff=malloc(sizeof(char)*);
buff_zone[]=current_buff;
buff_zone[]=current_buff+;
//这里我们其实上把一个4000的缓冲区分裂为两个缓冲区了,这样可以让这两个缓冲区的空间连续
file_read_byte=fread(current_buff,sizeof(char),,input_file_name);
if(file_read_byte!=)//如果碰到文件的结束了
{
*(current_buff+file_read_byte)=;//标记为文件末尾
//因为我们遇到的是字符文件,所以不会出现17这个字符
}
buff_zone_index=;//首先使用第一个缓冲区
buffer_pointer=;
seek_return=seek_begin();
while(seek_return!=-)//只要还没有到达末尾
{
current_char=*(buff_zone[buff_zone_index]+buffer_pointer);
lex_mode=lex_char_type(current_char);
switch(lex_mode)
{
case ://代表名字
token_length=;
while((current_char>='a'&¤t_char<='z')||(current_char>='A'&¤t_char<='Z')||current_char=='_')
{
token_length++;
buffer_pointer++;
if(buffer_pointer==)
{
buff_zone_index=-buff_zone_index;
current_buff=buff_zone[buff_zone_index];
file_read_byte=fread(current_buff,sizeof(char),,input_file_name);
if(file_read_byte!=)//如果碰到文件的结束了
{
*(current_buff+file_read_byte)=;//标记为文件末尾
//因为我们遇到的是字符文件,所以不会出现17这个字符
}
buffer_pointer=;
}
current_char=current_buff[buffer_pointer];
}
temp_name=malloc(sizeof(char)*(token_length+));
if(token_length<=buffer_pointer)
{
for(for_i=;for_i<token_length;for_i++)
{
temp_name[for_i]=current_buff[buffer_pointer-token_length+for_i];
}
}
else
{
current_buff=buff_zone[-buff_zone_index];
for_j=token_length-buffer_pointer;
for(for_i=;for_i<for_j;for_i++)
{
temp_name[for_i]=current_buff[-for_j+for_i];
}
current_buff=buff_zone[buff_zone_index];
for(for_i=;for_i<buffer_pointer;for_i++)
{
temp_name[for_j+for_i]=current_buff[for_i];
}
}
temp_name[token_length]='\0';
temp_token=malloc(sizeof(struct first_lex_token));
temp_token->token_name=temp_name;
if(strcmp("sizeof",temp_name)==)
{
temp_token->current_lex_type=an_operator;
}
else
{
temp_token->current_lex_type=name;
}
break;
case ://对应数字常量的情况
token_length=;
while((current_char>=''&¤t_char<='')||(current_char>='A'&¤t_char<='F')||\
(current_char>='a'&¤t_char<='f')||current_char=='x'||current_char=='X'||current_char=='.')
{
token_length++;
buffer_pointer++;
if(buffer_pointer==)
{
buff_zone_index=-buff_zone_index;
current_buff=buff_zone[buff_zone_index];
file_read_byte=fread(current_buff,sizeof(char),,input_file_name);
if(file_read_byte!=)//如果碰到文件的结束了
{
*(current_buff+file_read_byte)=;//标记为文件末尾
//因为我们遇到的是字符文件,所以不会出现17这个字符
}
buffer_pointer=;
}
current_char=current_buff[buffer_pointer];
}
temp_name=malloc(sizeof(char)*(token_length+));
if(token_length<=buffer_pointer)
{
for(for_i=;for_i<token_length;for_i++)
{
temp_name[for_i]=current_buff[buffer_pointer-token_length+for_i];
}
}
else
{
current_buff=buff_zone[-buff_zone_index];
for_j=token_length-buffer_pointer;
for(for_i=;for_i<for_j;for_i++)
{
temp_name[for_i]=current_buff[-for_j+for_i];
}
current_buff=buff_zone[buff_zone_index];
for(for_i=;for_i<buffer_pointer;for_i++)
{
temp_name[for_j+for_i]=current_buff[for_i];
}
}
temp_name[token_length]='\0';
temp_token=malloc(sizeof(struct first_lex_token));
temp_token->token_name=temp_name;
temp_token->current_lex_type=constant;
break;
case ://对应分隔符
temp_name=malloc(sizeof(char)*);
temp_name[]=current_buff[buffer_pointer];
temp_name[]='\0';
buffer_pointer++;
if(buffer_pointer==)
{
buff_zone_index=-buff_zone_index;
current_buff=buff_zone[buff_zone_index];
file_read_byte=fread(current_buff,sizeof(char),,input_file_name);
if(file_read_byte!=)//如果碰到文件的结束了
{
*(current_buff+file_read_byte)=;//标记为文件末尾
//因为我们遇到的是字符文件,所以不会出现17这个字符
}
buffer_pointer=;
}
current_char=current_buff[buffer_pointer];
temp_token=malloc(sizeof(struct first_lex_token));
temp_token->token_name=temp_name;
temp_token->current_lex_type=delimit;
break;
case ://对应字符
token_length=;
buffer_pointer++;
if(buffer_pointer==)
{
buff_zone_index=-buff_zone_index;
current_buff=buff_zone[buff_zone_index];
file_read_byte=fread(current_buff,sizeof(char),,input_file_name);
if(file_read_byte!=)//如果碰到文件的结束了
{
*(current_buff+file_read_byte)=;//标记为文件末尾
//因为我们遇到的是字符文件,所以不会出现17这个字符
}
buffer_pointer=;
}
current_char=current_buff[buffer_pointer];
while(current_char!='\'')
{
token_length++;
buffer_pointer++;
if(buffer_pointer==)
{
buff_zone_index=-buff_zone_index;
current_buff=buff_zone[buff_zone_index];
file_read_byte=fread(current_buff,sizeof(char),,input_file_name);
if(file_read_byte!=)//如果碰到文件的结束了
{
*(current_buff+file_read_byte)=;//标记为文件末尾
//因为我们遇到的是字符文件,所以不会出现17这个字符
}
buffer_pointer=;
}
current_char=current_buff[buffer_pointer];
}
temp_name=malloc(sizeof(char)*(token_length));
if(token_length<=buffer_pointer)
{
for(for_i=;for_i<token_length;for_i++)
{
temp_name[for_i]=current_buff[buffer_pointer-token_length+for_i];
}
}
else
{
current_buff=buff_zone[-buff_zone_index];
for_j=token_length-buffer_pointer;
for(for_i=;for_i<for_j;for_i++)
{
temp_name[for_i]=current_buff[-for_j+for_i];
}
current_buff=buff_zone[buff_zone_index];
for(for_i=;for_i<buffer_pointer;for_i++)
{
temp_name[for_j+for_i]=current_buff[for_i];
}
}
buffer_pointer++;
if(buffer_pointer==)
{
buff_zone_index=-buff_zone_index;
current_buff=buff_zone[buff_zone_index];
file_read_byte=fread(current_buff,sizeof(char),,input_file_name);
if(file_read_byte!=)//如果碰到文件的结束了
{
*(current_buff+file_read_byte)=;//标记为文件末尾
//因为我们遇到的是字符文件,所以不会出现17这个字符
}
buffer_pointer=;
}
temp_name[token_length-]='\0';
if(temp_name[]=='\\')//处理转义字符
{
switch(temp_name[])
{
case 'n':
temp_name[]='\n';
temp_name[]='\0';
break;
case 't':
temp_name[]='\t';
temp_name[]='\0';
break;
case '':
temp_name[]='\0';
break;
case '\\':
temp_name[]='\0';
break;
case '\'':
temp_name[]='\'';
temp_name[]='\0';
break;
case '\"':
temp_name[]='\"';
temp_name[]='\0';
break;
default:
break;
}
}
temp_token=malloc(sizeof(struct first_lex_token));
temp_token->token_name=temp_name;
temp_token->current_lex_type=constant;
break;
case ://代表字符串
token_length=;
buffer_pointer++;
if(buffer_pointer==)
{
buff_zone_index=-buff_zone_index;
current_buff=buff_zone[buff_zone_index];
file_read_byte=fread(current_buff,sizeof(char),,input_file_name);
if(file_read_byte!=)//如果碰到文件的结束了
{
*(current_buff+file_read_byte)=;//标记为文件末尾
//因为我们遇到的是字符文件,所以不会出现17这个字符
}
buffer_pointer=;
}
current_char=current_buff[buffer_pointer];
while()
{
while(current_char!='\"')
{
token_length++;
buffer_pointer++;
if(buffer_pointer==)
{
buff_zone_index=-buff_zone_index;
current_buff=buff_zone[buff_zone_index];
file_read_byte=fread(current_buff,sizeof(char),,input_file_name);
if(file_read_byte!=)//如果碰到文件的结束了
{
*(current_buff+file_read_byte)=;//标记为文件末尾
//因为我们遇到的是字符文件,所以不会出现17这个字符
}
buffer_pointer=;
}
current_char=current_buff[buffer_pointer];
}
if(buffer_pointer==)//判断是否是字符串的结尾
{
if(*(buff_zone[-buff_zone_index]+)!='\\')
{
break;
}
else
{
token_length++;
buffer_pointer++;
//继续下次循环
}
}
else
{
if(current_buff[buffer_pointer-]!='\\')
{
break;
}
else
{
token_length++;
buffer_pointer++;
if(buffer_pointer==)
{
buff_zone_index=-buff_zone_index;
current_buff=buff_zone[buff_zone_index];
file_read_byte=fread(current_buff,sizeof(char),,input_file_name);
if(file_read_byte!=)//如果碰到文件的结束了
{
*(current_buff+file_read_byte)=;//标记为文件末尾
//因为我们遇到的是字符文件,所以不会出现17这个字符
}
buffer_pointer=;
}
current_char=current_buff[buffer_pointer];
}
} }
temp_name=malloc(sizeof(char)*(token_length+));
if(token_length<=buffer_pointer)
{
for(for_i=;for_i<token_length;for_i++)
{
temp_name[for_i]=current_buff[buffer_pointer-token_length+for_i];
}
}
else
{
current_buff=buff_zone[-buff_zone_index];
for_j=token_length-buffer_pointer;
for(for_i=;for_i<for_j;for_i++)
{
temp_name[for_i]=current_buff[-for_j+for_i];
}
current_buff=buff_zone[buff_zone_index];
for(for_i=;for_i<buffer_pointer;for_i++)
{
temp_name[for_j+for_i]=current_buff[for_i];
}
}
temp_name[token_length]='\0';
buffer_pointer++;
temp_token=malloc(sizeof(struct first_lex_token));
temp_token->token_name=temp_name;
temp_token->current_lex_type=string_phrase;
break;
case ://代表操作符
temp_name=malloc(sizeof(char)*);
temp_name[]=current_buff[buffer_pointer];
temp_name[]='\0';
buffer_pointer++;
if(buffer_pointer==)
{
buff_zone_index=-buff_zone_index;
current_buff=buff_zone[buff_zone_index];
file_read_byte=fread(current_buff,sizeof(char),,input_file_name);
if(file_read_byte!=)//如果碰到文件的结束了
{
*(current_buff+file_read_byte)=;//标记为文件末尾
//因为我们遇到的是字符文件,所以不会出现17这个字符
}
buffer_pointer=;
}
temp_token=malloc(sizeof(struct first_lex_token));
temp_token->token_name=temp_name;
temp_token->current_lex_type=an_operator;
break;
default:
printf(" un_recognised type\n");
break;
}
token_chain_node=malloc(sizeof(struct first_token_chain));
token_chain_node->next=NULL;
token_chain_node->current_first_token=temp_token;
if(token_chain_tail==NULL)
{
token_chain_tail=token_chain_node;
token_chain_head=token_chain_node;
}
else
{
token_chain_tail->next=token_chain_node;
token_chain_tail=token_chain_node;
}
seek_return=seek_begin();
}
}
minic 词法单元建立的更多相关文章
- Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用
catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...
- minic 类型声明与变量定义句型处理
#include "token_define.h" //这个文件是用来处理句型的,对于算术表达式都是放在前面的那个头文件中来处理 typedef struct _handle_tr ...
- 深入理解javascript作用域系列第二篇——词法作用域和动态作用域
× 目录 [1]词法 [2]动态 前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极 ...
- 【转】深入理解javascript作用域——词法作用域和动态作用域
前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极易出错.这实际上是由两种作用域工作 ...
- JavaScript 词法作用域不完全指北
在 JavaScript 作用域不完全指北 中,我们介绍了作用域的概念以及 JavaScript 引擎.编译器和作用域的关系.作用域有两种主要的工作模型:词法作用域和动态作用域.其中最为普遍的也是大多 ...
- Scala词法文法解析器 (一)解析SparkSQL的BNF文法
平台公式及翻译后的SparkSQL 平台公式的样子如下所示: if (XX1_m001[D003]="邢おb7肮α䵵薇" || XX1_m001[H003]<"2& ...
- 2020 OO 第四单元总结 UML
title: 2020 OO 第四单元总结 date: 2020-06-14 19:10:06 tags: OO categories: 学习 1. 本单元三次作业的架构设计 本单元的代码编写与第三单 ...
- 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》
本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...
- [译]Python编写虚拟解释器
使用Python编写虚拟机解释器 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环 ...
随机推荐
- CSS3主要的几个样式笔记
1.边框:border-color: 设置对象边框的颜色. 使用CSS3的border-radius属性,如果你设置了border的宽度是X px,那么你就可以在这个border上使用X ...
- RecyclerView混合布局
本来想把公司的UI图放上来,考虑到版权等未知因素,就拿网上的图来说了: 类似的这种布局,有的一行只有一张图片,有的一行有两个元素,有个一行有三个元素..就是混合的布局方式 参考文献: https:// ...
- 203. Remove Linked List Elements【Easy】【未排序链表删除其中的给定值】
Remove all elements from a linked list of integers that have value val. Example: Input: 1->2-> ...
- 线性基【CF845G】Shortest Path Problem?
Description 给定一张 \(n\) 个点 \(m\) 条边的无向图,一开始你在点 \(1\),且价值为 \(0\) 每次你可以选择一个相邻的点,然后走过去,并将价值异或上该边权 如果在点 \ ...
- python3中使用xpath无法定位,为什么一直返回空列表?
tbody问题: 在爬去某些网站一些信息的时候,xpath工具上显示类容是正确的,但是在scrapy代码中一直返回空列表 Scrapy的部分代码: class LotteryspiderSpider( ...
- Linux命令之chgrp
chgrp [选项] … GROUP FILE … chgrp [选项] … --reference=RFILE FILE … chgrp命令是用来改变文件的组所有权.将改变每一个FILE的所属组为G ...
- leetcode155 Min Stack
题意:模拟一个最小栈,可以push,pop,top,和返回栈中最小值. 思路:已经忘了栈是怎么构建的了,晕···尝试了半天,错误,发现直接用stack数据结构来做最方便,再用一个栈来存最小值.值得注意 ...
- RUP你知道多少?
RUP 相信学UML的同学,对此都很耳熟,当然也眼熟,可是,对于RUP,你了解多少呢? 首先,什么是RUP? RUP是Rational UnifiedProcess,统一软件开发过程,是一个面向对象且 ...
- 【枚举+贪心】POJ2718-Smallest Difference
[题目大意] 按升序输出几个不同的数字,任意组成两个数字,输出最小的差值. [思路] 虽然是在穷竭搜索的章节里找到的题目,但是我觉得不需要穷竭搜索,枚举一下就可以了,0MS.分为一下三种情况: (1) ...
- (转) Unity3D常用代码收集总结
//创建一个名为"Player"的游戏物体 //并给他添加刚体和立方体碰撞器. player=new GameObject("Player"); player. ...