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