依据语言构词规则,从输入的源程序(字符串)中识别出一个
个单词(符号)。
例如,给定如下输入:
position = initial + rate * 60
词法分析器将识别出7个单词符号
position, =, initial, +, rate, *, 60
clib.h
定义了一些用基础的数据结构。
#ifndef CLIB_H_INCLUDE
#define CLIB_H_INCLUDE
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef struct c_reader c_reader; //
typedef struct c_buffer c_buffer; //缓存
typedef struct c_token c_token; //单词符号串结构体
typedef enum c_type c_type; //单词符号类型(即种别码)
typedef struct srouce_location location_t; //单词符号起始字符所在位置//c语言运算符
#define OP_TABLE OP(EQ, "=") OP(EQ_EQ, "==") OP(NOT, "!") OP(NOT_EQ, "!=") OP(GREATER, ">") OP(GREATER_EQ, ">=") OP(LESS, "<") OP(LESS_EQ, "<=") OP(PLUS, "+") OP(PLUS_EQ, "+=") OP(PLUS_PLUS, "++") OP(MINUS, "-") OP(MINUS_EQ, "-=") OP(MINUS_MINUS, "--") OP(MULT, "*") OP(MULT_EQ, "*=") OP(DIV, "/") OP(DIV_EQ, "/=") OP(MOD, "%") OP(MOD_EQ, "%=") OP(AND, "&") OP(AND_EQ, "&=") OP(OR, "|") OP(OR_EQ, "|=") OP(XOR, "^") OP(XOR_EQ, "^=") OP(RSHIFT, ">>") OP(RSHIFT_EQ, ">>=") OP(LSHIFT, "<<") OP(LSHIFT_EQ, "<<=") OP(COMPL, "~") OP(AND_AND, "&&") OP(OR_OR, "||") OP(QUERY, "?") OP(COLON, ":") OP(COMMA, ",") OP(OPEN_PAREN, "(") OP(CLOSE_PAREN, ")") OP(OPEN_SQUARE, "[") OP(CLOSE_SQUARE,"]") OP(OPEN_BRACE, "{") OP(CLOSE_BRACE, "}") OP(SEMICOLON, ";") OP(DEREF, "->") OP(DOT, ".") OP(DOT_DOT_DOT, "...") OP(SHARP, "#") OP(SHARP_SHARP, "##") //
#define TK_TABLE TK(NAME, IDENT) TK(NUMBER, LITERAL) TK(CHARACTER, LITERAL) TK(STRING, LITERAL) TK(OTHER, LITERAL) TK(HEADER_NAME, LITERAL) TK(COMMENT, LITERAL) TK(MACRO_ARG, NONE) //c语言关键字枚举
#define KW_TABLE KW(STATIC, "static") KW(UNSIGNED, "unsigned") KW(LONG, "long") KW(CONST, "const") KW(EXTERN, "extern") KW(REGISTER, "register") KW(TYPEDEF, "typedef") KW(SHORT, "short") KW(INLINE, "inline") KW(VOLATILE, "volatile") KW(SIGNED, "signed") KW(AUTO, "auto") KW(INT, "int") KW(CHAR, "char") KW(FLOAT, "float") KW(DOUBLE, "double") KW(VOID, "void") KW(ENUM, "enum") KW(STRUCT, "struct") KW(UNION, "union") KW(IF, "if") KW(ELSE, "else") KW(WHILE, "while") KW(DO, "do") KW(FOR, "for") KW(SWITCH, "switch") KW(CASE, "case") KW(DEFAULT, "default") KW(BREAK, "break") KW(CONTINUE, "continue") KW(RETURN, "return") KW(GOTO, "goto") KW(SIZEOF, "sizeof") KW(RESTRICT, "restrict") #define OP(e,s) C_ ## e,
#define TK(e,s) C_ ## e,
#define KW(e,s) C_ ## e,
//枚举单词符号串的种别码
enum c_type
{OP_TABLEKW_TABLETK_TABLEN_TYPES //No type
};
#undef KW
#undef OP
#undef TK#define KW(e,s) if(!strcmp(str,s)) return C_ ## e;
c_type is_keyword(const char *base,int size)
{char str[256];memcpy(str,base,size);str[size] = '