📄 mylex.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 + -