忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1150 | 回复: 5

C-mini 程序设计语言的设计与实现 [复制链接]

论坛徽章:
0
发表于 2016-04-13 20:06 |显示全部楼层
本帖最后由 626788149 于 2016-04-13 20:08 编辑


最近一直在学习编译原理的内容,深知如果不自己动手实现一个编译器,那么这就是在谈一场不以结婚为目的的恋爱,这就是耍流氓。
所以从现在开始我要自己实现一个类似于c语言的编译器,把设计的方案与细节总结在这里。

因为本人是边学习边实现,可能速度上会有一点点慢。

非常希望这里的大神们能给我提提宝贵的意见,让我在以后的学习中更加顺利

先放上源码Github:github.com/Zhang626/C-Mini

我还有一个csdn的博客跟这里是同步的,但是链接发不出来 醉了

论坛徽章:
0
发表于 2016-04-13 20:11 |显示全部楼层
本帖最后由 626788149 于 2016-04-13 20:36 编辑

介绍
  这个语言与c语言非常相似,也与现有的很多程序设计语言有很多共同点。但也有很多地方与c语言不同,比如c-mini包含了foreach循环语句,在函数体中变量的声明顺序也与c语言不同。不同元素的类型使用不同的字体来表示:




关键字: for,while,foreach
记号TOKEN: ID,NUMLITERAL,STRLITERAL
非终结符:Nonterminals

TOKEN 的定义
letter = a | . . . | z | A | . . . | Z
digit = 0 | . . . | 9
NUMLITERAL = [+ | -] digit+
ID = letter (letter | digit)∗
STRLITERAL= "任何除了" 以外的字符"
BOOLITERAL = true | false
Comments = /* ......anything but except * /......  */
Whitespace =制表符,空格,换行
Keywords  = for | while | foreach | int | bool | char | void | if | else | return | break | true | false | def | in

typedef enum {
                ENDFILE , ERROR,
                /*multicharacter symbols*/
                ID, NUM , STRING,
                /*reserved word*/
                FOREACH , WHILE , INT , BOOL , CHAR , VOID , IF ,
                ELSE , RETURN , BREAK , TRUE , FALSE, DEF,
                /*SPECIAL SYMBOLS*/
                SEMI,ASSIGN,EQ,LT,BT,LQ,BQ,PLUS,MINUS,TIMES,
                OVER,LEFTPAREN,RIGHTPAREN,COMMA,CURLYBRACESL,
                CURLYBRACESR,PLUSPLUS,MINUSMINUS,SQUAREBRACKL,SQUAREBRACKR,
                /*whitespace*/
                BLANK,TABLE,NEWLINE               
} TokenType;

目标
我打算先写解释器,解释器完成以后再写代码生成器生成字节码

论坛徽章:
0
发表于 2016-04-13 20:20 |显示全部楼层
本帖最后由 626788149 于 2016-04-13 20:34 编辑

文法

此文法经过修改,使用递归下降解析只需要一个向前看符号就可以实现


1. programdeclarationList
2.  declarationListdeclarationList declaration | declaration
3. declarationvarDeclaration | funcDeclaration
4. varDeclarationtypeSpecifier varDeclList ;
6. varDeclListvarDeclList , varDeclInitialize | varDeclInitialize
7. varDeclInitializevarDeclId | varDeclId =simpleExpression
8. varDeclId → ID | ID [ NUMCONST ]
10. typeSpecifierint | bool | char| void
11. funcDeclarationdef  ID ( params ) typeSpecifier statement
12.  paramsparamList | ε
13. paramListparamList , paramTypeList | paramTypeList
14. paramTypeListtypeSpecifier paramId
16. paramId → ID | ID [ ]
17.  statement → expressionStmt | compoundStmt | ifStmt | whileStmt | foreachStmt | returnStmt | breakStmt
18. compoundStmt→ { localDeclarations statementList }

19. localDeclarations → localDeclarations VarDeclaration | ε
20. statementList → statementList statement | ε

21. expressionStmtexpression ; | ;
22. ifStmtif ( simpleExpression ) statement [ else statement ]
23. whileStmtwhile ( simpleExpression ) statement  
24. foreachStmtforeach ( mutable in simpleExpression ) statement
24. returnStmtreturn ; | return expression ;
25. breakStmtbreak ;
26. expression → mutable = expression | mutable += expression | mutable −= expression| mutable ∗= expression | mutable /= expression | mutable ++ | mutable −− | simpleExpression
27. simpleExpression → simpleExpression | andExpression | andExpression
28. andExpression → andExpression & unaryRelExpression | unaryRelExpression

29. unaryRelExpression ! unaryRelExpression | relExpression
30. relExpression → sumExpression relop sumExpression | sumExpression
31. relop → <= | < | > | >= | == | ! =
32. sumExpression → sumExpression sumop term | term
33. sumop + | −
34. term → term mulop unaryExpression | unaryExpression
35. mulop → ∗ | / | %
36. unaryExpression → unaryop unaryExpression | factor
37. unaryop → −
38. factor → immutable | mutable
39. mutable → ID | ID [ expression ]
40. immutable → ( expression ) | call | constant
41. call → ID ( args )
42. args → argList | ε
43. argList → argList , expression | expression
44. constant → NUMCONST | CHARCONST | STRINGCONST | true | false

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
发表于 2016-04-20 09:09 |显示全部楼层
顶一个,楼主继续

论坛徽章:
12
射手座
日期:2014-10-02 11:31:29程序设计版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-27 06:20:00程序设计版块每日发帖之星
日期:2016-05-27 06:20:00程序设计版块每日发帖之星
日期:2016-05-25 06:20:00每日论坛发贴之星
日期:2016-05-24 06:20:00程序设计版块每日发帖之星
日期:2016-05-24 06:20:0015-16赛季CBA联赛之深圳
日期:2016-05-23 15:33:59程序设计版块每日发帖之星
日期:2016-05-20 06:20:00程序设计版块每日发帖之星
日期:2016-04-26 06:20:00神斗士
日期:2015-12-03 09:27:3215-16赛季CBA联赛之八一
日期:2016-12-29 09:56:05
发表于 2016-05-25 21:16 |显示全部楼层
我没有实际做过。
顶一个,楼主继续

论坛徽章:
0
发表于 2017-03-15 19:24 |显示全部楼层
顶,继续更新啊 楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP