lexer.cpp

来自「编译原理作业」· C++ 代码 · 共 53 行

CPP
53
字号
#include "global.h"

char	lexbuf[BSIZE];

int lookup(char s[]);
int insert(char s[], int tok);
void error(char *m);
extern int tokenval;
extern int lineno;
extern struct entry symtable[SYMMAX];


int lexan()
{
	int	t;
	while(1){
		t = getchar();
		if ( t == ' ' || t == '\t' )
			;
		else if ( t == '\n' )
			lineno++;
		else if ( isdigit(t) ) {
			ungetc( t, stdin );
			scanf( "%d", &tokenval );
			return NUM;
		}
		else if ( isalpha(t) ) {
			int p, b = 0;
			while ( isalnum(t) ) {
				lexbuf[b] = t;
				t = getchar();
				b++;
				if ( b >= BSIZE )
					error("syntax error");
			}
			lexbuf[b] = EOS;
			if ( t != EOF )
				ungetc( t, stdin );
			p = lookup(lexbuf);
			if ( p == 0 )
				p = insert( lexbuf, ID );
			tokenval = p;
			return symtable[p].token;
		}
		else if ( t == EOF )
			return DONE;
		else {
			tokenval = NONE;
			return t;
		}
	}
}

⌨️ 快捷键说明

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