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

📄 test.l

📁 对pl0语言的词法分析程序
💻 L
字号:
%{
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct item{
	char word[14];
	int n;
}item;

item keyword[20]={'\0'},ident[120]={'\0'},integer[50]={'\0'},operator[20]={'\0'},other[20]={'\0'},symbol[10]={'\0'};

void tally(item * p,char * w)
{
	item * q=NULL;
	for(q=p;q->word[0]!='\0';q++)
	{
		if(strcmp(q->word,w)==0)
		{
			q->n++;
			break;
		}
	}
	if(q->word[0]=='\0')
	{
		strcpy(q->word,w);
		q->n=1;
	}
}

void print(item * p)
{
	item * q=NULL;
	char c1='A';char c2='a';
	if(p==keyword||p==ident)
	{
		while(c2<=122)
		{
			for(q=p;q->word[0]!='\0';q++)
			{
				if(q->word[0]==c2||q->word[0]==c1)
					printf("\t\t%-16s\t\t%3d time(s)\n",q->word,q->n);
			}
			c1++;
			c2++;
		}
	}
	else
	{
		for(q=p;q->word[0]!='\0';q++)
			printf("\t\t%-16s\t\t%3d time(s)\n",q->word,q->n);
	}
	return;
}
%}
IDENT [A-Za-z][A-Za-z0-9]*
DIGIT [0-9]  
KEYWORD IF|if|THEN|then|WHILE|while|DO|do|READ|read|WRITE|write|CALL|call|BEGIN|begin|END|end|CONST|const|VAR|var|PROCEDURE|procedure|ODD|odd
%%
{KEYWORD} {tally(keyword,yytext);}
{IDENT} {tally(ident,yytext);}
{DIGIT}+ {tally(integer,yytext);}
"+"|"-"|"*"|"/"|"="|">"|"<"|">""="|"<""="|"#" {tally(operator,yytext);}
";"|","|":" {tally(symbol,yytext);}
"{"[^}\n]*"}" /* eat up one-line comments */
[ \t\n]+ /* eat up whitespace */
. {tally(other,yytext);}
%%

int yywrap()
{
	return 1;
}

void main()
{
	char FILENAME[30];
	FILE * fp;
	printf("Please input the filename:\n");
	scanf("%s",FILENAME);
	fp=fopen(FILENAME,"r");
	if(fp==NULL)
		printf("Can't open the default file!\n");
	else
		yyin=fp;
	yylex();
	printf("Keyword:\n");
	print(keyword);
	printf("Ident:\n");
	print(ident);
	printf("Integer:\n");
	print(integer);
	printf("Operator:\n");
	print(operator);
        printf("Symbol:\n");
        print(symbol);
	printf("Other:\n");
	print(other);
	return;
}

⌨️ 快捷键说明

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