【编译原理/类C编译器】(一)使用的词法规则以及语法规则

说在前面

词法规则

项目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

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值