📄 linetok.cpp
字号:
if(current=='0')
{
strcpy((*tptr).text,"$D10");
(*tptr).type = TOK_DBL_REG;
(*tptr).val = $D10;
}
else
{
strcpy((*tptr).text,"$D1");
(*tptr).type = TOK_DBL_REG;
(*tptr).val = $D1;
goBackOneChar();
}
}break;
case '2':
{
strcpy((*tptr).text,"$D2");
(*tptr).type = TOK_DBL_REG;
(*tptr).val = $D2;
}break;
case '3':
{
strcpy((*tptr).text,"$D3");
(*tptr).type = TOK_DBL_REG;
(*tptr).val = $D3;
}break;
case '4':
{
strcpy((*tptr).text,"$D4");
(*tptr).type = TOK_DBL_REG;
(*tptr).val = $D4;
}break;
case '5':
{
strcpy((*tptr).text,"$D5");
(*tptr).type = TOK_DBL_REG;
(*tptr).val = $D5;
}break;
case '6':
{
strcpy((*tptr).text,"$D6");
(*tptr).type = TOK_DBL_REG;
(*tptr).val = $D6;
}break;
case '7':
{
strcpy((*tptr).text,"$D7");
(*tptr).type = TOK_DBL_REG;
(*tptr).val = $D7;
}break;
case '8':
{
strcpy((*tptr).text,"$D8");
(*tptr).type = TOK_DBL_REG;
(*tptr).val = $D8;
}break;
case '9':
{
strcpy((*tptr).text,"$D9");
(*tptr).type = TOK_DBL_REG;
(*tptr).val = $D9;
}break;
default: /* not 0-9*/
{
(*tptr).text[0]='$';
(*tptr).text[1]='D';
(*tptr).text[2]=current;
(*tptr).text[3]='\0';
(*tptr).type = TOK_BAD;
}
}/*end of $D switch*/
}break;
/*end case D*/
case 'I':
case 'i':
{
current = getNextLineChar();
if((current=='P')||(current=='p'))
{
strcpy((*tptr).text,"$IP");
(*tptr).type = TOK_INT_REG;
(*tptr).val = $IP;
}
else
{
(*tptr).text[0]='$';
(*tptr).text[1]='I';
(*tptr).text[2]=current;
(*tptr).text[3]='\0';
(*tptr).type = TOK_BAD;
}
}break;
case 'B':
case 'b':
{
current = getNextLineChar();
if((current=='E')||(current=='e'))
{
strcpy((*tptr).text,"$BE");
(*tptr).type = TOK_INT_REG;
(*tptr).val = $BE;
}
else
{
(*tptr).text[0]='$';
(*tptr).text[1]='B';
(*tptr).text[2]=current;
(*tptr).text[3]='\0';
(*tptr).type = TOK_BAD;
}
}break;
case 'S':
case 's':
{
current = getNextLineChar();
if((current=='P')||(current=='p'))
{
strcpy((*tptr).text,"$SP");
(*tptr).type = TOK_INT_REG;
(*tptr).val = $SP;
}
else if((current=='S')||(current=='s'))
{
strcpy((*tptr).text,"$SS");
(*tptr).type = TOK_INT_REG;
(*tptr).val = $SS;
}
else
{
(*tptr).text[0]='$';
(*tptr).text[1]='S';
(*tptr).text[2]=current;
(*tptr).text[3]='\0';
(*tptr).type = TOK_BAD;
}
}break;
case 'H':
case 'h':
{
current = getNextLineChar();
if((current=='S')||(current=='s'))
{
strcpy((*tptr).text,"$HS");
(*tptr).type = TOK_INT_REG;
(*tptr).val = $HS;
}
else if((current=='E')||(current=='e'))
{
strcpy((*tptr).text,"$HE");
(*tptr).type = TOK_INT_REG;
(*tptr).val = $HE;
}
else
{
(*tptr).text[0]='$';
(*tptr).text[1]='H';
(*tptr).text[2]=current;
(*tptr).text[3]='\0';
(*tptr).type = TOK_BAD;
}
}break;
case 'T':
case 't':
{
current = getNextLineChar();
if((current=='o')||(current=='O'))
{
current = getNextLineChar();
if((current=='P')||(current=='p'))
{
strcpy((*tptr).text,"$TOP");
(*tptr).type = TOK_INT_REG;
(*tptr).val = $TOP;
}
else
{
(*tptr).text[0]='$';
(*tptr).text[1]='T';
(*tptr).text[2]='O';
(*tptr).text[3]=current;
(*tptr).text[4]='\0';
(*tptr).type = TOK_BAD;
}
}
else
{
(*tptr).text[0]='$';
(*tptr).text[1]='T';
(*tptr).text[2]=current;
(*tptr).text[3]='\0';
(*tptr).type = TOK_BAD;
}
}break;
default: /*NOT $R_,$F_,$D_, or $IP, $SP, $FP, $BE, $HS, $HE, $SS, $TOP*/
{
(*tptr).text[0]='$';
(*tptr).text[1]=current;
(*tptr).text[2]='\0';
(*tptr).type = TOK_BAD;
}
}/*end switch*/
return;
}/*end processRegister*/
/*-----------------------------------------------------------------*/
void LineTokenizer::processCharConst(struct Token *tptr)
{
char current;
char ch;
ch = current = getNextLineChar();
if((current>=32)&&(current<=126))
{
(*tptr).text[0]=current;
(*tptr).text[1]='\0';
(*tptr).val=current;
(*tptr).type = TOK_CHAR_CONST;
current = getNextLineChar();
if(current!='\'')
{
(*tptr).text[0]='\'';
(*tptr).text[1]=ch;
(*tptr).text[2]=current;
(*tptr).text[3]='\0';
(*tptr).type = TOK_BAD;
}
}
else
{
(*tptr).text[0]='\'';
(*tptr).text[1]=current;
(*tptr).text[2]='\0';
(*tptr).type = TOK_BAD;
}
return;
}/*end processCharConstant*/
/*-----------------------------------------------------------------*/
void LineTokenizer::processIdentifier(struct Token *tptr, char ch)
{
int i;
char current;
i=0;
(*tptr).text[i]=ch;
current = getNextLineChar();
while(((current>='a')&&(current<='z'))||
((current>='A')&&(current<='Z'))||
((current>='0')&&(current<='9'))||
(current=='@')||
(current=='_')||
(current=='?')||
(current=='.'))
{
i++;
(*tptr).text[i]=current;
current = getNextLineChar();
}
i++;
(*tptr).text[i]='\0';
(*tptr).type=TOK_IDENTIFIER;
goBackOneChar();
return;
}/*end processIdentifier*/
/*-----------------------------------------------------------------*/
void LineTokenizer::processNumConst(struct Token *tptr, char ch)
{
int i;
char current;
i=0;
current = ch;
if((current=='+')||(current=='-'))
{
(*tptr).text[i]=current;
i++;
current = getNextLineChar();
}
/* float/integer starts with 0-9 */
if((current>='0')&&(current<='9'))
{
/* if 0 is first digit, must be followed by decimal place*/
if(current=='0')
{
current = getNextLineChar();
if(current =='.')
{
current = '0';
goBackOneChar();
}
else
{
(*tptr).text[i]=current;
(*tptr).text[i+1]='\0';
(*tptr).type = TOK_INT_CONST;
return;
}
}
while((current>='0')&&(current<='9'))
{
(*tptr).text[i]=current;
i++;
current = getNextLineChar();
}
/* digits end in decimal point*/
if(current=='.')
{
(*tptr).text[i]='.';
i++;
current = getNextLineChar();
if((current>='0')&&(current<='9'))
{
while((current>='0')&&(current<='9'))
{
(*tptr).text[i]=current;
i++;
current = getNextLineChar();
}
}
else /* no digits following decimal point, required */
{
(*tptr).text[i]='\0';
(*tptr).type = TOK_BAD;
goBackOneChar();
return;
}
if((current=='e')||(current=='E'))
{
(*tptr).text[i]=current;
i++;
current = getNextLineChar();
if((current=='+')||(current=='-'))
{
(*tptr).text[i]=current;
i++;
current = getNextLineChar();
}
if((current>='0')&&(current<='9'))
{
while((current>='0')&&(current<='9'))
{
(*tptr).text[i]=current;
i++;
current = getNextLineChar();
}
(*tptr).text[i]='\0';
(*tptr).type=TOK_FLT_CONST;
(*tptr).fval = atof((*tptr).text);
goBackOneChar();
return;
}
else /*no digits after +/- */
{
(*tptr).text[i]='\0';
(*tptr).type = TOK_BAD;
goBackOneChar();
return;
}
}
else /*no e/E following .digits */
{
(*tptr).text[i]='\0';
(*tptr).type=TOK_FLT_CONST;
(*tptr).fval = atof((*tptr).text);
goBackOneChar();
return;
}
}
/*digits end in e/E potential float*/
else if((current=='e')||(current=='E'))
{
(*tptr).text[i]=current;
i++;
current = getNextLineChar();
if((current=='+')||(current=='-'))
{
(*tptr).text[i]=current;
i++;
current = getNextLineChar();
}
if((current>='0')&&(current<='9'))
{
while((current>='0')&&(current<='9'))
{
(*tptr).text[i]=current;
i++;
current = getNextLineChar();
}
(*tptr).text[i]='\0';
(*tptr).type=TOK_FLT_CONST;
(*tptr).fval = atof((*tptr).text);
goBackOneChar();
return;
}
else /*no digits after +/- */
{
(*tptr).text[i]='\0';
(*tptr).type = TOK_BAD;
goBackOneChar();
return;
}
}
/*digits do not end in decimal point or e/E, have integer*/
else
{
(*tptr).text[i]='\0';
(*tptr).type = TOK_INT_CONST;
(*tptr).val = stringToU8((*tptr).text);
goBackOneChar();
return;
}
}
/*does start with 0-9 after +/- */
else
{
(*tptr).text[0]='\0';
(*tptr).type = TOK_BAD;
goBackOneChar();
}
return;
}/*end processNumConstant*/
/*-----------------------------------------------------------------*/
U1 LineTokenizer::match(struct Token *tptr, int ttype)
{
(*tptr) = getNextLineToken();
if((*tptr).type!=ttype)
{
ERROR5("LineTokenizer::match(): %s:(%lu) expecting %s, not %s in \"%s\"\n",(*tptr).fName,(*tptr).line,TokStr[ttype],TokStr[(*tptr).type],(*tptr).text);
return(FALSE);
}
LINE_TOK_DEBUG2("LineTokenizer::match(): OK text=%s type=%s\n",(*tptr).text,TokStr[(*tptr).type]);
return(TRUE);
}/*end match*/
/*-----------------------------------------------------------------*/
void LineTokenizer::printToken(struct Token *tptr)
{
printf("TOK-> file=%s line=%d type=%s ",(*tptr).fName,(*tptr).line,TokStr[(*tptr).type]);
switch((*tptr).type)
{
case TOK_IDENTIFIER:{ printf("text=%s\n",(*tptr).text); }break;
case TOK_INT_REG:{ printf("text=%s val=%d\n",(*tptr).text,(*tptr).val); }break;
case TOK_FLT_REG:{ printf("text=%s val=%d\n",(*tptr).text,(*tptr).val); }break;
case TOK_DBL_REG:{ printf("text=%s val=%d\n",(*tptr).text,(*tptr).val); }break;
case TOK_CHAR_CONST:{ printf("text=%s\n",(*tptr).text); }break;
case TOK_INT_CONST:
{
printf("text=%s val=",(*tptr).text);
pS8((*tptr).val);
printf("\n");
}break;
case TOK_FLT_CONST:{ printf("text=%s fval=%g\n",(*tptr).text,(*tptr).fval); }break;
case TOK_COMMA:{ printf("text=%s\n",(*tptr).text);}break;
case TOK_NO_MORE:{ printf("text=%s\n",(*tptr).text);}break;
case TOK_BAD:{ printf("text=%s\n",(*tptr).text);}break;
}
return;
}/*end printToken*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -