# Sky 语言编译器
## 第一章 词法分析
词法分析是计算机科学中将字符序列转换为标记(token)序列的过程。标记经常使用正则表达式进行定义,像 Lex 一类的词法分析器生成器就支持使用正则表达式。语法分析器读取输入字符流、从中识别出语素、最后生成不同类型的标记。
### 1.1 Lex
一般而言,一个 Lex 源程序分为三部分,三部分之间以符号 %% 分隔。第一部分为定义段,第二部分为词法规则段,第三部分为辅助函数段。
### 1.2 具体实现
#### 1.2.1 定义段
Sky 的 Lex 源程序在定义区导入了需要的头文件,包括:
stdio.h(C 语言标准输入输出头文件)
string(C++ std::string 头文件)
nodeList.h(抽象语法树头文件)
sky.tab.h(yacc 生成的词法分析器头文件),
然后声明了 lex 需要的 yywrap 函数。
```
%{
#include<stdio.h>
#include<string>
#include "nodeList.h"
#include "sky.tab.h"
extern "C" int yywrap() {return 1;}
using namespace std;
%}
```
#### 1.2.2 词法规则段
首先,需要排除空格、水平制表符、回车换行、注释的干扰,方法是把他们解析为空格。
```
[ \t\n] { }
"//"[^\n]* { }
```
然后解析关键字、运算符和分隔符,由于这些字符是固定的,所以正则表达式只需要也是固定字符。
```
"var" {return VAR;}
"let" {return LET;}
"new" {return NEW;}
"delete" {return DELETE;}
"func" {return FUNCTION;}
"return" {return JUMP_RETURN;}
"if" {return IF;}
"else" {return ELSE;}
"for" {return FOR;}
"while" {return WHILE;}
"in" {return IN;}
"continue" {return JUMP_CONTINUE;}
"break" {return JUMP_BREAK;}
"class" {return CLASS;}
"this" {return THIS;} /*自身指针*/
"lambda" {return LAMBDA;}
"int" {return TYPE_INT;}
"int*" {return TYPE_INT_POINTER;}
"int64" {return TYPE_INT_64;}
"int64*" {return TYPE_INT_64_POINTER;}
"char" {return TYPE_CHAR;}
"char*" {return TYPE_CHAR_POINTER;}
"float" {return TYPE_FLOAT;}
"float*" {return TYPE_FLOAT_POINTER;}
"double" {return TYPE_DOUBLE;}
"double*" {return TYPE_DOUBLE_POINTER;}
"bool" {return TYPE_BOOL;}
"bool*" {return TYPE_BOOL_POINTER;}
"{" {return('{');}
"}" {return('}');}
"(" {return('(');}
")" {return(')');}
"[" {return('[');}
"]" {return(']');}
"." {return('.');}
"," {return(',');}
":" {return(':');}
";" {return(';');}
"=" {return('=');} /*赋值*/
"+=" {return ADD_ASSIGN;}
"-=" {return SUB_ASSIGN;}
"*=" {return MUL_ASSIGN;}
"/=" {return DIV_ASSIGN;}
"%=" {return MOD_ASSIGN;}
"&=" {return AND_ASSIGN;}
"^=" {return XOR_ASSIGN;}
"|=" {return OR_ASSIGN;}
"!" {return OPER_NOT;}
"+" {return OPER_PLUS;}
"-" {return OPER_MINUS;}
"*" {return('*');}
"/" {return OPER_DIV;}
"%" {return OPER_MOD;}
">>" {return OPER_RIGHT;}
"<<" {return OPER_LEFT;}
"->" {return OPER_PTR;}
"&&" {return OPER_AND;}
"&" {return('&');}
"||" {return OPER_OR;}
"<" {return OPER_LT;}
"<=" {return OPER_LE;}
">" {return OPER_GT;}
">=" {return OPER_GE;}
"==" {return OPER_EQ;}
"!=" {return OPER_NE;}
```
标识符是由字母或下划线开头,由字母、数字和下划线组成,并且不能是关键字的字符串。Sky 编译器在词法分析阶段只校验标识符是否符合规则,而不会校验其是否存在。不同于运算符,标识符需要额外保存字符串值。
```
[a-zA-Z_][a-zA-Z0-9_]* {
yylval.sVal = new char[yyleng+1];
strcpy(yylval.sVal, yytext);
//printf("%s\n", yytext);
return IDENTIFIER;
}
```
其他需要额外保存值的单词:
在函数、类型等单词中,词法分析器需要记录字符串串值以使得语法分析器能区分是哪个函数或类型。
```
"true"|"false" {
bool tmp;
sscanf(yytext, "%d", &tmp);
yylval.bVal = tmp;
�
没有合适的资源?快使用搜索试试~ 我知道了~
基于C++实现语言编译器【100012052】
共23个文件
cpp:5个
h:5个
sky:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 189 浏览量
2023-04-28
14:01:05
上传
评论
收藏 3.33MB ZIP 举报
温馨提示
词法分析是计算机科学中将字符序列转换为标记(token)序列的过程。标记经常使用正则表达式进行定义,像 Lex 一类的词法分析器生成器就支持使用正则表达式。语法分析器读取输入字符流、从中识别出语素、最后生成不同类型的标记。
资源推荐
资源详情
资源评论
收起资源包目录
100012052-基于C++实现语言编译器.zip (23个子文件)
skycomplier
convertEngine.cpp 2KB
defineList.h 242B
CMakeLists.txt 424B
lex.yy.cpp 58KB
sky.y 14KB
doc
report.pdf 1.11MB
语法.docx 17KB
report.docx 954KB
SkyCompiler.pptx 1.9MB
nodeList.h 18KB
LICENSE 1KB
sky.tab.h 5KB
nodeList.cpp 23KB
test.sky 72B
main.cpp 861B
convertEngine.h 3KB
CompileException.h 626B
test
auto-advisor.sky 6KB
quicksort.sky 717B
matrix-multiplication.sky 804B
README.md 65KB
sky.l 7KB
sky.tab.cpp 72KB
共 23 条
- 1
资源评论
神仙别闹
- 粉丝: 4131
- 资源: 7483
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功