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;
|
|||
|
}
|