2015.11.15 初始化项目。
2015.11.26 基本实现各种词法单元的DFA。
2015.11.28 完成编译器前端中词法分析器的模块。
2015.12.04 优化词法分析器的逻辑,并删除了重复代码。
void if else while int char string
这里的关键字string并不是c语言中的,只是因为当前编译器的词法分析模块中并不支持数组,为了识别字符串类型,暂时加入这个关键字,
等到优化完当前的词法分析器才会支持数组,然后这个关键字就会被取消。
符合C的标识符规则
####运算符
比较运算符:< <= > >= != = ==
算术运算符:+ += - -= * *= / /=
逻辑运算符:! 目前支持取反,暂时不支持与、或运算
这里需要根据后面语法分析器的需求,来确定这里具体需要支持的值类型。
目前可以识别整型、浮点型(虽然现在还没有这样的关键字)、字符型、字符串。
同C语言
{ } ( ) ;
暂时只支持这么多,O(∩_∩)O~
同C语言
支持行内注释和块注释
/* */ //
git clone https://github.com/buchenglei/rust-simple-c-compiler.git
cd rust-simple-c-compiler
cargo run
注意:开发使用的Rust编译器版本是1.3
编译完成后,编译测试代码到二进制文件所在的目录执行
rust-simple-c-compiler.exe filename.c
目前已在windows和linux上测试过,并且也在mac上测试通过,可以编译运行
测试代码:
/*
this is block comment!
*/
void main() {
int a = 1;
a += 1;
// this is inline comment!
if a == 1 {
printf("hello");
} else {
printf("word");
}
}
输出结果:
Token { w: Keyword(4), row: 4, col: 1 }
Token { w: Id("main"), row: 4, col: 6 }
Token { w: Separator(0), row: 4, col: 10 }
Token { w: Separator(1), row: 4, col: 11 }
Token { w: Separator(2), row: 4, col: 13 }
Token { w: Keyword(3), row: 5, col: 2 }
Token { w: Id("a"), row: 5, col: 6 }
Token { w: Operator(14), row: 5, col: 8 }
Token { w: Value("10"), row: 5, col: 10 }
Token { w: Separator(6), row: 5, col: 12 }
Token { w: Id("a"), row: 6, col: 2 }
Token { w: Operator(7), row: 6, col: 4 }
Token { w: Value("1"), row: 6, col: 7 }
Token { w: Separator(6), row: 6, col: 8 }
Token { w: Keyword(0), row: 8, col: 2 }
Token { w: Operator(15), row: 8, col: 5 }
Token { w: Id("a"), row: 8, col: 6 }
Token { w: Operator(5), row: 8, col: 8 }
Token { w: Value("10"), row: 8, col: 11 }
Token { w: Separator(2), row: 8, col: 14 }
Token { w: Id("printf"), row: 9, col: 3 }
Token { w: Separator(0), row: 9, col: 9 }
Token { w: Value(""hello""), row: 9, col: 10 }
Token { w: Separator(1), row: 9, col: 17 }
Token { w: Separator(6), row: 9, col: 18 }
Token { w: Separator(3), row: 10, col: 2 }
Token { w: Keyword(1), row: 10, col: 4 }
Token { w: Separator(2), row: 10, col: 9 }
Token { w: Id("printf"), row: 11, col: 3 }
Token { w: Separator(0), row: 11, col: 9 }
Token { w: Value(""word""), row: 11, col: 10 }
Token { w: Separator(1), row: 11, col: 16 }
Token { w: Separator(6), row: 11, col: 17 }
Token { w: Separator(3), row: 12, col: 2 }
Token { w: Separator(3), row: 13, col: 1 }
共发现 34 个词法单元