状态1();
if(ISTOKTYPE(ID)) //ISTOKTYPE是在global.h里定义的一个宏,用来判断当前节点的token类型是否是一个ID标示符。
{
p = curnode; //如果是标示符,就将当前节点设为父节点,并将state设为INID 状态机的枚举值。下一次循环switch case时就会进入INID的程式。
state = INID;
}
else if(ISTOKTYPEOR(TIMES,DIVIDE)) //ISTOKTYPEOR也是global.h里定义的宏,可以带两个参数,如果当前节点curnode是乘或除运算符,就将IsMidTim_Div设为TRUE,再设置父节点和state状态机。
{
IsMidTim_Div = TRUE;
p = curnode;
state = INTIME_DIVIDE;
}
else if(ISTOKTYPE(LBRACKET))
{
if(ISTOKTYPEXOR(curnode+1,ID,LBRACKET)) //如果当前节点是左括号,且左括号后面的节点是标示符或者左括号,就先将括号里的表达式生成AST。
{
tmpnode = curnode;
p = express(); //将括号里的表达式生成AST,并返回该AST的父节点
if(!ISTOKTYPE(RBRACKET)) //每个左括号都对应一个右括号,否则产生语法错误
myexit("syntax error start no right bracket"); //语法错误:没有右括号的英文提示。
else if(ISTOKTYPEXOR(tmpnode-1,ASSIGN,LBRACKET)) //如果左括号的左边是赋值运算符或者左括号,就将括号表达式的AST的父节点当做ID标示符,并进入INID的程式处理,而不返回。
state = INID;
else //其他的情况下说明括号在中间,就返回。
state = DOWN;
}
else
myexit("syntax error left bracket"); //如果左括号的后面一个节点不是ID标示符也不是左括号,就产生语法错误。
}
else
myexit("syntax error start"); //其他情况下产生start状态的语法错误。