📄 linetok.c
字号:
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;
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;
}
void processCharConst(struct Token *tptr)
{
char current;
char ch;
current = getNextLineChar();
ch = current;
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;
}
void 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;
}
void 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] = '0';
(*tptr).text[i + 1] = '\0';
(*tptr).type = TOK_INT_CONST;
(*tptr).val = stringToU8((*tptr).text);
goBackOneChar();
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;
}
}
else if ((current == 'e') || (current == 'E'))
{
/*digits end in e/E potential float*/
(*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
{
/*digits do not end in decimal point or e/E, have integer*/
(*tptr).text[i] = '\0';
(*tptr).type = TOK_INT_CONST;
(*tptr).val = (S8)stringToU8((*tptr).text);
goBackOneChar();
return;
}
}
else
{
(*tptr).text[i] = '\0';
(*tptr).type = TOK_BAD;
goBackOneChar();
}
return;
}
void processComment(struct Token *tptr, char ch)
{
int i;
char current;
i = 0;
current = ch;
while (current != EOL)
{
(*tptr).text[i] = current;
i++;
current = getNextLineChar();
}
(*tptr).text[i] = '\0';
(*tptr).type = TOK_IDENTIFIER;
goBackOneChar();
return;
}
U1 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;
}
void 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;
}
void goBackOneChar()
{
if (itChars >= 0)
{
itChars--;
}
else
{
LINE_TOK_DEBUG1("goBackOneChar(): decrement below 0, %d\n", itChars);
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -