626788149 发表于 2016-04-13 20:06

C-mini 程序设计语言的设计与实现

本帖最后由 626788149 于 2016-04-13 20:08 编辑


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

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

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

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

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

626788149 发表于 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;

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

626788149 发表于 2016-04-13 20:20

本帖最后由 626788149 于 2016-04-13 20:34 编辑

文法

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


1. program → declarationList
2.declarationList → declarationList declaration | declaration
3. declaration → varDeclaration | funcDeclaration
4. varDeclaration → typeSpecifier varDeclList ;
6. varDeclList → varDeclList , varDeclInitialize | varDeclInitialize
7. varDeclInitialize → varDeclId | varDeclId =simpleExpression
8. varDeclId → ID | ID [ NUMCONST ]
10. typeSpecifier → int | bool | char| void
11. funcDeclaration → defID ( params ) typeSpecifier statement
12.params → paramList | ε
13. paramList → paramList , paramTypeList | paramTypeList
14. paramTypeList → typeSpecifier 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. expressionStmt → expression ; | ;
22. ifStmt → if ( simpleExpression ) statement [ else statement ]
23. whileStmt → while ( simpleExpression ) statement
24. foreachStmt → foreach ( mutable in simpleExpression ) statement
24. returnStmt → return ; | return expression ;
25. breakStmt → break ;
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

mordorwww 发表于 2016-04-20 09:09

顶一个,楼主继续

patagonia2 发表于 2016-05-25 21:16

我没有实际做过。
顶一个,楼主继续

Jeremy_W 发表于 2017-03-15 19:24

顶,继续更新啊 楼主

lxy572535121 发表于 2019-07-02 16:28

顶一个,楼主继续

goingstudy 发表于 2020-04-02 18:12

大牛,绑定。
页: [1]
查看完整版本: C-mini 程序设计语言的设计与实现