主要的数据结构是一个堆栈,我们从左向右读取,把各个标记依次压入堆栈,直到读到标识符为止然后我们继续向右读入一个标记,也就是标识符右边的那个标记。接着,观察标识符左边的那个标记(需要从堆栈中弹出)。
struct token {
char type;
char string[MAXTOKENLEN];
};
/*保存第一个标识之前的所有标记*/
struct token stack[MAXTOKENS];
/*保存刚读入的那个标记*/
struct token this;
/*伪码如下:
实用程序-------------*/
classify_string(字符串分类)
/*
*查看当前的标记,
*通过this.type返回一个值,内容为"type"(类型),
*"qualifier"(限定符)或"identifier"标识符
*/
gettoken(取标记);
/*
*把下一个标记读入this.string
*如果是字母数字组合,调用classify_string
*否则,它必是一个单字符标记,this.type = 该标记;
*用一个nul结束this.string
*/
read_to_first_identifier(读至第一个标识符)
/*
*调用gettoken,并把标记压入到堆栈中,直到遇到第一个标识符
*Print"identifier is"(标识符是), this.string
*继续调用gettoken
*/
//解析程序
deal_with_function_args(处理函数参数)
//当读取越过右括号')'后,打印"函数返回"
deal_with_arrays(处理函数数组)
//当你读取"[size]"后,将其打印并继续向右读取。
deal_with_any_pointers(处理任何指针)
//当你从堆栈中读取"*"时,打印"指向...的指针"并将其弹出堆栈。
deal_with_declarator(处理声明器)
if this.type is '[' deal_with_arrays
if this.type is '(' deal_with_function_args
deal_with_any_pointers
while 堆栈里还有东西
if 它是一个左括号'('