2021-10-28

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

第一关

 /* 简单词法分析器 */
 /* 功能:能够识别出以小写字母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;
}

第二关

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

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...