lcc 源代码解析之token.h
来源:互联网 发布:各国网络制式mobinil 编辑:程序博客网 时间:2024/05/21 12:39
元旦憋了两天,终究是没能透彻的理解表达式的语法分析,关于这部分等我自己搞明白再分享出来,
又要开工了,每天只有有限的时间区分析代码,再加上还要抽空看看面试题,估计要费一段时间了。
先分享一道小菜,即头文件token.h,这是一个十分重要的头文件,用的也很奇妙,当然,这损失了代码的部分可读性。
/* $Id: token.h,v 1.1 2002/08/28 23:12:47 drh Exp $ *//*xx(symbol,value,prec,op,optree,kind,string)(枚举标示符, 字符值, 单词操作符的优先顺序, 通用操作符, 创建树的函数, 单词集合, 字符串表示)yy处理单字符单词,xx处理多字符单词和其他*/yy(0, 0, 0, 0, 0, 0, 0)xx(FLOAT, 1, 0, 0, 0, CHAR, "float")xx(DOUBLE, 2, 0, 0, 0, CHAR, "double")xx(CHAR, 3, 0, 0, 0, CHAR, "char")xx(SHORT, 4, 0, 0, 0, CHAR, "short")xx(INT, 5, 0, 0, 0, CHAR, "int")xx(UNSIGNED, 6, 0, 0, 0, CHAR, "unsigned")xx(POINTER, 7, 0, 0, 0, 0, "pointer")xx(VOID, 8, 0, 0, 0, CHAR, "void")xx(STRUCT, 9, 0, 0, 0, CHAR, "struct")xx(UNION, 10, 0, 0, 0, CHAR, "union")xx(FUNCTION, 11, 0, 0, 0, 0, "function")xx(ARRAY, 12, 0, 0, 0, 0, "array")xx(ENUM, 13, 0, 0, 0, CHAR, "enum")xx(LONG, 14, 0, 0, 0, CHAR, "long")xx(CONST, 15, 0, 0, 0, CHAR, "const")xx(VOLATILE, 16, 0, 0, 0, CHAR, "volatile")yy(0, 17, 0, 0, 0, 0, 0)yy(0, 18, 0, 0, 0, 0, 0)yy(0, 19, 0, 0, 0, 0, 0)yy(0, 20, 0, 0, 0, 0, 0)yy(0, 21, 0, 0, 0, 0, 0)yy(0, 22, 0, 0, 0, 0, 0)yy(0, 23, 0, 0, 0, 0, 0)yy(0, 24, 0, 0, 0, 0, 0)yy(0, 25, 0, 0, 0, 0, 0)yy(0, 26, 0, 0, 0, 0, 0)yy(0, 27, 0, 0, 0, 0, 0)yy(0, 28, 0, 0, 0, 0, "long long")yy(0, 29, 0, 0, 0, 0, 0)yy(0, 30, 0, 0, 0, 0, 0)yy(0, 31, 0, 0, 0, 0, "const volatile")xx(ID, 32, 0, 0, 0, ID, "identifier")yy(0, 33, 0, 0, 0, ID, "!")xx(FCON, 34, 0, 0, 0, ID, "floating constant")xx(ICON, 35, 0, 0, 0, ID, "integer constant")xx(SCON, 36, 0, 0, 0, ID, "string constant")yy(0, 37, 13, MOD, bittree,'%', "%")yy(0, 38, 8, BAND, bittree,ID, "&")xx(INCR, 39, 0, ADD, addtree,ID, "++")yy(0, 40, 0, 0, 0, ID, "(")yy(0, 41, 0, 0, 0, ')', ")")yy(0, 42, 13, MUL, multree,ID, "*")yy(0, 43, 12, ADD, addtree,ID, "+")yy(0, 44, 1, 0, 0, ',', ",")yy(0, 45, 12, SUB, subtree,ID, "-")yy(0, 46, 0, 0, 0, '.', ".")yy(0, 47, 13, DIV, multree,'/', "/")xx(DECR, 48, 0, SUB, subtree,ID, "--")xx(DEREF, 49, 0, 0, 0, DEREF, "->")xx(ANDAND, 50, 5, AND, andtree,ANDAND, "&&")xx(OROR, 51, 4, OR, andtree,OROR, "||")xx(LEQ, 52, 10, LE, cmptree,LEQ, "<=")xx(EQL, 53, 9, EQ, eqtree, EQL, "==")xx(NEQ, 54, 9, NE, eqtree, NEQ, "!=")xx(GEQ, 55, 10, GE, cmptree,GEQ, ">=")xx(RSHIFT, 56, 11, RSH, shtree, RSHIFT, ">>")xx(LSHIFT, 57, 11, LSH, shtree, LSHIFT, "<<")yy(0, 58, 0, 0, 0, ':', ":")yy(0, 59, 0, 0, 0, IF, ";")yy(0, 60, 10, LT, cmptree,'<', "<")yy(0, 61, 2, ASGN, asgntree,'=', "=")yy(0, 62, 10, GT, cmptree,'>', ">")yy(0, 63, 0, 0, 0, '?', "?")xx(ELLIPSIS, 64, 0, 0, 0, ELLIPSIS,"...")xx(SIZEOF, 65, 0, 0, 0, ID, "sizeof")yy(0, 66, 0, 0, 0, 0, 0)xx(AUTO, 67, 0, 0, 0, STATIC, "auto")xx(BREAK, 68, 0, 0, 0, IF, "break")xx(CASE, 69, 0, 0, 0, IF, "case")xx(CONTINUE, 70, 0, 0, 0, IF, "continue")xx(DEFAULT, 71, 0, 0, 0, IF, "default")xx(DO, 72, 0, 0, 0, IF, "do")xx(ELSE, 73, 0, 0, 0, IF, "else")xx(EXTERN, 74, 0, 0, 0, STATIC, "extern")xx(FOR, 75, 0, 0, 0, IF, "for")xx(GOTO, 76, 0, 0, 0, IF, "goto")xx(IF, 77, 0, 0, 0, IF, "if")xx(REGISTER, 78, 0, 0, 0, STATIC, "register")xx(RETURN, 79, 0, 0, 0, IF, "return")xx(SIGNED, 80, 0, 0, 0, CHAR, "signed")xx(STATIC, 81, 0, 0, 0, STATIC, "static")xx(SWITCH, 82, 0, 0, 0, IF, "switch")xx(TYPEDEF, 83, 0, 0, 0, STATIC, "typedef")xx(WHILE, 84, 0, 0, 0, IF, "while")xx(TYPECODE, 85, 0, 0, 0, ID, "__typecode")xx(FIRSTARG, 86, 0, 0, 0, ID, "__firstarg")yy(0, 87, 0, 0, 0, 0, 0)yy(0, 88, 0, 0, 0, 0, 0)yy(0, 89, 0, 0, 0, 0, 0)yy(0, 90, 0, 0, 0, 0, 0)yy(0, 91, 0, 0, 0, '[', "[")yy(0, 92, 0, 0, 0, 0, 0)yy(0, 93, 0, 0, 0, ']', "]")yy(0, 94, 7, BXOR, bittree,'^', "^")yy(0, 95, 0, 0, 0, 0, 0)yy(0, 96, 0, 0, 0, 0, 0)yy(0, 97, 0, 0, 0, 0, 0)yy(0, 98, 0, 0, 0, 0, 0)yy(0, 99, 0, 0, 0, 0, 0)yy(0, 100, 0, 0, 0, 0, 0)yy(0, 101, 0, 0, 0, 0, 0)yy(0, 102, 0, 0, 0, 0, 0)yy(0, 103, 0, 0, 0, 0, 0)yy(0, 104, 0, 0, 0, 0, 0)yy(0, 105, 0, 0, 0, 0, 0)yy(0, 106, 0, 0, 0, 0, 0)yy(0, 107, 0, 0, 0, 0, 0)yy(0, 108, 0, 0, 0, 0, 0)yy(0, 109, 0, 0, 0, 0, 0)yy(0, 110, 0, 0, 0, 0, 0)yy(0, 111, 0, 0, 0, 0, 0)yy(0, 112, 0, 0, 0, 0, 0)yy(0, 113, 0, 0, 0, 0, 0)yy(0, 114, 0, 0, 0, 0, 0)yy(0, 115, 0, 0, 0, 0, 0)yy(0, 116, 0, 0, 0, 0, 0)yy(0, 117, 0, 0, 0, 0, 0)yy(0, 118, 0, 0, 0, 0, 0)yy(0, 119, 0, 0, 0, 0, 0)yy(0, 120, 0, 0, 0, 0, 0)yy(0, 121, 0, 0, 0, 0, 0)yy(0, 122, 0, 0, 0, 0, 0)yy(0, 123, 0, 0, 0, IF, "{")yy(0, 124, 6, BOR, bittree,'|', "|")yy(0, 125, 0, 0, 0, '}', "}")yy(0, 126, 0, BCOM, 0, ID, "~")xx(EOI, 127, 0, 0, 0, EOI, "end of input")#undef xx#undef yy从上面的头文件中可以看出,这是个类似表的结构,按照列的不同处理不同的部分,
下面来看一下使用的部分,这六个数据结构需要比较熟悉,不然会对代码的理解产生干扰
//使用地:c.h//作用:声明操作符枚举,使用了表的第一二两列enum {#define xx(a,b,c,d,e,f,g) a=b,#define yy(a,b,c,d,e,f,g)#include "token.h"}//预处理之后就变成了下面的样子,//建议将这个表处理成以下这个形式,便于代码阅读enum {FLOAT = 1, DOUBLE = 2,CHAR = 3,SHORT = 4,INT = 5,UNSIGNED = 6,POINTER = 7,VOID = 8,STRUCT = 9,UNION = 10, FUNCTION = 11, ARRAY = 12, ENUM = 13, LONG = 14, CONST = 15, VOLATILE = 16, ID = 32,FCON = 34,ICON = 35, SCON = 36,INCR = 39,DECR = 48,DEREF = 49,ANDAND = 50,OROR = 51,LEQ = 52,EQL = 53,NEQ = 54,GEQ = 55,RSHIFT = 56,LSHIFT = 57,ELLIPSIS = 64,SIZEOF = 65,AUTO = 67,BREAK = 68,CASE = 69,CONTINUE = 70,DEFAULT = 71,DO = 72,ELSE = 73,EXTERN = 74,FOR = 75,GOTO = 76,IF = 77,REGISTER = 78,RETURN = 79,SIGNED = 80,STATIC = 81,SWITCH = 82,TYPEDEF = 83,WHILE = 84,TYPECODE = 85,FIRSTARG = 86,EOI = 127,LAST};//使用地:enode.c//作用:创建“创建树的函数指针的数组”,即表中的倒数第三列Tree (*optree[])(int, Tree, Tree) = {#define xx(a,b,c,d,e,f,g) e,#define yy(a,b,c,d,e,f,g) e,#include "token.h"};//使用地:error.c//作用:创建单词集合数组,倒数第二列char kind[] = {#define xx(a,b,c,d,e,f,g) f,#define yy(a,b,c,d,e,f,g) f,#include "token.h"};//使用地:expr.c//作用:创建操作符的优先级数组static char prec[] = {#define xx(a,b,c,d,e,f,g) c,#define yy(a,b,c,d,e,f,g) c,#include "token.h"};//作用:创建通用操作符数组static int oper[] = {#define xx(a,b,c,d,e,f,g) d,#define yy(a,b,c,d,e,f,g) d,#include "token.h"};//使用地:output.c//作用:创建词素的字符串数组static char *tokens[] = {#define xx(a,b,c,d,e,f,g) g,#define yy(a,b,c,d,e,f,g) g,#include "token.h"};
0 0
- lcc 源代码解析之token.h
- lcc源代码解析之interface
- lcc源代码解析之sym.c
- lcc源代码解析之string.c
- lcc源代码解析之types.c
- lcc源代码解析之alloc.c
- lcc源代码解析之input.c
- lcc源代码解析之lex.c
- lcc源代码解析之expr.c
- lcc源代码解析之stat.c
- lcc源代码解析之tree.c
- lcc源代码解析之dag.c
- lcc源代码解析之gen.c
- lcc源代码解析之x86后端
- lcc源代码详解之概述
- lcc源代码详解之介绍
- lcc源代码详解之介绍
- lcc源代码详解之概述
- linux下mkisofs制作光盘映像cdrecord刻录光盘
- HashMap Hashtable LinkedHashMap和TreeMap区别
- CentOS 7 创建本地和网络yum源
- MapReduce初级案例(3):使用MapReduce实现平均成绩
- UVA - 11384 - Help is needed for Dexter (找规律!!)
- lcc 源代码解析之token.h
- NSIS进阶教程(一)~(五)
- 文本的两种格式---dos和unix
- (转)WPF控件开源资源
- vim画ASCII图
- nohup-真正的Shell后台运行
- Linux系统下如何删除某个目录下大量文件
- 【编程语言】进程中栈空间的参数返回值以及局部变量的分布
- JSON参数