📄 lex.cpp
字号:
#include "StdAfx.h"
#include ".\lex.h"
#include <stdio.h>
#include <ctype.h>
Lex::Lex(void)
{
}
Lex::~Lex(void)
{
}
extern FILE outfp;
extern FILE infp;
Word g_token;
token current_token = UNDEFINE;
bool matched = true;
token scanner() {
int in_char, c;
clear_buffer();
if( feof(stdin) ) {
fprintf(stderr, "eof stdin\n");
return SCANEOF;
}
while( (in_char = getchar()) != EOF ) {
if( isspace(in_char) ) {
continue;
}
else if( isalpha(in_char) ) {
/* ID ::= LETTER | ID LETTER | ID DIGIT | ID UNDERSCORE */
buffer_char(in_char);
for( c = getchar(); isalnum(c) || c == '_'; c = getchar() ) {
buffer_char(c);
}
ungetc(c, stdin);
return check_reserved();
}
else if( isdigit(in_char) ) {
/* INTLITERAL ::= DIGIT | INTLITERAL DIGIT */
buffer_char(in_char);
for(c = getchar(); isdigit(c); c = getchar() ) {
buffer_char(c);
}
ungetc(c, stdin);
return INTLITERAL;
}
else if( in_char == '(' ) {
return LPAREN;
}
else if( in_char == ')' ) {
return RPAREN;
}
else if( in_char == ';' ) {
return SEMICOLON;
}
else if( in_char == ',' ) {
return COMMA;
}
else if( in_char == '+' ) {
return PLUSOP;
}
else if( in_char == '*' ) {
return MULOP;
}
else if( in_char == '/' ) {
return DIVOP;
}
else if( in_char == ':' ) {
/* looking for ":=" */
c = getchar();
if( c == '=' ) {
return ASSIGNOP;
} else {
ungetc(c, stdin);
lexical_error(in_char);
}
}
else if( in_char == '-' ) {
/* is it --, comment start */
c = getchar();
if( c == '-' ) {
do {
in_char = getchar();
} while( in_char != '\n' );
}
else {
ungetc(c, stdin);
return MINUSOP;
}
//return LPAREN; ////////// ????????????????
}
else {
lexical_error(in_char);
}
}
fprintf(stderr, "return SCANEOF\n");
return SCANEOF;
}
token check_reserved(void){
// read write begin end function
char * read = "read";
char * write = "write";
char * begin = "begin";
char * end = "end";
char * function = "function";
if( g_token.buf[0] == 'r' ) {
if( g_token.len != strlen(read) ) {
return ID;
}
if( strncmp(read, g_token.buf, strlen(read) ) == 0 ) {
return READ;
}
}
else if( g_token.buf[0] == 'w' ) {
if( g_token.len != strlen(write) ) {
return ID;
}
if( strncmp(write, g_token.buf, strlen(write) ) == 0 ) {
return WRITE;
}
}
else if( g_token.buf[0] == 'b' ) {
if( g_token.len != strlen(begin) ) {
return ID;
}
if( strncmp(begin, g_token.buf, strlen(begin)) == 0 ) {
return BEGIN;
}
}
else if( g_token.buf[0] == 'e' ) {
if( g_token.len != strlen(end) ) {
return ID;
}
if( strncmp(end, g_token.buf, strlen(end) ) == 0 ) {
return END;
}
}
else if( g_token.buf[0] == 'f' ) {
if( g_token.len != strlen(function) ) {
return ID;
}
if( strncmp(function, g_token.buf, strlen(function) ) == 0 ) {
return FUNCTION;
}
}
return ID;
}
void buffer_char(int c) {
if( g_token.len >= WORD_LEN ) {
error("word too long");
}
g_token.buf[g_token.len++] = c;
}
void clear_buffer(void){
for(int i = WORD_LEN-1; i > 0; i--) {
g_token.buf[i] = 0;
}
g_token.len = 0;
}
void lexical_error(int c) {
fprintf(stderr, "[ Lex-Error ] - %c is unexpected\n", c);
exit(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -