头歌 编译原理答案 用LEX(FLEX)生成PL语言的词法分析器

用LEX(FLEX)生成PL语言的词法分析器

第1关:什么是lex/flex?

 /* 简单词法分析器 */
 /* 功能:能够识别出以小写字母ab结尾的所有字符串(仅含大小写字母)并给打印'Hit!' */
 /* 说明:在下面的begin和end之间添加代码,已经实现了标识符和整常量的识别,你需要完成剩下的部分,加油吧! */
 /* 提示:你只需要保证合法的输入(以ab结尾的字符串)有结果,不合法的输入将会包含在.规则中~ */
%{
#include <stdio.h>
%}

%%
 /* begin */
[a-zA-Z]*ab {printf("%s: Hit!\n", yytext);}
 /* end */

\n				{}
.				{}
%%
int yywrap() { return 1; }
int main(int argc, char **argv)
{
	if (argc > 1) {
		if (!(yyin = fopen(argv[1], "r"))) {
			perror(argv[1]);
			return 1;
		}
	}
	while (yylex());
	return 0;
}

第2关:用flex生成PL语言的词法分析器

 /* PL词法分析器 */
 /* 功能:能够识别出PL支持的所有单词符号并给出种别值 */
 /* 说明:在下面的begin和end之间添加代码,已经实现了标识符和整常量的识别,你需要完成剩下的部分,加油吧! */
 /* 提示:因为是顺序匹配,即从上至下依次匹配规则,所以需要合理安排顺序~ */
%{
#include <stdio.h>
%}
  /* begin */
OFSYM			of
ARRAYSYM		array
MODSYM			mod
ANDSYM			and
ORSYM			or
NOTSYM			not
PROGRAMSYM		program
BEGINSYM		begin
ENDSYM			end
IFSYM			if
THENSYM			then
ELSESYM			else
WHILESYM		while
DOSYM			do
CALLSYM			call
CONSTSYM		const
TYPESYM			type
VARSYM			var
PROCSYM			procedure
OTHER			[~!@#$%^&_]?|\\
INTCON			[\-]?[0-9][0-9]*
IDENT			[A-Za-z][A-Za-z0-9]*
CHARCON			['][^']*['']
PLUS			\+
MINUS			\-
TIMES			\*
DIVSYM			\/
BECOME			:=
EQL				\=
NEQ				<>
LEQ				<=
LSS				\<
GEQ				>=
GTR				\>
LBRACK			\[
RBRACK			\]
LPAREN			\(
RPAREN			\)
COMMA			\,
SEMICOLON		\;
PERIOD			\.
COLON			\:


 /* end */

%%
 /* begin */
{OFSYM}				{printf("%s: OFSYM\n", yytext);}
{ARRAYSYM}			{printf("%s: ARRAYSYM\n", yytext);}
{PROGRAMSYM}		{printf("%s: PROGRAMSYM\n", yytext);}
{MODSYM}			{printf("%s: MODSYM\n", yytext);}
{ANDSYM}			{printf("%s: ANDSYM\n", yytext);}
{ORSYM}				{printf("%s: ORSYM\n", yytext);}
{NOTSYM}			{printf("%s: NOTSYM\n", yytext);}
{BEGINSYM}			{printf("%s: BEGINSYM\n", yytext);}
{ENDSYM}			{printf("%s: ENDSYM\n", yytext);}
{IFSYM}				{printf("%s: IFSYM\n", yytext);}
{THENSYM}			{printf("%s: THENSYM\n", yytext);}
{ELSESYM}			{printf("%s: ELSESYM\n", yytext);}
{WHILESYM}			{printf("%s: WHILESYM\n", yytext);}
{DOSYM}				{printf("%s: DOSYM\n", yytext);}
{CALLSYM}			{printf("%s: CALLSYM\n", yytext);}
{CONSTSYM}			{printf("%s: CONSTSYM\n", yytext);}
{TYPESYM}			{printf("%s: TYPESYM\n", yytext);}
{VARSYM}			{printf("%s: VARSYM\n", yytext);}
{PROCSYM}			{printf("%s: PROCSYM\n", yytext);}
{OTHER}				{printf("%s: ERROR\n", yytext);}
{INTCON}			{printf("%s: INTCON\n", yytext);}
{IDENT}				{printf("%s: IDENT\n", yytext);}
{CHARCON}			{printf("%s: CHARCON\n", yytext);}
{PLUS}				{printf("%s: PLUS\n", yytext);}
{MINUS}				{printf("%s: MINUS\n", yytext);}
{TIMES}				{printf("%s: TIMES\n", yytext);}
{DIVSYM}			{printf("%s: DIVSYM\n", yytext);}
{BECOME}			{printf("%s: BECOME\n", yytext);}
{EQL}				{printf("%s: EQL\n", yytext);}
{NEQ}				{printf("%s: NEQ\n", yytext);}
{LEQ}				{printf("%s: LEQ\n", yytext);}
{LSS}				{printf("%s: LSS\n", yytext);}
{GEQ}				{printf("%s: GEQ\n", yytext);}
{GTR}				{printf("%s: GTR\n", yytext);}
{LBRACK}			{printf("%s: LBRACK\n", yytext);}
{RBRACK}			{printf("%s: RBRACK\n", yytext);}
{LPAREN}			{printf("%s: LPAREN\n", yytext);}
{RPAREN}			{printf("%s: RPAREN\n", yytext);}
{COMMA}				{printf("%s: COMMA\n", yytext);}
{SEMICOLON}			{printf("%s: SEMICOLON\n", yytext);}
{PERIOD}			{printf("%s: PERIOD\n", yytext);}
{COLON}				{printf("%s: COLON\n", yytext);}

 /* end */

\n				{}
.				{}
%%
int yywrap() { return 1; }
int main(int argc, char **argv)
{
	if (argc > 1) {
		if (!(yyin = fopen(argv[1], "r"))) {
			perror(argv[1]);
			return 1;
		}
	}
	while (yylex());
	return 0;
}

posted @   出色的你  阅读(412)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示