实训前面有的知识点就不讲了,大家仔细看一下。
测试集内容已经告知了,所以已通关为目的的话,我们可以面向答案进行编程。
测试集给出的字符串是"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);}
参考文章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);}