文章目录
实现方法
此语法分析器附带词法分析器;
通过将词法分析的单词压入语法分析栈中,采用 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
网盘链接:
关注微信公众号 “脑补空间” 回复 “语法分析器” 获取