一、实验目的
理解编译器词法分析的过程
掌握LEX工具的使用
二、实验器材
计算机 安装了C语言开发环境、Flex工具
三、实验题目
使用Flex工具,对给定编程语言进行词法分析。
四、实验内容
某语言下列词法定义如下:
digit → 0|1|2|3|4|5|6|7|8|9
letter → A|B|C|D|...|X|Y|Z|a|b|...|y|z|_
integer → digit digit*
identify → letter ( letter | digit )*
operator → +|-|*|/|%|==|!=|>|<|>=|<=|&&|\|\||!
reserved → void|int|while|if|else|return|break|continue
symbol → (|)|,|;|{|}
commnet → /\*[^*]\*/
编写LEX程序,识别出这个语言组成的串中所有符号(integer, identify, operator, reserved, symbol),并在屏幕上输出相关内容和错误信息(如果有错误),注释的内容不显示。
程序如下:
%{
#include<stdio.h>
#include<string.h>
%}
letter [A-Za-z_]
digit [0-9]
integer {digit}+
identify {letter}({letter}|{digit})*
operator "+"|"-"|"*"|"/"|"%"|"=="|"!="|">"|"<"|">="|"<="|"&&"|"||"|"!"
reserved "void"|"int"|"while"|"if"|"else"|"return"|"break"|"continue"
symbol "("|")"|","|";"|"{"|"}"
commnet "/*"[^\*]*"*/"
%%
{commnet} { ; }
{integer} { printf("integer[%s]", yytext); }
{reserved} { printf("reserved[%s]", yytext); }
{identify} { printf("identify[%s]", yytext); }
{operator} { printf("operator[%s]", yytext); }
{symbol} { printf("symbol[%s]", yytext); }
%%
int main(int argc,char** argv) {
yylex();
return 0;
}
int yywrap(){
printf("Lex Finished!\n");
return 1;
}