语法分析器

ads

文章目录

  • 1. 设计文法

  • 2.将上述文法用产生式表示:

  • 3.提取公共左因子:

  • 4.消除左递归:

  • 5.求FIRST集:

  • 6.求FOLLOW集:

  • 7.构造LL(1)的预测分析表:

实现方法

此语法分析器附带词法分析器;

通过将词法分析的单词压入语法分析栈中,采用 LL(1) 型文法进行分析;

实现功能

能够识别简单语法,包括:

1.变量声明;2.变量赋值;3.变量的运算;4.if,for,while等循环或条件语句;5.自动过滤注释语句。

文法语言

1. 设计文法

<程序> → <语句><程序> | Ɛ;
<语句> → <变量定义语句> | <赋值语句> | <函数调用语句> | <if语句>| <循环语句> | Ɛ
<变量定义语句> → <变量类型><标识符表>;
<赋值语句> → <标识符> = <表达式>;
<函数调用语句> → <标识符> ( <标识符表> );
<if语句> → if ( <条件表达式> ) { <语句> } <else语句>
<else语句> → else{ <语句> } | Ɛ
<循环语句> → while ( <条件表达式> ) { <语句> }
<标识符表> → <标识符>| <标识符表>,<标识符>
<条件表达式> → <表达式><比较运算符><表达式>
<比较运算符> → > | >= | < | <= | != | ==
<变量类型>→ char | short | int | long | float | double
<表达式> → +T | -T | T | <表达式> + T | <表达式>-T
T → F | T*F | T/F
F → <标识符> | <无符号整数> | (<表达式 >)

2.将上述文法用产生式表示:

其中,S’:程序(语句的组合),S:语句,Q:else语句,L:标识符表,E:表达式,X:条件表达式,R:比较运算符,id:标识符,num:常量

S' → S S'| Ɛ
S → A L; | id=E; | id(L); | if(X){S}Q | while(X){S} | Ɛ
A → char | short | int | long | float | double
Q → else{S} | Ɛ
L → id | L , id
X → ERE
R → > | >= | < | <= | == | !=
E → +T | -T | T | E+T | E-T
T → F | T*F | T/F
F → id | num | (E)

3.提取公共左因子:

S’ → S S’| Ɛ
S → A L; | id B | if(X){S}Q | while(X){S} | Ɛ
A → char | short | int | long | float | double
B → (L); | =E;
L → id | L , id
Q → else{S} | Ɛ
X → ERE
R → > | >= | < | <= | == | !=
E → +T | -T | T | EM
M → +T | -T
T → F | TN
N → *F |/F
F → id | num | (E)

4.消除左递归:

S’ → S S’
S’ → Ɛ
S → A L;
S → id B
S → if(X){S}Q
S → while(X){S}
S → Ɛ
B → (L);
B → =E;
L → id L’
L’→ , id L’
L’→ Ɛ
Q → else{S}
Q → Ɛ
X → ERE
E → TE’
E → +TE’
E → -TE’
E’ → ME’
E’ → Ɛ
M → +T
M → -T
T → FT’
T’ → NT’
T’ → Ɛ
N → *F
N → /F
F → id
F → num
F → (E)
R → >
R → >=
R → <
R → <=
R → ==
R → !=
A → char
A → short
A → int
A → long
A → float
A → double

5.求FIRST集:

First(S’)={ char , short , int , long , float , double , id , if , while , Ɛ }
First(S)={ char , short , int , long , float , double , id , if , while , Ɛ }
First(A)={ char , short , int , long , float , double }
First(B)={ ( , = }
First(L)={ id }
First(L’)={ ,, Ɛ }
First(Q)={ else , Ɛ }
First(X)={ + , - , id , num , ( }
First(R)={ > , >= , < , <= , != , == }
First(E)={ + , - , id , num , ( }
First(E’)={ + , - , Ɛ }
First(M)={ + , - }
First(T)={ id , num , ( }
First(T’)={ * , / , Ɛ }
First(N)={ * , / }
First(F)={ id , num , ( }

6.求FOLLOW集:

Follow (S’)={ $ }
Follow (S)={ $ , } }
Follow (B)={ $ , } }
Follow (L)={ $ , ) , ; , } }
Follow (L’)={ $ , ) , ; , } }
Follow (Q)={ $ , } }
Follow (X)={ ) }
Follow (R)={ + , - , id , num , ( }
Follow (E)={ ) , ; , > , >= , < , <= , != , == }
Follow (E’)={ ) , ; , > , >= , < , <= , != , == }
Follow (M)={ ) , ; , > , >= , < , <= , != , == , + , - }
Follow (T)={ ) , ; , > , >= , < , <= , != , == , + , - }
Follow (T’)={ ) , ; , > , >= , < , <= , != , == , + , - }
Follow (N)={ ) , ; , > , >= , < , <= , != , == , + , - , * , / }
Follow (F)={ ) , ; , > , >= , < , <= , != , == , + , - , * , / }

7.构造LL(1)的预测分析表:

LL(1) 预测分析表中的数字分别代表的产生式如下:

0:S → A L;
1:S → id B
2:S → if(X){P}Q
3:S → while(X){P}
4:S → Ɛ
5:B → (L);
6:B → =E;
7:L → id L’
8:L’→ ,id L’
9:L’→ Ɛ
10:Q → else{S}
11:Q → Ɛ
12:X → ERE
13:E → +TE’
14:E → -TE’
15:E → TE’
16:E’→ ME’
17:E’→ Ɛ
18:M → +T
19:M → -T
20:T → FT’
21:T’→ NT’
22:T’→ Ɛ
23:N → *F
24:N → /F
25:F → id
26:F → num
27:F → (E)
28:R → >
29:R → >=
30:R → <
31:R → <=
32:R → ==
33:R → !=
34:S’ → S S’
35:S’ → Ɛ
36:A → char
37:A → short
38:A → int
39:A → long
40:A → float
41:A → double

id num for else while + - * / > >= < <= == != ; , ( ) { } = char short int long float double $
S 1
2
3














4






35
S' 34
34
34
















34 34 34 34 34 34 35
A





















36 37 38 39 40 41
B
















5


6






L 7



























C














9 8
9
9






9
Q


10















11






11
X 12 12


12 12









12










E 15 15


13 14









15










D




16 16

17 17 17 17 17 17 17

17









M




18 19





















T 20 20














20










H




22 22 21 21 22 22 22 22 22 22 22

22









N






23 24



















F 25 26














27










R








28 29 30 31 32 33














表格过大,可点击文末 [ 阅读原文 ] 查看

正确示例截图

错误示例截图

源码获取

源码和可运行的程序jar包均已打包,获取方式如下:

CSDN资源下载链接:https://download.csdn.net/download/weixin_44155115/73496390

网盘链接:关注 “脑补空间” 回复 “语法分析器” 获取


最后编辑于:2024/1/8 拔丝英语网

admin-avatar

英语作文代写、国外视频下载

高质量学习资料分享

admin@buzzrecipe.com