编译原理实验-用LEX(FLEX)生成PL语言的词法分析器

实训前面有的知识点就不讲了,大家仔细看一下。

第一关:什么是lex/flex?

        测试集内容已经告知了,所以已通关为目的的话,我们可以面向答案进行编程。

        测试集给出的字符串是"Hello", "G"  ,"" ,"FA21", 'FA',题目需要识别的字符串是前三个,首先可以在要识别的正规集对应的正规式中排除 FA21,因此可以构造出 [a-zBCDEG-Z]*,可以不包含数字,反正测试集中没有。但是这样识别不出 ‘ ’ “ ”,打印出的结果里面有,我们可以在行动中加上,也就是printf里面加上,不过要用到转移字符。

        接下来就是对 “” 的识别,我们可以把这个单独搞一个出来。(其实这三个字符串都可以直接这样)。代码如下:

[a-zBCDEG-Z]*      {printf("\"%s\": Hit!\n",yytext);}
"\"\""             {printf("%s: Hit!\n",yytext);}

直接一点就是这样:(只写了两个试试)

"Hello"      {printf("\"%s\": Hit!\n",yytext);}
"\"\""             {printf("%s: Hit!\n",yytext);}

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

 参考文章http://t.csdn.cn/KJk89

        这一关我们需要把那个表上的所有字符都要识别,个人认为第三个正规式就特别有技巧,比较难。

INTCON			[\-]?[0-9][0-9]*
IDENT			[A-Za-z][A-Za-z0-9]*
CHARCON			['][^']*[']
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
ERROR			[~!@#$%^&_]?|\\

PLUS			\+
MINUS			\-
TIMES			\*
DIVSYM			\/
BECOME			:=
EQL				\=
NEQ				<>
LEQ				<=
LSS				\<
GEQ				>=
GTR				\>
LBRACK			\[
RBRACK			\]
LPAREN			\(
RPAREN			\)
COMMA			\,
SEMICOLON		\;
PERIOD			\.
COLON			\:

识别后的动作可以根据答案反馈进行修改都是一些简单的调整:


{OFSYM}			{printf("%s: OFSYM NULL\n", yytext);}
{ARRAYSYM}		{printf("%s: ARRAYSYM NULL\n", yytext);}
{MODSYM}		{printf("%s: MODSYM NULL\n", yytext);}
{ANDSYM}		{printf("%s: ANDSYM NULL\n", yytext);}
{ORSYM}			{printf("%s: ORSYM NULL\n", yytext);}
{NOTSYM}		{printf("%s: NOTSYM NULL\n", yytext);}
{PROGRAMSYM}	{printf("%s: PROGRAMSYM NULL\n", yytext);}
{BEGINSYM}		{printf("%s: BEGINSYM NULL\n", yytext);}
{ENDSYM}		{printf("%s: ENDSYM NULL\n", yytext);}
{IFSYM}			{printf("%s: IFSYM NULL\n", yytext);}
{THENSYM}		{printf("%s: THENSYM NULL\n", yytext);}
{ELSESYM}		{printf("%s: ELSESYM NULL\n", yytext);}
{WHILESYM}		{printf("%s: WHILESYM NULL\n", yytext);}
{DOSYM}			{printf("%s: DOSYM NULL\n", yytext);}
{CALLSYM}		{printf("%s: CALLSYM NULL\n", yytext);}
{CONSTSYM}		{printf("%s: CONSTSYM NULL\n", yytext);}
{TYPESYM}		{printf("%s: TYPESYM NULL\n", yytext);}
{VARSYM}		{printf("%s: VARSYM NULL\n", yytext);}
{PROCSYM}		{printf("%s: PROCSYM NULL\n", yytext);}


{INTCON}		{printf("%s: INTCON %s\n", yytext, yytext);}
{IDENT}			{printf("%s: IDENT %s\n", yytext, yytext);}
{CHARCON}       {printf("%s: CHARCON %s\n", yytext, yytext);}

{PLUS}			{printf("%s: PLUS NULL\n", yytext);}
{MINUS}			{printf("%s: MINUS NULL\n", yytext);}
{TIMES}			{printf("%s: TIMES NULL\n", yytext);}
{DIVSYM}		{printf("%s: DIVSYM NULL\n", yytext);}
{BECOME}		{printf("%s: BECOME NULL\n", yytext);}
{EQL}			{printf("%s: EQL NULL\n", yytext);}
{NEQ}			{printf("%s: NEQ NULL\n", yytext);}
{LEQ}			{printf("%s: LEQ NULL\n", yytext);}
{LSS}			{printf("%s: LSS NULL\n", yytext);}
{GEQ}			{printf("%s: GEQ NULL\n", yytext);}
{GTR}			{printf("%s: GTR NULL\n", yytext);}

{LBRACK}		{printf("%s: LBRACK NULL\n", yytext);}
{RBRACK}		{printf("%s: RBRACK NULL\n", yytext);}
{LPAREN}		{printf("%s: LPAREN NULL\n", yytext);}
{RPAREN}		{printf("%s: RPAREN NULL\n", yytext);}
{COMMA}			{printf("%s: COMMA NULL\n", yytext);}
{SEMICOLON}		{printf("%s: SEMICOLON NULL\n", yytext);}
{PERIOD}		{printf("%s: PERIOD NULL\n", yytext);}
{COLON}			{printf("%s: COLON NULL\n", yytext);}
{ERROR}         {printf("%s: ERROR\n", yytext);}

你可能感兴趣的:(头歌实训,java)