从上海回来这两天一口气看完了语义分析, 前段也就差不多了, 本来准备看代码生成的, 人突然就不想看了, 老毛病又犯了 : 很久没不敲代码, 手痒的不行, 所以决定边往前推进边实现前面的部分... 想到终于可以开始实现编译器心里就激动的不行, 那么就这么愉快的开始了...
首先当然是规定语言的词法语法, 由于第一次写编译器, 也不想搞得太过复杂, 我准备写的是一个简化版本的C语言, 大部分词法和语法都将才采用C语言标准...
首先是基本类型 :
int, string,bool (这两个C语言里面没有, 但是我还是加了), 为了简化设计, 暂时还是不加浮点数,同时只支持小写, 大写会被当成标识符...
然后是流程控制语句 :
if-else if-else
while
(暂不支持for, do-while, switch, break, continue)
最后提供对函数的支持,但是函数不支持传参- -! :
(但是不支持return)
具体的词法要求如下(并非严格按照C的标准, 为方便实现, 对其进行了简化) :
id : [a-zA-Z_][0-9a-zA-Z_]* int : -?[0-9]+ string : "[\"|.]*"
接下来是语法 :
prog -> func funcs | func -> type id () block block -> { stmts } stmts -> stmt stmts | stmt -> type id; | type id = expr; | type id = judge; | if(judge) block | if(judge) block else block | while(judge) block type -> int | bool | string expr -> expr + term | expr - term | term term -> term * unary | term / unary | unary unary -> !unary | -unary | factor factor -> num | boolean | (expr) judge -> judge || join | join join -> join && equality | equality equality -> equality == rel | equality != rel | rel rel -> expr < expr | expr <= expr | expr >= expr | expr > expr | expr
暂时就想到这么多, 不够之后再补... 下一节开始撸代码...
时间: 2024-11-13 06:13:50