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