⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mylex.l

📁 运用flex自动生成词法分析器。包含源代码和使用文档
💻 L
字号:
%{
#include "stdlib.h"
#include "stdio.h"
#define KW "0x103"
#define IDTF "0x104"
#define BL "0x105"
#define CHR "0x106"
#define INTEGER "0x107"
#define FLT "0x108"
#define STR "0x109"
#define EVA "0x110"
#define EQU "0x117"

/* 一行内既有代码又有注释, 则codeno,commentno都加一 */
int lineno = 0;        /* 总行数 */
int emptylineno = 0;    /* 空行数 */
int codeno = 0;        /* 代码行数 */
int commentno = 0;    /* 注释行数 */
int is_comment = 0;    /* 该行是否为注释 */
int in_comment = 0;    /* 是否在注释内,主要考虑跨行的注释代码 */
int is_code = 0;    /* 该行是否为代码 */
int token_num=0;/*总单词数*/
int pre_tk_num=0;
int tk_pline=0;
%}

digit  [0-9]
alpha  [a-zA-Z]
delima   [ \t]
ws       {delima}+
dgt8  0[1-9][0-9]*
dgt16  0[Xx][0-9a-fA-F]+
dgt10  [1-9][1-9]*[Ll]?
integer    {dgt8}|{dgt16}|{dgt10}|0
bl  "false"|"true"
kw  "abstract"|"boolean"|"break"|"byte"|"case"|"catch"|"char"|"class"|"const"|"continue"|"default"|"do"|"double"|"else"|"extends"|"final"|"finally"|"float"|"for"|"goto"|"if"|"implements"|"import"|"instanceof"|"int"|"interface"|"long"|"native"|"new"|"null"|"package"|"private"|"protected"|"public"|"return"|"short"|"static"|"super"|"switch"|"synchronized"|"this"|"throw"|"throws"|"transient"|"try"|"void"|"volatile"|"while"
identifer   [a-zA-Z][0-9a-zA-Z]*
dcm     [0-9]*[.][0-9]+[FfLl]?|[0-9]+[.][FfLl]?
itg     [1-9][0-9]*
scdcm    ({dcm}|{itg})[Ee][+-]?{itg}
flt     {dcm}|{scdcm}
sqm      "\\\'"
dqm      "\\\""
character   ['][^\t\n][']
string      ["]([^\n'"]*|({dqm}|{sqm})*)*["]
evaluate    "="|"+="|"-="|"*="|"/="|"%="|"&="|"^="|"|="|">>="|"<<="|">>>="
condop      [?:]
equal       "=="|"!="
cmp         "<"|">"|"<="|">="
shift       "<<"|">>"|">>>"
adsub       "+"|"-"
muldivmod   "*"|"/"|"%"
auto        "++"|"--"|"!"|"~"
sepr        "["|"]"|"("|")"|"."
brace       "{"|"}"

%%

{ws}        {/*no action and no return*/}
\/\/        { in_comment = 2; is_comment = 1; } /* 匹配以//开始的注释 */
\/\*        { in_comment = 1; is_comment = 1; } /* 匹配另一种注释 */
\*\/        { in_comment = 0; is_comment = 1; }  /*40*/
\n    { /* 一行结束了,分析这行的属性 */
        lineno++;
        if (!is_comment && !is_code)/*如果不是注释也不是代码,那就是空格行*/
            {
		emptylineno++;
 	    }
        else
        {
            if (is_comment)
                commentno++;
            if (is_code)
                codeno++;
        }
        is_comment = 0;
        is_code = 0;
	if(in_comment == 2)     in_comment=0;
	tk_pline = token_num-pre_tk_num;
	printf("---->%d tokens in line %d.\n",tk_pline,lineno);
	fprintf(yyout,"---->%d tokens in line %d.\n",tk_pline,lineno);
	pre_tk_num = token_num;
      }
{bl}  {
        if (in_comment) is_comment = 1;
	else 
	{
	     is_code = 1;

	     token_num++;
	     printf("line %d:(%s,%s)\n",lineno+1,BL,yytext);
             fprintf(yyout,"line %d:(%s,%s)\n",lineno+1,BL,yytext);
	}
      }
{kw}  {
	if (in_comment)     is_comment = 1; 
	else 
	{
	     is_code = 1;

	     token_num++;
	     printf("line %d:(%s,%s)\n",lineno+1,KW,yytext);
             fprintf(yyout,"line %d:(%s,%s)\n",lineno+1,KW,yytext);
	}
      }
{identifer}  {
		if (in_comment)     is_comment = 1; 
	        else 
	        {
	               is_code = 1;

	     	       token_num++;
	   	       printf("line %d:(%s,%s)\n",lineno+1,IDTF,yytext);
                       fprintf(yyout,"line %d:(%s,%s)\n",lineno+1,IDTF,yytext);
	        }
	     }
{character}   {
		  if (in_comment)     is_comment = 1; 
	          else 
	          {
	               is_code = 1;

	               token_num++;
	   	       printf("line %d:(%s,%s)\n",lineno+1,CHR,yytext);
                       fprintf(yyout,"line %d:(%s,%s)\n",lineno+1,CHR,yytext);
	          }
              }
{string}   {
		if (in_comment)     is_comment = 1; 
	        else 
	        {
	               is_code = 1;

	               token_num++;
	   	       printf("line %d:(%s,%s)\n",lineno+1,STR,yytext);
                       fprintf(yyout,"line %d:(%s,%s)\n",lineno+1,STR,yytext);
                }
           }
{integer}  {
	        if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	  	    printf("line %d:(%s,%s)\n",lineno+1,INTEGER,yytext);
       		    fprintf(yyout,"line %d:(%s,%s)\n",lineno+1,INTEGER,yytext);
		 }
           }
{flt}   {
	        if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	  	    printf("line %d:(%s,%s)\n",lineno+1,FLT,yytext);
       		    fprintf(yyout,"line %d:(%s,%s)\n",lineno+1,FLT,yytext);
		 }
        }
{evaluate}  {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	  	    printf("line %d:(%s,%s)\n",lineno+1,EVA,yytext);
       		    fprintf(yyout,"line %d:(%s,%s)\n",lineno+1,EVA,yytext);
		 }
         }
{condop}  {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	  	    printf("line %d:(0x111,%s)\n",lineno+1,yytext);
       		    fprintf(yyout,"line %d:(0x111,%s)\n",lineno+1,yytext);
		 }
          }
