比赛 20100420 评测结果 WTAAAWW
题目名称 词法分析程序 最终得分 42
用户昵称 .Xmz 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-04-20 10:37:51
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstring>

using namespace std;

struct state
{
	char ch[101];
	state *next[301];
}P[101];

int n;

void init()
{
	memset(P,0,sizeof(P));
	scanf("%d",&n);
	for (int i=0;i<n;i++)
	{
		scanf("%s",P[i].ch);
	}
	int t,tt;
	char tch[1];
	for (int i=0;i<n;i++)
	{
		scanf("%d",&t);
		for (int j=1;j<=t;j++)
		{
			scanf("%s%d",tch,&tt);
			P[i].next[tch[0]]=&P[tt];
		}
	}
	scanf("%s",tch);
}

char token[101];
int th=-1;
int main()
{
	freopen("lex.in","r",stdin);
	freopen("lex.out","w",stdout);
	init();
	char tch[101];
	scanf("%s",tch);
	while(tch[0]!='$')
	{
		state *now=&P[0];
		th=-1;
		int i=0;
		while (i<=(int)strlen(tch)-1)
		{
			char lookahead=tch[i];
			if (now->next[lookahead])
			{
				token[++th]=lookahead;
				now=now->next[lookahead];
				i++;
			}
			else
			{
				if (now->ch[0]!='-' || now->ch[1]!='2')
				{
					if (now->ch[0]=='-' && now->ch[1]=='1') printf("Lexer Error: ");
					else printf("%s: ",now->ch);
					for (int i=0;i<=th;i++) printf("%c",token[i]);
					if (th==-1) 
					{	
						printf("%c",lookahead);
						i++;
					}
					printf("\n");
				}
				now=&P[0];
				th=-1;
			}
		}
		if (th!=-1)
		if (now->ch[0]!='-' || now->ch[1]!='2')
		{
			if (now->ch[0]=='-' && now->ch[1]=='1') printf("Lexer Error: ");
			else printf("%s: ",now->ch);
			for (int i=0;i<=th;i++) printf("%c",token[i]);
			printf("\n");
		}
		scanf("%s",tch);
	}
	return 0;
}