【编译原理(实验)】语法分析器(Java实现,带UI界面)

实现方法

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

通过将词法分析的单词压入语法分析栈中,采用 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
TF | T*F | T/F
F<标识符> | <无符号整数> | (<表达式 >)

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

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

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

3.提取公共左因子:

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

4.消除左递归:

S’ → S SS’ → Ɛ
SA L;
S → id B
Sif(X){S}Q
Swhile(X){S}
S → Ɛ
B(L);
B=E;
L → id LL’→ , id LL’→ Ɛ
Qelse{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!=
Achar
Ashort
Aint
Along
Afloat
Adouble

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) 预测分析表中的数字分别代表的产生式如下:

0SA L;
1S → id B
2Sif(X){P}Q
3Swhile(X){P}
4S → Ɛ
5B(L);
6B=E;
7L → id L8L’→ ,id L9L’→ Ɛ
10Qelse{S}
11Q → Ɛ
12X → ERE
13E+TE’
14E-TE’
15E → TE’
16E’→ ME’
17E’→ Ɛ
18M+T
19M-T
20T → FT’
21T’→ NT’
22T’→ Ɛ
23N*F
24N/F
25F → id
26F → num
27F(E)
28R>
29R>=
30R<
31R<=
32R==
33R!=
34S’ → S S35S’ → Ɛ
36Achar
37Ashort
38Aint
39Along
40Afloat
41Adouble
idnumforelsewhile+-*/>>=<<===!=;,(){}=charshortintlongfloatdouble$
S123435
S’34343434343434343435
A363738394041
B56
L7
C98999
Q101111
X1212121212
E1515131415
D16161717171717171717
M1819
T202020
H222221212222222222222222
N2324
F252627
R282930313233

正确示例截图

请添加图片描述

错误示例截图

错误示例

源码获取

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

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

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

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nonoas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值