"||"      {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	  	    printf("line %d:(0x112,%s)\n",lineno+1,yytext);
       		    fprintf(yyout,"line %d:(0x112,%s)\n",lineno+1,yytext);
		 }
          }
"&&"      {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	  	    printf("line %d:(0x113,%s)\n",lineno+1,yytext);
       		    fprintf(yyout,"line %d:(0x113,%s)\n",lineno+1,yytext);
		 }
          }
"|"       {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	   	    printf("line %d:(0x114,%s)\n",lineno+1,yytext);
       		    fprintf(yyout,"line %d:(0x114,%s)\n",lineno+1,yytext);
		 }
          }
"^"       {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	      	    token_num++;
	  	    printf("line %d:(0x115,%s)\n",lineno+1,yytext);
       		    fprintf(yyout,"line %d:(0x115,%s)\n",lineno+1,yytext);
		 }
          }
"&"       {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	  	    printf("line %d:(0x116,%s)\n",lineno+1,yytext);
       		    fprintf(yyout,"line %d:(0x116,%s)\n",lineno+1,yytext);
		 }
          }
{equal}   {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	  	    printf("line %d:(0x117,%s)\n",lineno+1,yytext);
       		    fprintf(yyout,"line %d:(0x117,%s)\n",lineno+1,yytext);
		 }
          }
{cmp}   {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	  	    printf("line %d:(0x118,%s)\n",lineno+1,yytext);
       		    fprintf(yyout,"line %d:(0x118,%s)\n",lineno+1,yytext);
		 }
          }
{shift}   {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	  	    printf("line %d:(0x119,%s)\n",lineno+1,yytext);
       		    fprintf(yyout,"line %d:(0x119,%s)\n",lineno+1,yytext);
		 }
          }
{adsub}   {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	  	    printf("line %d:(0x11a,%s)\n",lineno+1,yytext);
       		    fprintf(yyout,"line %d:(0x11a,%s)\n",lineno+1,yytext);
		 }
          }
{muldivmod}   {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	  	    printf("line %d:(0x11b,%s)\n",lineno+1,yytext);
       		    fprintf(yyout,"line %d:(0x11b,%s)\n",lineno+1,yytext);
		 }
          }
{auto}    {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	  	    printf("line %d:(0x11c,%s)\n",lineno+1,yytext);
       		    fprintf(yyout,"line %d:(0x11c,%s)\n",lineno+1,yytext);
		 }
          }
{sepr}    {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	  	    printf("line %d:(0x11d,%s)\n",lineno+1,yytext);
       		    fprintf(yyout,"line %d:(0x11d,%s)\n",lineno+1,yytext);
		 }
          }
","       {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	  	    printf("line %d:(0x120,%s)\n",lineno+1,yytext);
       		    fprintf(yyout,"line %d:(0x120,%s)\n",lineno+1,yytext);
		 }
          }
{brace}   {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	     	    token_num++;
	  	    printf("line %d:(0x121,%s)\n",lineno+1,yytext);
       		    fprintf(yyout,"line %d:(0x121,%s)\n",lineno+1,yytext);
		 }
          }
";"       {
		if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	            token_num++;
	  	    printf("line %d:(0x122,%s)\n",lineno+1,yytext);
       		    fprintf(yyout,"line %d:(0x122,%s)\n",lineno+1,yytext);
		 }
          }
.     { 
	        if (in_comment) is_comment = 1; 
	 	else 
		 {
	 	    is_code = 1;

	  	    printf("error:in line %d\n",lineno+1);
       		    fprintf(yyout,"error:in line %d\n",lineno+1);
		 }
      } /* 匹配漏掉的字符,使它不输出 */
%%
int yywrap()
{return 1;}

int main()
{
    yyout = fopen("E:\\scanner_output.txt","w");
    if (yyout == NULL)
    {
        printf("Fail to open the file.");
        return 0;
    }
    

    yylex();
    /* 匹配最后一行 */
    if  (is_comment)
    {
        lineno++;
         commentno++;
    }
    else if  (is_code)
    {
        lineno++;
        codeno++;
    }

    printf("\n");
    fprintf(yyout,"\n");

    printf("Line Total:%d\nEmptyline Total=%d\nComment Line Total:%d\nCode Line Total:%d\nToken Total:%d\n", lineno, emptylineno, commentno, codeno, token_num);
    fprintf(yyout,"Line Total:%d\nEmptyline Total=%d\nComment Line Total:%d\nCode Line Total:%d\nToken Total:%d\n", lineno, emptylineno, commentno, codeno, token_num);
    fclose(yyout);
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -