📄 mycompiler.cpp
字号:
lexbegin = lexforward;
}
else if(CurChar == '\n')
{
LineNO ++;ColNO=0;
MoveToNextChar();
lexbegin = lexforward;
}
else if(CurChar == '0') state = 2; /*Deal with Hex and Oct Integer Num*/
else if(isdigit(CurChar)) state = 9; /*Deal with Dec and Float Num*/
else if(isalpha(CurChar)||CurChar == '_') state = 18; /*Deal with Identifier*/
else
switch(CurChar)
{
case '>':state = 20; /*Deal with beginning of '>' including: >, >=, >> */
break;
case '-':state = 24; /*Deal with beginning of '-' including: -, -=, --, ->*/
break;
case '<':state = 29; /*Deal with beginning of '<' including: <, <=, << */
break;
case '+':state = 33; /*Deal with beginning of '+' including: +, ++, += */
break;
case '*':state = 37; /*Deal with beginning of '*' including: *, *= */
break;
case '/':state = 40; /*Deal with beginning of '/' including: /, /=, Comment begin and end */
break;
case '|':state = 46; /*Deal with beginning of '|' including: |, || */
break;
case '&':state = 49; /*Deal with beginning of '&' including: &, && */
break;
case '!':state = 50; /*Deal with beginning of '!' including: !, != */
break;
case '~':state = 52; /*Deal with beginning of '~' including: ~ */
break;
case '^':state = 54; /*Deal with beginning of '^' including: ^ */
break;
case '=':state = 55; /*Deal with beginning of '=' including: =, == */
break;
case '?':state = 58; /*Deal with beginning of '?' including: ? */
break;
case '.':state = 59; /*Deal with beginning of '.' including: . */
break;
case ',':state = 60; /*Deal with beginning of ',' including: , */
break;
case ':':state = 61; /*Deal with beginning of ':' including: : */
break;
case ';':state = 62; /*Deal with beginning of ';' including: ; */
break;
case '(':state = 63; /*Deal with beginning of '(' including: ( */
break;
case ')':state = 64; /*Deal with beginning of ')' including: ) */
break;
case '[':state = 65; /*Deal with beginning of '[' including: [ */
break;
case ']':state = 66; /*Deal with beginning of ']' including: ] */
break;
case '{':state = 67; /*Deal with beginning of '{' including: } */
break;
case '}':state = 68; /*Deal with beginning of '}' including: } */
break;
case '#':state = 69; /*Deal with beginning of '#' including: # */
break;
case '%':state = 70; /*Deal with beginning of '%' including: % , %= */
break;
case '"':state = 73; /*Deal with beginning of '"' including: constant character string and escape char*/
break;
case '\'':state = 78; /*Deal with beginning of '\'' including: one char included */
break;
case '@':state = 80; /*Deal with Syntax variable*/
break;
case '$':
MoveToNextChar();
lexbegin = lexforward;
return PFINISH; /*Deal with Syntax Product a line*/
case EOF:
return DONE;
default:error("Unlegal char!");
MoveToNextChar();
lexbegin = lexforward;
state = 1;
break;
}/*switch(CurChar)*/
break;
case 2: /*Deal with Oct and Hex Integer num*/
MoveToNextChar();
if(CurChar == 'x' || CurChar == 'X')
state = 3;
else if (isdigit(CurChar) && CurChar != '9' && CurChar != '8')
state = 6;
token1 = 0;
lexbegin = lexforward;
return (NUM1);
case 3: /*Deal with Hex Integer */
do{
MoveToNextChar();
}while(isxdigit(CurChar));
lexbegin = lexforward;
if(AbsoluteLength() == 2)
{
state = 1;
error("Hex constant num after 0x should have num!");
break;
}
GetIntoLexBufferFromInputBuffer();
lexbegin = lexforward;
state = 0;
token1 = strtol (LexBuffer,&endptr,16);
return (NUM1);
case 6: /*Deal with Oct Integer or turn to state Dec float num*/
do{
MoveToNextChar();
}while(isdigit(CurChar));
if(CurChar == '.')
{
/*MidIntUse = strtol(LexBuffer,&endptr,10);*/
state = 10;
break;
}
GetIntoLexBufferFromInputBuffer();
lexbegin = lexforward;
for(Counter = 0;LexBuffer[Counter] != '\0';Counter ++)
if(LexBuffer[Counter]=='9'||LexBuffer[Counter]=='8')
{
state = 1;
error("Integer num began with 0 should be Oct which should not include 8,9!");
break;
}
if(LexBuffer[Counter] != '\0') break;
token1 = strtol(LexBuffer,&endptr,8);
/*state = 0;*/
return NUM1;
case 9: /*Deal with Dec and Float Num*/
while(isdigit(CurChar))
MoveToNextChar();
switch(CurChar)
{
case '.':
state = 10;
break;
case 'e':case'E':
state = 12;
break;
default:
GetIntoLexBufferFromInputBuffer();
lexbegin = lexforward;
token1 = strtol(LexBuffer,&endptr,10);
return NUM1;
}/*switch (CurChar)*/
break;
case 10:/*Deal with float num after Recognize integer part*/
do{
MoveToNextChar();
}while(isdigit(CurChar));
if(CurChar == 'E' || CurChar == 'e')
{
state = 12;
break;
}
GetIntoLexBufferFromInputBuffer();
lexbegin = lexforward;
token2 = strtod(LexBuffer,&endptr);
return NUM2;
case 12:/*Deal with scientific num */
MoveToNextChar();
if(!(isdigit(CurChar)||CurChar=='+'||CurChar=='-'))
{
error("After E/e Should +/-/_/digit!");
state = 1;
break;
/*return ERROR;*/
}
do{
MoveToNextChar();
}while(isdigit(CurChar));
GetIntoLexBufferFromInputBuffer();
lexbegin = lexforward;
token2 = strtod(LexBuffer,&endptr);
return NUM2;
case 18:/*Deal with identifier which may be ID or key words*/
do{
MoveToNextChar();
}while(isdigit(CurChar)||isalpha(CurChar)||CurChar == '_');
GetIntoLexBufferFromInputBuffer();
lexbegin = lexforward;
/*Determine whether it is key words*/
/*if it is , we just return the key words TokenNum */
/*if it is not , we insert it into SymbolTable return ID tokennum*/
TempSymbol = LookWordsUpSymbolTable(::G_SymbolTable,LexBuffer);
if(TempSymbol == NULL)
if((TempSymbol = ::LookWordsUpSymbolTable(::CurSymbolTable,LexBuffer))== NULL)
TempSymbol = InsertIntoSymbolTable(::CurSymbolTable,LexBuffer,ID);
CurSymbol = TempSymbol;
return CurSymbol->TokenNum;
case 20:/*Deal with beginning of '>' including: >, >=, >> */
MoveToNextChar();
switch(CurChar)
{
case '>':/* >> */
MoveToNextChar();
lexbegin = lexforward;
return BMOVR;
case '=':/* >= */
MoveToNextChar();
lexbegin = lexforward;
return RLARQ;
default :/* > */
lexbegin = lexforward;
return RLARG;
}
case 24:/*Deal with beginning of '-' including: -, -=, --, ->*/
MoveToNextChar();
switch(CurChar)
{
case '-':/* -- */
MoveToNextChar();
lexbegin = lexforward;
return DEE;
case '=':/* -= */
MoveToNextChar();
lexbegin = lexforward;
return DEQ;
case '->':/* -> */
MoveToNextChar();
lexbegin = lexforward;
return POINTTO;
default: /* - */
return DEC;
}
case 29:/*Deal with beginning of '<' including: <, <=, << */
MoveToNextChar();
switch(CurChar)
{
case '<':/*<<*/
MoveToNextChar();
lexbegin = lexforward;
return BMOVL;
case '=':/* <= */
MoveToNextChar();
lexbegin = lexforward;
return RSMAQ;
default :/* < */
lexbegin = lexforward;
return RSMAL;
}
case 33:/*Deal with beginning of '+' including: +, ++, += */
MoveToNextChar();
switch(CurChar)
{
case '+':/*++*/
MoveToNextChar();
lexbegin = lexforward;
return INC;
case '=':/*+=*/
MoveToNextChar();
lexbegin = lexforward;
return INQ;
default : /*+*/
lexbegin = lexforward;
return ADD;
};
case 37:/*Deal with beginning of '*' including: *, *= */
MoveToNextChar();
lexbegin = lexforward;
if(CurChar != '=')
return MUL;
MoveToNextChar();
lexbegin = lexforward;
return MUQ;
case 40:/*Deal with beginning of '/' including: /, /=, Comment begin and end */
MoveToNextChar();
switch(CurChar)
{
case '=':/* /=*/
MoveToNextChar();
lexbegin = lexforward;
return DIQ;
case '*':/* Commends begin */
do
{
MoveToNextChar();
lexbegin = lexforward;
if(CurChar == '\n')
{
LineNO ++;ColNO = 0;
}
else ColNO ++;
if(CurChar == '*')
{
MoveToNextChar();
lexbegin = lexforward;
if(CurChar == '/')
{
state = 1;
break;
}
ColNO ++;
}
}while(1);
break;
default:/* div / */
lexbegin = lexforward;
return DIV;
};
break;
case 46:/*Deal with beginning of '|' including: |, || ,|=*/
MoveToNextChar();
switch(CurChar)
{
case '|':/* || */
MoveToNextChar();
lexbegin = lexforward;
return LOR;
case '=':/* |= */
MoveToNextChar();
lexbegin = lexforward;
return BORQ;
default :/* | */
MoveToNextChar();
lexbegin = lexforward;
return BOR;
}
case 49:/*Deal with beginning of '&' including: &, && ,&=*/
MoveToNextChar();
switch(CurChar)
{
case '&':/* & */
MoveToNextChar();
lexbegin = lexforward;
return LAND;
case '=':/* &= */
MoveToNextChar();
lexbegin = lexforward;
return BANDQ;
default :/* & */
lexbegin = lexforward;
return BAND;
}
case 50:/*Deal with beginning of '!' including: !, != */
MoveToNextChar();
lexbegin = lexforward;
if(CurChar != '=')
return LNOT;
MoveToNextChar();
lexbegin = lexforward;
return RNOTQ;
case 54:/*Deal with beginning of '^' including: ^,^= */
MoveToNextChar();
lexbegin = lexforward;
if(CurChar != '=')
return BEOR;
MoveToNextChar();
lexbegin = lexforward;
return BEORQ;
case 55:/*Deal with beginning of '=' including: =, == */
MoveToNextChar();
lexbegin = lexforward;
if(CurChar != '=')
return EQUA;
MoveToNextChar();
lexbegin = lexforward;
return REQUA;
case 58:/*Deal with beginning of '?' including: ? */
MoveToNextChar();
lexbegin = lexforward;
return QUES;
case 59:/*Deal with beginning of '.' including: . */
MoveToNextChar();
lexbegin = lexforward;
return DOT;
case 60:/*Deal with beginning of ',' including: , */
MoveToNextChar();
lexbegin = lexforward;
return COMA;
case 61:/*Deal with beginning of ':' including: : */
MoveToNextChar();
lexbegin = lexforward;
return COLON;
case 62:/*Deal with beginning of ';' including: ; */
MoveToNextChar();
lexbegin = lexforward;
return SCOLON;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -