📄 main.c
字号:
ch = character;
line1++;
line2 = line1;
while ( (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
inkey[i++] = ch;
ch = readchar();
if(i == 12) break;
}
line1 = line1 + i - 1;
inkey[i] = '\0';
count2 = i;
if(i < 13) {
if(ch == '$' || ch == '_' || (ch >= '0' && ch <= '9') ) {
strcpy(ininden,inkey); //遇到标识符的字母结束,则为标识符
character = ch;
identifier();
untread();
}
else {
for(i = 0; i < 50; i++) {
if(strcmp(inkey,keyword[i]) == 0) {
if( (strcmp(inkey,"true") == 0) || (strcmp(inkey,"false") == 0)) {
sp = "0x105";
}
else { sp = "0x103";}
strcpy(flow.attribute,sp);
flow.site = i;
total++;
linetotal++;
writefile();
untread(); //回退一个单词
break;
}
}
if(i == 50) { //不是关键字,而是标识符
character = ch;
strcpy(ininden,inkey);
identifier();
untread();
}
}
}
else {
sp = inkey;
untread();
error(sp);
}
clean();
}
//扫描数字
void number() {
char ch,*sp;
int i = 0;
int realnum = 0; //计算'.'和'e','x'的个数,为零则为整数,超过一个则为错误的单词
int havechar = 0; //判断是否以字母结束
ch = character;
line1++;
line2 = line1;
if(ch == '0') {
innum[i++] = ch;
ch = readchar();
if(ch == 'x' || ch == 'X') { //为十六进制数
innum[i++] = ch;
ch = readchar();
while ( (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F')) {
innum[i++] = ch;
ch = readchar();
}
}
else if(ch >= '0' && ch <= '9'){ //'0'后面跟数字为错误单词
innum[i++] = ch;
sp = innum;
error(sp);
return ;
}
}
else {
while ( (ch >= '0' && ch <= '9') || ch == '.' || ch == 'e' ||ch == 'E' || ch == 'L' || ch == 'F' || ch == 'l' || ch == 'f') {
if(ch == 'e' || ch == 'E' || ch == '.') {
realnum++;
}
innum[i++] = ch;
switch (realnum) {
case 0:
if(ch == 'L' || ch == 'l') {
havechar = 1;
}
else if(ch == 'F' || ch == 'f'){ //整数不以'F','f'结尾
i--;
}
break;
case 1:
if(ch == 'F' || ch == 'f') {
havechar = 1;
}
else if(ch == 'L' || ch == 'l') { //实数不以'L','l'结尾
i--;
}
break;
default : { //超过两个'e','E','.'为错误单词
sp = innum;
if(innum[0] == '.' && (innum[1] == 'e' || innum[1] == 'E' || innum[1] == '.')) { break;}
error(sp);
return ;
}
}
ch = readchar(); //
}
}
if(innum[0] == '.' && (i == 1 || innum[1] == 'e' || innum[1] == 'E' || innum[1] == '.')) {
sp = "0x11d"; //单独一个点号,或者点号后跟着点号,e,E
strcpy(flow.attribute,sp);
flow.site = 41;
total++;
linetotal++;
writefile();
clean();
if(innum[1] == 'e' || innum[1] == 'E') {
untread();
untread();
}
if(i == 1) { untread();}
return ;
}
line1 = line1 + i - 1;
innum[i] = '\0';
for(i = 0; i < count5; i++) {
if(strcmp(innum,value[i]) == 0) { //比较看变量值是否已存在
if(realnum == 0) { sp = "0x107";}
else {
sp = "0x108";
}
strcpy(flow.attribute,sp);
flow.site = i;
total++;
linetotal++;
writefile();
break;
}
}
if(i == count5) {
strcpy(value[count5],innum);
if(realnum == 0) { sp = "0x107";}
else {
sp = "0x108";
}
strcpy(flow.attribute,sp);
flow.site = i;
total++;
linetotal++;
writefile();
count5++;
}
if(havechar == 0) { untread();} //以字母结束时,最后一个字符可以被处理,就不用回退了
clean();
}
//扫描注释
void explain(int a) {
char innote[20],ch,ch1,*sp;
int i = 0;
sp = "0x101";
strcpy(flow.attribute,sp);
ch = readchar();
line1++;
line2 = line1;
while(1) {
line1++;
innote[i++] = ch;
if(ch == ' ' || ch == '\n') {//以空格和回车符为注释中单词的结束标志,若两单词连在一起,则分辨不出
if(ch == 'a') { break;}
linetotal++;
total++;
innote[i-1] = '\0';
strcpy(note[count6],innote);
flow.site = count6;
writefile();
i = 0;
count6++;
line2 = line1;
if(ch == '\n') {
row++;
linetotal = 0;
line1 = 0;
if(a == 1) { break;}
}
}
else if(ch == '*') {
line2 = line1;
ch = readchar();
line1++;
innote[i++] = ch;
if(ch == '/') {
innote[i-1] = '\0';
strcpy(note[count6],innote);
flow.site = 2;
total++;
linetotal++;
writefile();
count6++;
break;
}
}
if(i == 50) {
printf("the string is too long,please write more blank space.");
exit(0) ;
}
ch = readchar();
}
}
//以下几个是扫描运算符的函数
void op1(char a) {
char ch,*sp;
int i;
if(a == '+') { i = 0;}
else { i = 3;}
line1++;
line2 = line1;
ch = readchar();
if(ch == '=') {
flow.site = 3 + i;
sp = "0x110";
}
else if(ch == '+' || ch == '-'){
sp = "0x11c";
flow.site = 2 + i;
untread();
}
else {
untread();
untread(); //回退到'+'前的字符
untread();
ch = readchar();
flow.site = 4 + i;
if(ch == ' ' || ch == '(') { //若是空格或左括号,则为正号
sp = "0x11c";
ch = readchar(); //跳过刚读过的字符
ch = readchar();
}
else {
sp = "0x11a";
ch = readchar();
ch = readchar();
}
}
strcpy(flow.attribute,sp);
total++;
linetotal++;
writefile();
}
void op2(char a) {
char ch,*sp;
int i,j;
switch (a){
case '*': i = 0; break;
case '/': i = 2; break;
case '%': i = 4; break;
case '^': i = 6; break;
case '&': i = 8; break;
case '|': i = 10; break;
case '!': i = 12; break;
}
line1++;
line2 = line1;
ch = readchar();
if(a == '/' && (ch == '/' || ch == '*')) { //为注释
line1++;
sp = "0x101";
strcpy(flow.attribute,sp);
if(ch == '/') {
flow.site = 0;
j = 1;
}
else {
flow.site = 1;
j = 0;
}
total++;
linetotal++;
writefile();
explain(j);
return ;
}
if(ch == '=') {
flow.site = 8 + i;
sp = "0x110";
line1++;
}
else if(a == '&' || a == '|'){ //&&与||
if(a == '&') {
sp = "0x113";
flow.site = 22;
}
else {
sp = "0x112";
flow.site = 23;
}
line1++;
}
else {
switch (a) {
case '*':
case '/':
case '%': sp = "0x11b"; break;
case '&': sp = "0x116"; break;
case '^': sp = "0x115"; break;
case '|': sp = "0x114"; break;
case '!': sp = "0x11c"; break;
}
flow.site = 9 + i;
untread();
}
strcpy(flow.attribute,sp);
total++;
linetotal++;
writefile();
}
void op3(char a) {
char ch,*sp;
int i;
if(a == '<') { i = 6;}
else { i = 0;}
line1++;
line2 = line1;
ch = readchar();
line1++;
if(ch == '=') {
sp = "0x118";
flow.site = 25 + i;
}
else if(ch == '>' || ch == '<') {
ch = readchar();
line1++;
if(ch == '=') {
sp = "0x110";
flow.site = 27 + i;
}
else if(ch == '>') {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -