clexan.l

来自「编译器的第一个环节」· L 代码 · 共 86 行

L
86
字号
%{

#include <stdio.h>

int yylineno = 1;
FILE *in, *out;

%}

newln	\n
lower   [a-z]
letter	[A-Za-z]
digit	[0-9]
id	({letter}|_)({letter}|{digit}|_)*
number	-?{digit}+(\.{digit}+)?([E\e][+\-]?{digit}+)?
comment	\/\*(\*[^/]|[^*])*\*\/
chart \'(.|\\{lower})\'
string \"([^"]|\\\")*\"

%%

[ \t]+		;
{comment}	;
{newln}		{ ++yylineno; fprintf(out, "\n# LINE %d:\n", yylineno); }

void|int|char|return|if|else|while {
	fprintf(out, "KEY:\t%s\n", yytext);
}

{id} {
	fprintf(out, "ID:\t%s\n", yytext);
}

{number} {
	fprintf(out, "NUM:\t%s\n", yytext);
}

{chart} {
	fprintf(out, "CAHR:\t%s\n", yytext);
}

{string} {
	fprintf(out, "STR:\t%s\n", yytext);
}

"+"|"-"|"*"|"/"|"<="|"<"|">="|">"|"=="|"!="|"=" {
	fprintf(out, "SYM:\t%s\n", yytext);
}

";"|","|"("|")"|"["|"]"|"{"|"}" {
	fprintf(out, "SYM:\t%s\n", yytext);
}

. ;
	ECHO;

%%

yywrap() { return 1; }

int main(int argc, char *argv[])
{
	if (argc > 2)
	{
		in = fopen(argv[1], "r");
		if (!in)
		{
			fprintf(stderr, "Can not open %s\n", argv[1]);
			exit(1);
		}
		out = fopen(argv[2], "w");
		if (!out)
		{
		  fprintf(stderr, "Can not open %s\n", argv[2]);
		}
		
		yyin = in;
	}
	fprintf(out, "#LINE 1:\n");
	yylex();
	fprintf(out, "EOF\n");
	fclose(in);
	fclose(out);

	return 0;
}

⌨️ 快捷键说明

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