说在前面
- 使用语言:javascript
- 语法分析:LL(1)
- 中间代码生成:三地址码 语法制导翻译
- 目标代码:mips代码
- 【编译原理/类C编译器】(二)词法分析
- 【编译原理/类C编译器】(三)语法分析
- 【编译原理/类C编译器】(四)中间代码生成+目标代码生成
- github:o0olele/tiny-c-compiler
词法规则
项目 | Value |
---|---|
关键字 | int | void | if | else | while | return |
标识符 | 字母(字母 | 数字)* 注:不与关键字相同 |
数值 | 数字(数字)* |
赋值号 | = |
算符 | + | - | * | / | = | == | > | >= | < | <= | != |
界符 | ; |
分隔符 | , |
注释号 | /* */ | // |
左括号 | ( |
右括号 | ) |
左大括号 | { |
右大括号 | } |
字母 | a |…| z | A |…| Z | |
数字 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
结束符 | # |
语法规则
- 加粗的为原语法规则,下面的是对应的消除左递归以及回溯的。Kw数组依次对应词法规则中的关键字。
-
Program ::= <声明串>
- Pro→State_str <声明串> ::=<声明>{<声明>}
- State_str→State A
- A→State_str | ε <声明> ::=int <声明类型> | void <函数声明>
- State→Kw[0] ID State_type | Kw[1] ID Fun_state <声明类型>::=<变量声明> | <函数声明>
- State_type→Var_state | Fun_state <变量声明> ::= ;
- Var_state→; <函数声明> ::=’ (‘<形参>’) ‘<语句块>
- Fun_state→(Form_par) Block <形参>::= <参数列表> | void
- Form_par→Par_list | Kw[1] <参数列表> ::= <参数> {, <参数>}
- Par_list→Par B
- B→,Par B |ε <参数> ::= int
- Par→Kw[0] ID <语句块> ::= ‘{‘<内部声明> <语句串>’}’
- Block→{Iner_state Sent_str} <内部声明> ::= 空 | <内部变量声明>{<内部变量声明>}
- Iner_state→ε| Iner_par_sate Iner_state <内部变量声明>::=int ;
- Iner_par_state→int ID ; <语句串> ::= <语句>{ <语句> }
- Sent_str→Sent C
- C→εSent_str <语句> ::= <if语句> |< while语句> | <return语句> | <赋值语句>
- Sent→Sent_if|Sent_while|Sent_return|Sent_eval <赋值语句> ::= =<表达式>;
- Sent_eval→ID = Exp; <return语句> ::= return [ <表达式> ] (注:[ ]中的项表示可选)
- Sent_return→Kw[5] D
- D→Exp;|; <while语句> ::= while ‘( ‘<表达式> ‘)’ <语句块>
- Sent_while→Kw[4] (Exp) Block <if语句> ::= if ‘(‘<表达式>’)’ <语句块> [ else <语句块> ](注:[ ]中的项表示可选)
- Sent_if→if(Exp) Block E
- E→else Block | ε <表达式>::=<加法表达式>{ relop <加法表达式> } (注:relop-> <|<=|>|>=|==|!=)
- Exp→Exp_add F
- F→relop Exp_add F|ε <加法表达式> ::= <项> {+ <项> | -<项>}
- Exp_add→Nape G
- G→ε|+Nape G|-Nape G <项> ::= <因子> {* <因子> | /<因子>}
- Nape→Div H
- H→ε|*DivH|/DivH <因子> ::=num | ‘(‘<表达式>’)’ | FTYPE
- Div→num | (Exp)|ID Ftype
- FTYPE ::= | 空
- Ftype→Call | ε <call> ::=’(’<实参> ’) ’
- Call→(Act) <实参> ::=<实参列表> | 空
- Act→Act_list|ε <实参列表> ::= <表达式>{, <表达式>}
- Act_list→Exp H
- H→,ExpH|ε <ID>::=字母(字母|数字)*
- ID→字母(字母|数字)*
END