?? parse.cpp
字號:
/********************************************************************/
void baseType(TreeNode * t)
{
switch(token.Lex)
{
case INTEGER: match(INTEGER);
t->kind.dec = IntegerK;
break;
case CHAR: match(CHAR);
t->kind.dec = CharK;
break;
default:
ReadNextToken(&token);
syntaxError("unexpected token is here!");
break;
}
}
/********************************************************************/
/* 函數名 structureType */
/* 功 能 類型聲明部分的處理函數 */
/* 產生式 < structureType > ::= arrayType | recType */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
void structureType(TreeNode * t)
{
switch(token.Lex)
{
case ARRAY:
arrayType(t);
break;
case RECORD:
t->kind.dec = RecordK;
recType(t);
break;
default:
ReadNextToken(&token);
syntaxError("unexpected token is here!");
break;
}
}
/********************************************************************/
/* 函數名 arrayType */
/* 功 能 類型聲明部分的處理函數 */
/* 產生式 < arrayType > ::= ARRAY [low..top] OF baseType */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
void arrayType(TreeNode * t)
{
match(ARRAY);
match(LMIDPAREN);
if (token.Lex==INTC)
{
t->attr.ArrayAttr.low = atoi(token.Sem);
}
match(INTC);
match(UNDERANGE);
if (token.Lex==INTC)
{
t->attr.ArrayAttr.up = atoi(token.Sem);
}
match(INTC);
match(RMIDPAREN);
match(OF);
baseType(t);
t->attr.ArrayAttr.childtype = t->kind.dec;
t->kind.dec = ArrayK;
}
/********************************************************************/
/* 函數名 recType */
/* 功 能 類型聲明部分的處理函數 */
/* 產生式 < recType > ::= RECORD fieldDecList END */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
void recType(TreeNode * t)
{
TreeNode * p = NULL;
match(RECORD);
p = fieldDecList();
if(p!=NULL)
t->child[0] = p;
else
syntaxError("a record body is requested!");
match(END);
}
/********************************************************************/
/* 函數名 fieldDecList */
/* 功 能 類型聲明部分的處理函數 */
/* 產生式 < fieldDecList > ::= baseType idList ; fieldDecMore */
/* | arrayType idList; fieldDecMore */
/*說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * fieldDecList(void)
{
TreeNode * t = newDecNode();
TreeNode * p = NULL;
if (t!=NULL)
{
t->lineno = line0;
switch(token.Lex)
{
case INTEGER:
case CHAR:
baseType(t);
idList(t);
match(SEMI);
p = fieldDecMore();
break;
case ARRAY:
arrayType(t);
idList(t);
match(SEMI);
p = fieldDecMore();
break;
default:
ReadNextToken(&token);
syntaxError("unexpected token is here!");
break;
}
t->sibling = p;
}
return t;
}
/********************************************************************/
/* 函數名 fieldDecMore */
/* 功 能 類型聲明部分的處理函數 */
/* 產生式 < fieldDecMore > ::= ε | fieldDecList */
/*說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * fieldDecMore(void)
{
TreeNode * t = NULL;
switch(token.Lex)
{
case END: break;
case INTEGER:
case CHAR:
case ARRAY:
t=fieldDecList();
break;
default:
ReadNextToken(&token);
syntaxError("unexpected token is here!");
break;
}
return t;
}
/********************************************************************/
/* 函數名 idList */
/* 功 能 類型聲明部分的處理函數 */
/* 產生式 < idList > ::= id idMore */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
void idList(TreeNode * t)
{
if (token.Lex==ID)
{
strcpy(t->name[(t->idnum)] ,token.Sem);
match(ID);
t->idnum = (t->idnum) + 1;
}
idMore(t);
}
/********************************************************************/
/* 函數名 idMore */
/* 功 能 類型聲明部分的處理函數 */
/* 產生式 < idMore > ::= ε | , idList */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
void idMore(TreeNode * t)
{
switch(token.Lex)
{
case SEMI: break;
case COMMA:
match(COMMA);
idList(t);
break;
default:
ReadNextToken(&token);
syntaxError("unexpected token is here!");
break;
}
}
/**************************變量聲明部分******************************/
/********************************************************************/
/* 函數名 varDec */
/* 功 能 變量聲明部分的處理函數 */
/* 產生式 < varDec > ::= ε | varDeclaration */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * varDec(void)
{
TreeNode * t = NULL;
switch(token.Lex)
{
case PROCEDURE:
case BEGIN: break;
case VAR:
t = varDeclaration();
break;
default:
ReadNextToken(&token);
syntaxError("unexpected token is here!");
break;
}
return t;
}
/********************************************************************/
/* 函數名 varDeclaration */
/* 功 能 變量聲明部分的處理函數 */
/* 產生式 < varDeclaration > ::= VAR varDecList */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * varDeclaration(void)
{
match(VAR);
TreeNode * t = varDecList();
if(t==NULL)
syntaxError("a var declaration is expected!");
return t;
}
/********************************************************************/
/* 函數名 varDecList */
/* 功 能 變量聲明部分的處理函數 */
/* 產生式 < varDecList > ::= typeName varIdList; varDecMore */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * varDecList(void)
{
TreeNode * t = newDecNode();
TreeNode * p = NULL;
if ( t != NULL )
{
t->lineno = line0;
typeName(t);
varIdList(t);
match(SEMI);
p = varDecMore();
t->sibling = p;
}
return t;
}
/********************************************************************/
/* 函數名 varDecMore */
/* 功 能 變量聲明部分的處理函數 */
/* 產生式 < varDecMore > ::= ε | varDecList */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * varDecMore(void)
{
TreeNode * t =NULL;
switch(token.Lex)
{
case PROCEDURE:
case BEGIN:
break;
case INTEGER:
case CHAR:
case ARRAY:
case RECORD:
case ID:
t = varDecList();
break;
default:
ReadNextToken(&token);
syntaxError("unexpected token is here!");
break;
}
return t;
}
/********************************************************************/
/* 函數名 varIdList */
/* 功 能 變量聲明部分的處理函數 */
/* 產生式 < varIdList > ::= id varIdMore */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
void varIdList(TreeNode * t)
{
if (token.Lex==ID)
{
strcpy(t->name[(t->idnum)] ,token.Sem);
match(ID);
t->idnum =(t->idnum ) + 1;
}
else
{
syntaxError("a varid is expected here!");
ReadNextToken(&token);
}
varIdMore(t);
}
/********************************************************************/
/* 函數名 varIdMore */
/* 功 能 變量聲明部分的處理函數 */
/* 產生式 < varIdMore > ::= ε | , varIdList */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
void varIdMore(TreeNode * t)
{
switch(token.Lex)
{
case SEMI: break;
case COMMA:
match(COMMA);
varIdList(t);
break;
default:
ReadNextToken(&token);
syntaxError("unexpected token is here!");
break;
}
}
/****************************過程聲明部分****************************/
/********************************************************************/
/* 函數名 procDec */
/* 功 能 函數聲明部分的處理函數 */
/* 產生式 < procDec > ::= ε | procDeclaration */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
TreeNode * procDec(void)
{
TreeNode * t = NULL;
switch(token.Lex)
{
case BEGIN: break;
case PROCEDURE:
t = procDeclaration();
break;
default:
ReadNextToken(&token);
syntaxError("unexpected token is here!");
break;
}
return t;
}
/********************************************************************/
/* 函數名 procDeclaration */
/* 功 能 函數聲明部分的處理函數 */
/* 產生式 < procDeclaration > ::= PROCEDURE */
/* ProcName(paramList); */
/* procDecPart */
/* procBody */
/* procDec */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/* 函數的根節點用于記錄該函數的名字;第一個子節點指向參數節 */
/* 點,第二個節點指向函數中的聲明部分節點;第三個節點指向函 */
/* 數體。
/********************************************************************/
TreeNode * procDeclaration(void)
{
TreeNode * t = newProcNode();
match(PROCEDURE);
if (t!=NULL)
{
t->lineno = line0;
if (token.Lex==ID)
{
strcpy(t->name[0],token.Sem);
(t->idnum)++;
match(ID);
}
match(LPAREN);
paramList(t);
match(RPAREN);
match(SEMI);
t->child[1] = procDecPart();
t->child[2] = procBody();
t->sibling = procDec();
}
return t;
}
/********************************************************************/
/* 函數名 paramList */
/* 功 能 函數聲明中參數聲明部分的處理函數 */
/* 產生式 < paramList > ::= ε | paramDecList */
/* 說 明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點 */
/********************************************************************/
void paramList(TreeNode * t)
{
TreeNode * p = NULL;
switch(token.Lex)
{
case RPAREN: break;
case INTEGER:
case CHAR:
case ARRAY:
case RECORD:
case ID:
case VAR:
p = paramDecList();
t->child[0] = p;
break;
default:
ReadNextToken(&token);
syntaxError("unexpected token is here!");
break;
}
}
/********************************************************************/
/* 函數名 paramDecList */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -