软件课程设计2关于语法分析器的故事


1. 课设要求

TASK2

任务2:创建一个使用LL(1) 方法或LR(1) 方法的语法分析程序。

程序有两个输入

  1. 一个是文本文档,其中包含2º型文法(上下文无关文法)的产生式集

  2. 任务1词法分析程序输出的(生成的)token令牌表。程序的输出包括:YES或NO(源代码字符串符合此2º型文法,或者源代码字符串不符合此2º型文法);错误提示文件,如果有语法错标示出错行号,并给出大致的出错原因。

语法分析程序的推荐处理逻辑:根据用户输入的2º型文法,生成Action及Goto表,设计合适的数据结构,判断 token序列(用户输入的源程序转换)是否符合LR1文法规则,识别token序列,输出结果。

提示:选用LR(1)方法的起评分数高😉

所以……当然是选用的LR(1)文法啦🤣,真的是被迫“卷”

2. 实验结果

input_right.txt(正确的token表)

2	int	keyword
2	main	keyword
2	(	limited
2	)	limited
2	{	limited
3	12+13i	const
3	;	limited
4	int	keyword
4	k	sign
4	=	operator
4	-12.46e78	const
5	;	limited
6   int keyword
6   y   sign
6   =   operator
6	x	sign
6	+	operator
6	k	sign
6	;	limited
7	return	keyword
7	0	const
7	;	limited
8	}	limited

input_err.txt(错误的token表)

2	int	keyword
2	main	keyword
2	(	limited
2	)	limited
2	{	limited
3	12+13i	const
3	;	limited
4	int	keyword
4	k	sign
4	=	operator
4	-12.46e78	const
5	;	limited
6   int keyword
6   y   sign
6   =   operator
6	x	sign
6	+	operator
6	k	sign
6	;	limited
7	return	keyword
7	0	const
8	}	limited

input2.txt(语法)

[START] --> [X]
[X] --> ['int']['main']['('][')']['{'][BLOCK]['}']
[BLOCK] --> [const][';']
[BLOCK] --> [const][';'][BLOCK]
[BLOCK] --> [FORMULA][';'][BLOCK]
[FORMULA] --> ['int'][sign]['='][F]
[F] --> [E]['+'][F]
[F] --> [E]
[E] --> [N]['*'][N]
[E] --> [N]
[N] --> [sign]
[N] --> [const]
[BLOCK] --> [RETURN]
[RETURN] --> ['return'][const][';']
[RETURN] --> [final]
[X] -->[final]

output

YES

NO

中间生成的LR(1)分析表

right!

err~


文章作者: Gao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Gao !
评论
  目录