?? parse.cpp
字號:
/* 功 能 函數聲明中參數聲明部分的處理函數 */
/* 產生式 < paramDecList > ::= param paramMore */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * paramDecList(void)
{
TreeNode * t = param();
TreeNode * p = paramMore();
if (p!=NULL)
{
t->sibling = p;
}
return t;
}
/********************************************************************/
/* 函數名 paramMore */
/* 功 能 函數聲明中參數聲明部分的處理函數 */
/* 產生式 < paramMore > ::= ε | ; paramDecList */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * paramMore(void)
{
TreeNode * t = NULL;
switch(token.Lex)
{
case RPAREN: break;
case SEMI:
match(SEMI);
t = paramDecList();
if (t==NULL)
syntaxError("a param declaration is request!");
break;
default:
ReadNextToken(&token);
syntaxError("unexpected token is here!");
break;
}
return t;
}
/********************************************************************/
/* 函數名 param */
/* 功 能 函數聲明中參數聲明部分的處理函數 */
/* 產生式 < param > ::= typeName formList | VAR typeName formList */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * param(void)
{
TreeNode * t = newDecNode();
if (t!=NULL)
{
t->lineno = line0;
switch(token.Lex)
{
case INTEGER:
case CHAR:
case ARRAY:
case RECORD:
case ID:
t->attr.ProcAttr.paramt = valparamType;
typeName(t);
formList(t);
break;
case VAR:
match(VAR);
t->attr.ProcAttr.paramt = varparamType;
typeName(t);
formList(t);
break;
default:
ReadNextToken(&token);
syntaxError("unexpected token is here!");
break;
}
}
return t;
}
/********************************************************************/
/* 函數名 formList */
/* 功 能 函數聲明中參數聲明部分的處理函數 */
/* 產生式 < formList > ::= id fidMore */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
void formList(TreeNode * t)
{
if (token.Lex==ID)
{
strcpy(t->name[(t->idnum)] ,token.Sem);
t->idnum = (t->idnum) + 1;
match(ID);
}
fidMore(t);
}
/********************************************************************/
/* 函數名 fidMore */
/* 功 能 函數聲明中參數聲明部分的處理函數 */
/* 產生式 < fidMore > ::= ε | , formList */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
void fidMore(TreeNode * t)
{
switch(token.Lex)
{
case SEMI:
case RPAREN: break;
case COMMA:
match(COMMA);
formList(t);
break;
default:
ReadNextToken(&token);
syntaxError("unexpected token is here!");
break;
}
}
/********************************************************************/
/* 函數名 procDecPart */
/* 功 能 函數中的聲明部分的處理函數 */
/* 產生式 < procDecPart > ::= declarePart */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * procDecPart(void)
{
TreeNode * t = declarePart();
return t;
}
/********************************************************************/
/* 函數名 procBody */
/* 功 能 函數體部分的處理函數 */
/* 產生式 < procBody > ::= programBody */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * procBody(void)
{
TreeNode * t = programBody();
if (t==NULL)
syntaxError("a program body is requested!");
return t;
}
/********************************************************************/
/* 函數名 programBody */
/* 功 能 程序體部分的處理函數 */
/* 產生式 < programBody > ::= BEGIN stmList END */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * programBody(void)
{
TreeNode * t = newStmlNode();
match(BEGIN);
if(t!=NULL)
{
t->lineno = 0;
t->child[0] = stmList();
}
match(END);
return t;
}
/********************************************************************/
/* 函數名 stmList */
/* 功 能 語句部分的處理函數 */
/* 產生式 < stmList > ::= stm stmMore */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * stmList(void)
{
TreeNode * t = stm();
TreeNode * p = stmMore();
if(t!=NULL)
if ( p!= NULL)
t->sibling = p;
return t;
}
/********************************************************************/
/* 函數名 stmMore */
/* 功 能 語句部分的處理函數 */
/* 產生式 < stmMore > ::= ε | ; stmList */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * stmMore(void)
{
TreeNode * t = NULL;
switch(token.Lex)
{
case ELSE:
case FI:
case END:
case ENDWH: break;
case SEMI:
match(SEMI);
t = stmList();
break;
default:
ReadNextToken(&token);
syntaxError("unexpected token is here!");
break;
}
return t;
}
/********************************************************************/
/* 函數名 stm */
/* 功 能 語句部分的處理函數 */
/* 產生式 < stm > ::= conditionalStm {IF} */
/* | loopStm {WHILE} */
/* | inputStm {READ} */
/* | outputStm {WRITE} */
/* | returnStm {RETURN} */
/* | id assCall {id} */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * stm(void)
{
TreeNode * t = NULL;
switch(token.Lex)
{
case IF:
t = conditionalStm();
break;
case WHILE:
t = loopStm();
break;
case READ:
t = inputStm();
break;
case WRITE:
t = outputStm();
break;
case RETURN:
t = returnStm();
break;
case ID:
temp_name = copyString(token.Sem);
match(ID);
t = assCall();
break;
default:
ReadNextToken(&token);
syntaxError("unexpected token is here!");
break;
}
return t;
}
/********************************************************************/
/* 函數名 assCall */
/* 功 能 語句部分的處理函數 */
/* 產生式 < assCall > ::= assignmentRest {:=,LMIDPAREN,DOT} */
/* | callStmRest {(} */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * assCall(void)
{
TreeNode * t = NULL;
switch(token.Lex)
{
case ASSIGN:
case LMIDPAREN:
case DOT:
t = assignmentRest();
break;
case LPAREN:
t = callStmRest();
break;
default:
ReadNextToken(&token);
syntaxError("unexpected token is here!");
break;
}
return t;
}
/********************************************************************/
/* 函數名 assignmentRest */
/* 功 能 賦值語句部分的處理函數 */
/* 產生式 < assignmentRest > ::= variMore : = exp */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * assignmentRest(void)
{
TreeNode * t = newStmtNode(AssignK);
/* 賦值語句節點的第一個兒子節點記錄賦值語句的左側變量名,*
/* 第二個兒子結點記錄賦值語句的右側表達式*/
if(t!=NULL)
{
t->lineno = line0;
/*處理第一個兒子結點,為變量表達式類型節點*/
TreeNode * child1 = newExpNode(VariK);
if(child1!=NULL)
{
child1->lineno = line0;
strcpy(child1->name[0],temp_name);
(child1->idnum)++;
variMore(child1);
t->child[0] = child1;
}
/*賦值號匹配*/
match(ASSIGN);
/*處理第二個兒子節點*/
t->child[1] = exp();
}
return t;
}
/********************************************************************/
/* 函數名 conditionalStm */
/* 功 能 條件語句部分的處理函數 */
/* 產生式 < conditionalStm > ::= IF exp THEN stmList ELSE stmList FI*/
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * conditionalStm(void)
{
TreeNode * t = newStmtNode(IfK);
match(IF);
if(t!=NULL)
{
t->lineno = line0;
t->child[0] = exp();
}
match(THEN);
if(t!=NULL) t->child[1] = stmList();
if(token.Lex==ELSE)
{
match(ELSE);
if(t!=NULL)
t->child[2] = stmList();
}
match(FI);
return t;
}
/********************************************************************/
/* 函數名 loopStm */
/* 功 能 循環語句部分的處理函數 */
/* 產生式 < loopStm > ::= WHILE exp DO stmList ENDWH */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * loopStm(void)
{
TreeNode * t = newStmtNode(WhileK);
match(WHILE);
if (t!=NULL)
{
t->lineno = line0;
t->child[0] = exp();
match(DO);
t->child[1] = stmList();
match(ENDWH);
}
return t;
}
/********************************************************************/
/* 函數名 inputStm */
/* 功 能 輸入語句部分的處理函數 */
/* 產生式 < inputStm > ::= READ(id) */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * inputStm(void)
{
TreeNode * t = newStmtNode(ReadK);
match(READ);
match(LPAREN);
if((t!=NULL)&&(token.Lex==ID))
{
t->lineno = line0;
strcpy(t->name[0] ,token.Sem);
(t->idnum)++;
}
match(ID);
match(RPAREN);
return t;
}
/********************************************************************/
/* 函數名 outputStm */
/* 功 能 輸出語句部分的處理函數 */
/* 產生式 < outputStm > ::= WRITE(exp) */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * outputStm(void)
{
TreeNode * t = newStmtNode(WriteK);
match(WRITE);
match(LPAREN);
if(t!=NULL)
{
t->lineno = line0;
t->child[0] = exp();
}
match(RPAREN);
return t;
}
/********************************************************************/
/* 函數名 returnStm */
/* 功 能 返回語句部分的處理函數 */
/* 產生式 < returnStm > ::= RETURN */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * returnStm(void)
{
TreeNode * t = newStmtNode(ReturnK);
match(RETURN);
if(t!=NULL)
t->lineno = line0;
return t;
}
/********************************************************************/
/* 函數名 callStmRest */
/* 功 能 函數調用語句部分的處理函數 */
/* 產生式 < callStmRest > ::= (actParamList) */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * callStmRest(void)
{
TreeNode * t=newStmtNode(CallK);
match(LPAREN);
/*函數調用時,其子節點指向實參*/
if(t!=NULL)
{
t->lineno = line0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -