📄 parse.c
字号:
while(ch != ' '&&ch!='\n')
ch = fgetc(fp);
}
fseek(fp,-1L,1);
if(lookkey(sign) != -1)/*判断该标示符是否为关键字 */
{
int p = lookkey(sign);
if(p == 3)
{
printf("(key,%s)\n",sign);
fprintf(output,"(key,%d)\n",sign);
return symbol_char;
}
else if(p== 7)
{
printf("(key,%s)\n",sign);
fprintf(output,"(key,%d)\n",sign);
return symbol_do;
}
else if(p== 8)
{
printf("(key,%s)\n",sign);
fprintf(output,"(key,%d)\n",sign);
return symbol_double;
}
else if(p== 9)
{
printf("(key,%s)\n",sign);
fprintf(output,"(key,%d)\n",sign);
return symbol_else;
}
else if(p== 12)
{
printf("(key,%s)\n",sign);
fprintf(output,"(key,%d)\n",sign);
return symbol_float;
}
else if(p== 13)
{
printf("(key,%s)\n",sign);
fprintf(output,"(key,%d)\n",sign);
return symbol_for;
}
else if(p== 15)
{
printf("(key,%s)\n",sign);
fprintf(output,"(key,%d)\n",sign);
return symbol_if;
}
else if(p== 16)
{
printf("(key,%s)\n",sign);
fprintf(output,"(key,%d)\n",sign);
return symbol_int;
}
else if(p== 17)
{
printf("(key,%s)\n",sign);
fprintf(output,"(key,%d)\n",sign);
return symbol_long;
}
else if(p== 29)
{
printf("(key,%s)\n",sign);
fprintf(output,"(key,%d)\n",sign);
return symbol_void;
}
else if(p== 31)
{
printf("(key,%s)\n",sign);
fprintf(output,"(key,%d)\n",sign);
return symbol_while;
}
else
{
printf("(key,%s)\n",sign);
fprintf(output,"(key,%d)\n",sign);
return word_key;
}
}
else
{
int p = findsymbol(sign);/*判断该标示符是否在符号表中,p用来表示符号表索引*/
if(p==-1)
{
p = insert(sign,symbol_mark_ID);
fprintf(chart,"%d\t%s\t\t\tnull\n",index-1,sign);
}
printf("(id,%d)\n",p);
fprintf(output,"(id,%d)\n",p);
return p+1000;
}
}
else if(lookoperater(ch)==0)/*当字符为操作符时,执行以下操作 */
{
char secondchar = fgetc(fp);
if(secondchar == '|'&&ch == '|')/*当字符为|,&,+,-,>,<,=时,执行相应超前扫描 */
{
printf("(operator,%c%c)\n",ch,secondchar);
fprintf(output,"(operator,%c%c)\n",ch,secondchar);
return or;
}
else if(secondchar == '&'&&ch == '&')
{
fprintf(output,"(operator,%c%c)\n",ch,secondchar);
printf("(operator,%c%c)\n",ch,secondchar);
return and;
}
else if(secondchar == '+'&&ch == '+')
{
fprintf(output,"(operator,%c%c)\n",ch,secondchar);
printf("(operator,%c%c)\n",ch,secondchar);
return add_add;
}
else if(secondchar == '-'&&ch == '-')
{
fprintf(output,"(operator,%c%c)\n",ch,secondchar);
printf("(operator,%c%c)\n",ch,secondchar);
return minus_minus;
}
else if(secondchar == '>'&&ch == '>')
{
fprintf(output,"(operator,%c%c)\n",ch,secondchar);
printf("(operator,%c%c)\n",ch,secondchar);
}
else if(secondchar == '<'&&ch == '<')
{
fprintf(output,"(operator,%c%c)\n",ch,secondchar);
printf("(operator,%c%c)\n",ch,secondchar);
}
else if(ch=='>'&&secondchar == '=')
{
printf("(operator,%c%c)\n",ch,secondchar);
fprintf(output,"(operator,%c%c)\n",ch,secondchar);
return great_equal;
}
else if(ch == '<'&&secondchar == '=')
{
printf("(operator,%c%c)\n",ch,secondchar);
fprintf(output,"(operator,%c%c)\n",ch,secondchar);
return small_equal;
}
else if(ch == '!'&&secondchar == '=')
{
printf("(operator,%c%c)\n",ch,secondchar);
fprintf(output,"(operator,%c%c)\n",ch,secondchar);
return not_equal;
}
else if(ch == '='&&secondchar == '=')
{
printf("(operator,%c%c)\n",ch,secondchar);
fprintf(output,"(operator,%c%c)\n",ch,secondchar);
return equal_equal;
}
else if(secondchar == '=')
{
printf("(operator,%c%c)\n",ch,secondchar);
fprintf(output,"(operator,%c%c)\n",ch,secondchar);
}
else if(ch =='+')
{
fprintf(output,"(operator,%c)\n",ch);
printf("(operator,%c)\n",ch);
fseek(fp,-1L,1);
return add;
}
else if(ch =='-')
{
fprintf(output,"(operator,%c)\n",ch);
printf("(operator,%c)\n",ch);
fseek(fp,-1L,1);
return minus;
}
else if(ch =='*')
{
fprintf(output,"(operator,%c)\n",ch);
printf("(operator,%c)\n",ch);
fseek(fp,-1L,1);
return multy;
}
else if(ch =='<')
{
fprintf(output,"(operator,%c)\n",ch);
printf("(operator,%c)\n",ch);
fseek(fp,-1L,1);
return small;
}
else if(ch =='>')
{
fprintf(output,"(operator,%c)\n",ch);
printf("(operator,%c)\n",ch);
fseek(fp,-1L,1);
return great;
}
else if(ch =='=')
{
fprintf(output,"(operator,%c)\n",ch);
printf("(operator,%c)\n",ch);
fseek(fp,-1L,1);
return equal;
}
else if(ch =='!')
{
fprintf(output,"(operator,%c)\n",ch);
printf("(operator,%c)\n",ch);
fseek(fp,-1L,1);
return not;
}
else
{
fprintf(output,"(operator,%c)\n",ch);
printf("(operator,%c)\n",ch);
fseek(fp,-1L,1);
}
return word_other;
}
else if(ch == '/')/*当字符为斜杆时,执行以下操作 */
{
char secondchar = fgetc(fp);
if(secondchar == '*')/*当接着读入的字符为*时,则以后的字符都为注释*/
{
char a =fgetc(fp);
ch = fgetc(fp);
while(!(ch == '*'&& a == '/'))
{
fseek(fp,-1L,1);
ch = fgetc(fp);
a =fgetc(fp);
}
}
else if(secondchar == '=')/*当接着的字符为=,则为操作符/= */
{
printf("(operator,%c%c)\n",ch,secondchar);
fprintf(output,"(operator,%c%c)\n",ch,secondchar);
return word_other;
}
else
{
fprintf(output,"(operator,%c)\n",ch);
printf("(operator,%c)\n",ch);
fseek(fp,-1L,1);
return divide;
}
}
else if(ch == '"')/*当字符为双引号时 */
{
char n = fgetc(fp);
fseek(fp,-2L,1);
if(n == '\''||n=='\\')
/*当双引号前面的字符为单引号或反斜杠时,将字符输出 */
{
ch = fgetc(fp);
fprintf(output,"(divide,%c)\n",ch);
printf("(divide,%c)\n",ch);
}
else/*否则将双引号后面的字符当作字符串处理,直到发现另一个双引号为止 */
{
char string[200]={'\0'};
int c =0;
ch = fgetc(fp);
fprintf(output,"(divide,%c)\n",ch);
printf("(divide,%c)\n",ch);
ch = fgetc(fp);
while(ch != '"')/*当两个双引号之间内容分行写时,报错 */
{
if(ch == '\n')
{
printf("erro:语句输出有错,只能在一行上输出,错误在%d行\n",linenumber);
fprintf(erro,"erro:语句输出有错,只能在一行上输出,错误在%d行\n",linenumber);
ch =fgetc(fp);
linenumber++;
break;
}
if(ch =='\\')
{
string[c] = ch;
c++;
ch =fgetc(fp);
}
string[c] = ch;
c++;
ch =fgetc(fp);
}
printf("(string,%s)\n",string);
fprintf(output,"(strings,%s)\n",string);
fprintf(output,"(divide,%c)\n",ch);
printf("(divide,%c)\n",ch);
}
return word_string;
}
else if(lookletter(ch) ==0)/*当字符为c语言中的合法字符是时,输出字符 */
{
if(ch == '(')
{
fprintf(output,"(divide,%c)\n",ch);
printf("(divide,%c)\n",ch);
return leftpar;
}
else if(ch == ')')
{
fprintf(output,"(divide,%c)\n",ch);
printf("(divide,%c)\n",ch);
return rightpar;
}
else if(ch == '[')
{
fprintf(output,"(divide,%c)\n",ch);
printf("(divide,%c)\n",ch);
return leftmiddle;
}
else if(ch == ']')
{
fprintf(output,"(divide,%c)\n",ch);
printf("(divide,%c)\n",ch);
return rightmiddle;
}
else if(ch == '{')
{
fprintf(output,"(divide,%c)\n",ch);
printf("(divide,%c)\n",ch);
return leftbig;
}
else if(ch == '}')
{
fprintf(output,"(divide,%c)\n",ch);
printf("(divide,%c)\n",ch);
return rightbig;
}
else if(ch == ';')
{
fprintf(output,"(divide,%c)\n",ch);
printf("(divide,%c)\n",ch);
return fenhao;
}
fprintf(output,"(divide,%c)\n",ch);
printf("(divide,%c)\n",ch);
return word_divide;
}
else if(ch ==EOF)
return -1;
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -