?? scanner.cpp
字號:
/* 當(dāng)前字符c為"=",當(dāng)前識別單詞返回值currentToken設(shè)置為等號單詞EQ */
case '=':
currentToken.Lex = EQ;
break;
/* 當(dāng)前字符c為"<",當(dāng)前識別單詞返回值currentToken設(shè)置為小于單詞LT */
case '<':
currentToken.Lex = LT;
break;
/* 當(dāng)前字符c為"+",當(dāng)前識別單詞返回值currentToken設(shè)置為加號單詞PLUS */
case '+':
currentToken.Lex = PLUS;
break;
/* 當(dāng)前字符c為"-",當(dāng)前識別單詞返回值currentToken設(shè)置為減號單詞MINUS */
case '-':
currentToken.Lex = MINUS;
break;
/* 當(dāng)前字符c為"*",當(dāng)前識別單詞返回值currentToken設(shè)置為乘號單詞TIMES */
case '*':
currentToken.Lex = TIMES;
break;
/* 當(dāng)前字符c為"/",當(dāng)前識別單詞返回值currentToken設(shè)置為除號單詞OVER */
case '/':
currentToken.Lex = OVER;
/* 當(dāng)前字符c為"(",當(dāng)前識別單詞返回值currentToken設(shè)置為左括號單詞LPAREN */
case '(':
currentToken.Lex = LPAREN;
break;
/* 當(dāng)前字符c為")",當(dāng)前識別單詞返回值currentToken設(shè)置為右括號單詞RPAREN */
case ')':
currentToken.Lex = RPAREN;
break;
/* 當(dāng)前字符c為";",當(dāng)前識別單詞返回值currentToken設(shè)置為分號單詞SEMI */
case ';':
currentToken.Lex = SEMI;
break;
/* 當(dāng)前字符c為",",當(dāng)前識別單詞返回值currentToken設(shè)置為逗號單詞COMMA */
case ',':
currentToken.Lex = COMMA;
break;
/* 當(dāng)前字符c為"[",當(dāng)前識別單詞返回值currentToken設(shè)置為左中括號單詞LMIDPAREN */
case '[':
currentToken.Lex = LMIDPAREN;
break;
/* 當(dāng)前字符c為"]",當(dāng)前識別單詞返回值currentToken設(shè)置為右中括號單詞RMIDPAREN */
case ']':
currentToken.Lex = RMIDPAREN;
break;
/* 當(dāng)前字符c為其它字符,當(dāng)前識別單詞返回值currentToken設(shè)置為錯誤單詞ERROR */
default:
currentToken.Lex = ERROR;
Error = TRUE;
break;
}
}
break;
/********** 當(dāng)前狀態(tài)為開始狀態(tài)START的處理結(jié)束 **********/
/* 當(dāng)前DFA狀態(tài)state為注釋狀態(tài)INCOMMENT,確定性有限自動機(jī)DFA處于注釋位置 */
case INCOMMENT:
/* 當(dāng)前字符存儲狀態(tài)save設(shè)置為FALSE,注釋中內(nèi)容不生成單詞,無需存儲 */
save = FALSE;
/* 當(dāng)前字符c為EOF,當(dāng)前DFA狀態(tài)state設(shè)置為完成狀態(tài)DONE,當(dāng)前單詞識別結(jié)束 *
* 當(dāng)前識別單詞返回值currentToken設(shè)置為文件結(jié)束單詞ENDFILE */
if (c == EOF)
{ state = DONE;
currentToken.Lex = ENDFILE;
}
/* 當(dāng)前字符c為"}",注釋結(jié)束.當(dāng)前DFA狀態(tài)state設(shè)置為開始狀態(tài)START */
else if (c == '}') state = START;
break;
/* 當(dāng)前DFA狀態(tài)state為賦值狀態(tài)INASSIGN,確定性有限自動機(jī)DFA處于賦值單詞位置 */
case INASSIGN:
/* 當(dāng)前DFA狀態(tài)state設(shè)置為完成狀態(tài)DONE,賦值單詞結(jié)束 */
state = DONE;
/* 當(dāng)前字符c為"=",當(dāng)前識別單詞返回值currentToken設(shè)置為賦值單詞ASSIGN */
if (c == '=')
currentToken.Lex = ASSIGN;
/* 當(dāng)前字符c為其它字符,即":"后不是"=",在輸入行緩沖區(qū)中回退一個字符 *
* 字符存儲狀態(tài)save設(shè)置為FALSE,當(dāng)前識別單詞返回值currentToken設(shè)置為ERROR */
else
{
ungetNextChar();
save = FALSE;
currentToken.Lex = ERROR;
Error = TRUE;
}
break;
case INRANGE:
/* 當(dāng)前DFA狀態(tài)state設(shè)置為完成狀態(tài)DONE,賦值單詞結(jié)束 */
state = DONE;
/* 當(dāng)前字符c為".",當(dāng)前識別單詞返回值currentToken設(shè)置為下標(biāo)界UNDERANGE */
if (c == '.')
currentToken.Lex = UNDERANGE;
/* 當(dāng)前字符c為其它字符,即"."后不是".",在輸入行緩沖區(qū)中回退一個字符 *
* 字符存儲狀態(tài)save設(shè)置為FALSE,當(dāng)前識別單詞返回值currentToken設(shè)置為ERROR */
else
{
ungetNextChar();
save = FALSE;
currentToken.Lex = DOT;
}
break;
/* 當(dāng)前DFA狀態(tài)state為數(shù)字狀態(tài)INNUM,確定性有限自動機(jī)處于數(shù)字單詞位置 */
case INNUM:
/* 當(dāng)前字符c不是數(shù)字,則在輸入行緩沖區(qū)源中回退一個字符 *
* 字符存儲標(biāo)志設(shè)置為FALSE,當(dāng)前DFA狀態(tài)state設(shè)置為DONE,數(shù)字單詞識別完成 *
* 當(dāng)前識別單詞返回值currentToken設(shè)置為數(shù)字單詞NUM */
if (!isdigit(c))
{
ungetNextChar();
save = FALSE;
state = DONE;
currentToken.Lex = INTC;
}
break;
/*當(dāng)前DFA狀態(tài)state為字符標(biāo)志狀態(tài)INCHAR,確定有限自動機(jī)處于字符標(biāo)志狀態(tài)*/
case INCHAR:
if (isalnum(c))
{ int c1=getNextChar();
if (c1 =='\'')
{ save = TRUE;
state = DONE;
currentToken.Lex = CHARC;
}
else
{ ungetNextChar();
ungetNextChar();
state = DONE;
currentToken.Lex = ERROR;
Error = TRUE;
}
}
else
{ ungetNextChar();
state = DONE;
currentToken.Lex = ERROR;
Error = TRUE;
}
break;
/* 當(dāng)前DFA狀態(tài)state為標(biāo)識符狀態(tài)INID,確定性有限自動機(jī)DFA處于標(biāo)識符單詞位置 */
case INID:
/* 當(dāng)前字符c不是字母,則在輸入行緩沖區(qū)源中回退一個字符 *
* 字符存儲標(biāo)志設(shè)置為FALSE,當(dāng)前DFA狀態(tài)state設(shè)置為DONE,標(biāo)識符單詞識別完成 *
* 當(dāng)前識別單詞返回值currentToken設(shè)置為標(biāo)識符單詞ID */
if (!isalnum(c))
{
ungetNextChar();
save = FALSE;
state = DONE;
currentToken.Lex = ID;
}
break;
/* 當(dāng)前DFA狀態(tài)state為完成狀態(tài)DONE,確定性有限自動機(jī)DFA處于單詞結(jié)束位置 */
case DONE: break;
/* 當(dāng)前DFA狀態(tài)state為其它狀態(tài),此種情況不應(yīng)發(fā)生 */
default:
/* 將詞法掃描器產(chǎn)生錯誤的狀態(tài)state寫入列表文件listing *
* 當(dāng)前DFA狀態(tài)state設(shè)置為完成狀態(tài)DONE *
* 當(dāng)前識別單詞返回值currentToken設(shè)置為錯誤單詞ERROR */
fprintf(listing,"Scanner Bug: state= %d\n",state);
Error = TRUE;
state = DONE;
currentToken.Lex = ERROR;
break;
}
/*************** 分類判斷處理結(jié)束 *******************/
/* 當(dāng)前字符存儲狀態(tài)save為TRUE,且當(dāng)前正識別單詞已經(jīng)識別部分未超過單詞最大長度 *
* 將當(dāng)前字符c寫入當(dāng)前正識別單詞詞元存儲區(qū)tokenString */
if ((save) && (tokenStringIndex <= MAXTOKENLEN))
tokenString[tokenStringIndex++] = (char) c;
if (state == DONE)
{
/* 當(dāng)前DFA狀態(tài)state為完成狀態(tài)DONE,單詞識別完成 *
* 當(dāng)前識別單詞詞元存儲區(qū)tokenString加上結(jié)束標(biāo)志 */
tokenString[tokenStringIndex] = '\0';
/* 當(dāng)前單詞currentToken為標(biāo)識符單詞類型,查看其是否為保留字單詞 */
if (currentToken.Lex == ID)
{
currentToken.Lex = reservedLookup(tokenString);
if (currentToken.Lex != ID)
strcpy(tokenString,tokenString);
}
}
}
/**************** 循環(huán)處理結(jié)束 ********************/
/*將行號信息存入Token*/
currentToken.lineshow = lineno;
/*將單詞的語義信息存入Token*/
strcpy(currentToken.Sem , tokenString);
/*將已處理完的當(dāng)前Token存入鏈表的Token部分*/
((*currentNode).Token).lineshow=currentToken.lineshow;
((*currentNode).Token).Lex=currentToken.Lex;
strcpy(((*currentNode).Token).Sem,currentToken.Sem);
Tokennum++; /*Token總數(shù)目加1*/
/*若不是第一個結(jié)點(diǎn),則將當(dāng)前結(jié)點(diǎn)連入鏈表*/
if (preNode!=currentNode)
{
preNode->nextToken=currentNode;
preNode=currentNode;
}
/*申請一個新的結(jié)點(diǎn),以記錄下一個Token的信息*/
currentNode=(ChainNodeType *)malloc(CHAINNODELEN);
/*初始化這個結(jié)點(diǎn)中,指向下一個結(jié)點(diǎn)的指針為空*/
currentNode->nextToken=NULL;
}
/* 直到處理完表示文件結(jié)束的Token:ENDFILE,說明處理完所有的Token*/
/* 并存入了鏈表中,循環(huán)結(jié)束*/
while ((currentToken.Lex)!=ENDFILE);
/*將由chainHead指向的Token鏈表存入文件"Tokenlist"中*/
ChainToFile(chainHead);
/*釋放鏈表*/
while (chainHead!=NULL)
{
tempNode=chainHead->nextToken;
free(chainHead);
chainHead=tempNode;
}
}
/* 詞法分析函數(shù)結(jié)束 */
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -