编译原理课程设计报告

  • 格式:doc
  • 大小:85.00 KB
  • 文档页数:22

下载文档原格式

  / 22
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验1:用Lex设计词法分析器1

实验目的:学会用lex设计一个词法分析器。

实验内容:使用lex为下述文法语言写一个词法分析器。

实验要求:

输入为用该语言所写的源程序文件;输出为记号序列,每个记号显示为二元组(记号名,记号属性值)的形式。输出可以在屏幕上,也可以输出到文件中。不要求建立符号表。

在cygwin下用flex和gcc工具将实验调试通过,并能通过例子parser0中testcases 目录下的测试例的测试。

实验参考:和。

语言文法:

<程序> PROGRAM <标识符> ; <分程序>

<分程序> <变量说明> BEGIN <语句表> END.

<变量说明> VAR <变量说明表>;

<变量说明表><变量表>: <类型> | <变量表>: <类型>; <变量说明表>

<类型> INTEGER | REAL

<变量表> <变量> | <变量>, <变量表>

<语句表> <语句> | <语句>; <语句表>

<语句> <赋值语句> | <条件语句> | | <复合语句>

<赋值语句><变量> := <算术表达式>

<条件语句> IF <关系表达式> THEN <语句> ELSE <语句>

WHILE <关系表达式> DO <语句>

<复合语句> BEGIN <语句表> END

<算术表达式> <项> | <算术表达式> + <项> | <算术表达式> - <项>

<项> <因式> | <项> * <因式> | <项> / <因式>

<因式> <变量> | <常数> | (<算术表达式>)

<关系表达式> <算术表达式> <关系符> <算术表达式>

<变量> <标识符>

<标识符> <标识符><字母> | <标识符><数字> | <字母>

<常数> <整数> | <浮点数>

<整数> <数字> | <数字> <整数>

<浮点数> .<整数> | <整数>.<整数>

<关系符> < | <= | = | > | >=| <>

<字母> A | B | …| X | Y | Z | a | b | …| x | y | z

<数字>0|1|2|…|9

程序代码:

%{

#include <>

#define LT 1

#define LE 2

#define GT 3

#define GE 4

#define EQ 5

#define NE 6

#define PROGRAM 7

#define END 13

#define VAR 9

#define IF 10

#define THEN 11

#define ELSE 12

#define WHILE 18

#define DO 19

#define ID 20

#define NUMBER 21

#define RELOP 22

#define NEWLINE 23

#define ERRORCHAR 24

%}

delim [ \t \n]

ws {delim}+

letter [A-Za-z]

digit [0-9]

id _|{letter}({letter}|{digit})*

number {digit}+(\.{digit}+)?(E[+-]?{digit}+)?

int1 {digit}|{digit}{int1}*/

%s COMMENT

%%

"/*" {BEGIN COMMENT;ECHO;} "*/" {BEGIN INITIAL;ECHO;} .|\n {ECHO;}

/* ECHO是一个宏,相当于 fprintf(yyout, "%s", yytext)*/ {ws} {;}

while {return (WHILE);}

do {return (DO);}

PROGRAM {return (PROGRAM);}

end {return (END);}

VAR {return (VAR);}

if {return (IF);}

then {return (THEN);}

else {return (ELSE);}

{id} {return (ID);}

{number} {return (NUMBER);}

"<" {return (RELOP);}

"<=" {return (RELOP);}

"=" {return (RELOP);}

"<>" {return (RELOP);}

">" {return (RELOP);}

">=" {return (RELOP);}

"+" {return (RELOP);}

"-" {return (RELOP);}

"*" {return (RELOP);}

"/" {return (RELOP);}

":=" {return (RELOP);}

";" {return (RELOP);}

"." {return (RELOP);}

"," {return (RELOP);}

. {return ERRORCHAR;}

%%

int yywrap (){

return 1;

}

void writeout(int c){

switch(c){

case ERRORCHAR: fprintf(yyout, "(ERRORCHAR, \"%s\") ", yytext);break;

case RELOP: fprintf(yyout, "(RELOP, \"%s\") ", yytext);break;

case WHILE: fprintf(yyout, "(WHILE, \"%s\") ", yytext);break;

case DO: fprintf(yyout, "(DO, \"%s\") ", yytext);break;

case NUMBER: fprintf(yyout, "(NUM, \"%s\") ", yytext);break;

case ID: fprintf(yyout, "(ID, \"%s\") ", yytext);break;

case NEWLINE: fprintf(yyout, "\n");break;

case PROGRAM: fprintf(yyout, "(PROGRAM, \"%s\") ", yytext);break;

case END: fprintf(yyout, "(END, \"%s\") ", yytext);break;

case VAR: fprintf(yyout, "(VAR, \"%s\") ", yytext);break;

case IF: fprintf(yyout, "(IF, \"%s\") ", yytext);break;

case THEN: fprintf(yyout, "(THEN, \"%s\") ", yytext);break;

case ELSE: fprintf(yyout, "(ELSE, \"%s\") ", yytext);break;

default:break;

}

return;

}