# 语法分析器的简单实现
# 一、实验目的
通过构建一个简单的语法分析程序,进一步熟悉语法分析的过程以及加深对 First 和Follow 的认识。
# 二、实验描述
本次实验使用 Java 语言编写,简单实现了对 C 语言程序的语法分析。程序的输入是 C 语言程序代码 program.c 文件以及已经定义好的文法 CFG.txt 文件。程序的输出是控制台和 output.txt 文件,内容是语法分析的过程。本实验中用到的词法分析部分是实验一的词法分析器。
# 三、实验方法
本次实验选用的方法是 PPT 中给出的第一种方法中的 a 方法,根据文法编程构建 LL(1) 预测分析表来进行语法分析。
实验设想
无。
相关的自动机描述
大部分同词法分析。
# 四、数据结构的定义
Lex 类:词法分析程序
Token 类:Token 序列中的元素
Production 类:产生式类,包括两个属性,一个是 left(String 类型),表示产生式的左部;另一个是 right(List<String>类型),表示产生式的右部。
FirstFollow 类:表示 First 或 Follow 的类,包括两个属性,一个是 left(String 类型),另一个是 right(List<String>类型)。
Syntax 类:语法分析程序核心 终结符和非终结符分别用 List<String>类型来表示。
产生式用 List<Production>类型来表示。
符号的 First 和 Follow 分别用 List<FirstFollow>类型来表示。
预测分析表用 Production[][]类型表示,还需要借助终结符和非终结符的 List<String>作为表头。
语法分析过程中的栈用 Java 自带的 Stack<String>来表示。
Token 序列(简化版)用 List<String>类型来表示。
# 五、核心算法描述
程序的核心算法主要有四个:
getFirst():获得符号的 First 集合,算法在龙书的 P140.
getFollow():获得符号的 Follow 集合,算法在龙书的 P140-141.
getParsingTable():构建预测分析表,算法在龙书的 P142-143,算法 4.31
syntaxParsing():表驱动的预测语法分析,算法在龙书的 P144,算法 4.34
# 六、测试用例
## 6.1 语言程序源代码:(program.c)
```c++
int main(float a) {
while (a <= 5) {
if (a == 6) {
a = 8;
} else {
int b = 5;
b = a + 5;
}
}
return 0;
}
```
## 6.2 文法:(CFG.txt)
```c++
<Program> -> <Function>
<Function> -> [void] <FuncName> [(] <Para> [)] [{] <Statement> [}]
<Function> -> <DataType> <FuncName> [(] <Para> [)] [{] <Statement> <Return> [}]
<FuncName> -> [ID]
<Para> -> [ε]
<Para> -> <DataType> [ID]
<Statement> -> <S> <Statement>
<Statement> -> [ε]
<S> -> <DataType> [ID] <M>
<M> -> [;]
<M> -> [=] [NUM] [;]
<S> -> [ID] [=] <Keyword> <N>
<N> -> [;]
<N> -> <OP> <Keyword> [;]
<S> -> [if] [(] <C> [)] <B> <D>
<D> -> [else] <B>
<D> -> [ε]
<B> -> [{] <Statement> [}]
<C> -> <Keyword> <CompareOP> <Keyword>
<S> -> [while] [(] <C> [)] <B>
<DataType> -> [int]
<DataType> -> [float]
```
```c++
<DataType> -> [double]
<OP> -> [+]
<OP> -> [-]
<OP> -> [*] <OP> -> [/]
<OP> -> [%]
<CompareOP> -> [==] <CompareOP> -> [!=]
<CompareOP> -> [>=]
<CompareOP> -> [<=]
<CompareOP> -> [>]
<CompareOP> -> [<]
<Keyword> -> [ID]
<Keyword> -> [NUM]
<Return> -> [return] <Keyword> [;]
```
下面是一些可选择的输出:(Syntax 类中的 public 方法):
outputTerminals():
```c++
void ( ) { } ID ε ; = NUM if else while int float double + - * / % == != >= <= > < return $
```
## 6.3 outputNonTerminals():
```c++
Program Function FuncName Para Statement DataType Return S M Keyword N OP C B D
CompareOP
```
## 6.4 outputProductions():
```c++
Program -> Function
Function -> void FuncName ( Para ) { Statement }
Function -> DataType FuncName ( Para ) { Statement Return }
FuncName -> ID
Para -> ε
Para -> DataType ID
Statement -> S Statement
Statement -> ε
-> DataType ID M
-> ;
-> = NUM ;
-> ID = Keyword N
-> ;
-> OP Keyword ;
-> if ( C ) B D
-> else B
-> ε
```
```c++
-> { Statement }
-> Keyword CompareOP Keyword
S -> while ( C ) B
DataType -> int
DataType -> float
DataType -> double
OP -> +
OP -> -
OP -> *
OP -> /
OP -> %
CompareOP -> == CompareOP -> !=
CompareOP -> >=
CompareOP -> <=
CompareOP -> >
CompareOP -> <
Keyword -> ID
Keyword -> NUM
Return -> return Keyword ;
```
## 6.5 outputFirstFollows():
```
First( void ) → void
First( ( ) → (
First( ) ) → )
First( { ) → {
First( } ) → }
First( ID ) → ID
First( ε ) → ε
First( ; ) → ;
First( = ) → =
First( NUM ) → NUM
First( if ) → if
First( else ) → else
First( while ) → while
First( int ) → int
First( float ) → float
First( double ) → double
First( + ) → +
First( - ) → -
First( * ) → *
First( / ) → /
First( % ) → %
First( == ) → ==
First( != ) → !=
First( >= ) → >=
First( <= ) → <=
First( > ) → >
First( < ) → <
First( return ) → return
First( $ ) → $
First( Program ) → void int float double
First( Function ) → void int float double
First( FuncName ) → ID
First( Para ) → ε int float double
First( Statement ) → ε int float double ID if while
First( DataType ) → int float double
First( Return ) → return
First( S ) → int float double ID if while
First( M ) → ; =
First( Keyword ) → ID NUM
First( N ) → ; + - * / %
First( OP ) → + - * / %
First( C ) → ID NUM
First( B ) → {
First( D ) → ε else
First( CompareOP ) → == != >= <= > <
Follow( void ) → ID
Follow( ( ) → int float double ID NUM
Follow( ) ) → {
Follow( { ) → int float double ID if while
Follow( } ) → $ else int float double ID if while } return
Follow( ID ) → ; = ( ) + - * / % == != >= <= > <
Follow( ε ) → ) } return int float double ID if while
Follow( ; ) → } int float double ID if while return
Follow( = ) → ID NUM
else ) → {
Follow( while ) → (
Follow( int ) → ID
Follow( float ) → ID
Follow( double ) → ID
Follow( + ) → ID NUM
Follow( - ) → ID NUM
Follow( * ) → ID NUM
Follow( / ) → ID NUM
Follow( % ) → ID NUM
Follow( == ) → ID NUM Follow( != ) → ID NUM
Follow( >= ) → ID NUM
Follow( <= ) → ID NUM
Follow( > ) → ID NUM
Follow( < ) → ID NUM
Follow( return ) → ID NUM
Follow( $ ) →
Follow( Program ) → $
Follow( Function ) → $
Follow( FuncName ) → (
Follow( Para ) → )
Follow( Statement ) → } return
Follow( DataType ) → ID
Follow( Return ) → }
Follow( S ) → int float double ID if while } return
Follow( M ) → int float double ID if while } return
Follow( Keyword ) → ; + - * / % == != >= <= > < )
Follow( N ) → int float double ID if while } return
Follow( OP ) → ID NUM
Follow( C ) → )
Follow( B ) → else int float double ID if while } return
Follow( D ) → int float double ID if while } return
Follow( CompareOP ) → ID NUM
```
## 6.6 outputPPT():
```c++
<Program> [void] Program -> Function
<Program> [(] _
<Program> [)] _
<Program> [{] _
<Program> [}] _ <Program> [ID] _ <Program> [ε] _
<Program> [;] _
<Program> [=] _
<Program> [NUM] _
<Program> [if] _ <Program> [else] _
<Program> [while] _
<Program> [int] Program -> Function <Program> [float] Program -> Function
<Program> [double] Program -> Function
<Program> [+] _
<Program> [-] _
```
```c++
<Program> [*] _
<Program> [/] _
<Prog
没有合适的资源?快使用搜索试试~ 我知道了~
基于java的语法分析器设计
共12个文件
java:6个
xml:1个
txt:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 27 浏览量
2023-01-12
12:23:57
上传
评论 2
收藏 16KB ZIP 举报
温馨提示
可以用于课程设计、毕业设计、学习参考、完整的代码、 本次实验使用 Java 语言编写,简单实现了对 C 语言程序的语法分析。程序的输入是 C 语言程序代码 program.c 文件以及已经定义好的文法 CFG.txt 文件。程序的输出是控制台和 output.txt 文件,内容是语法分析的过程。本实验中用到的词法分析部分是实验一的词法分析器。
资源推荐
资源详情
资源评论
收起资源包目录
基于java的语法分析器设计.zip (12个子文件)
output
program.c 176B
pom.xml 424B
src
main
java
FirstFollow.java 208B
Lex.java 21KB
Syntax.java 17KB
Token.java 703B
Main.java 204B
Production.java 207B
LICENSE 1KB
CFG.txt 882B
.gitignore 2KB
README.md 39KB
共 12 条
- 1
资源评论
- 2301_767608982023-11-06发现一个超赞的资源,赶紧学习起来,大家一起进步,支持!
甜辣uu
- 粉丝: 8406
- 资源: 1103
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功