訊息
|
檔案:cc0v1.1.zip
輸入檔:test.c0
int debug = 1;
int sum(int n) {
int s=0;
for (i=0; i<n; i++)
s = s + i;
return s;
}
int swap(int a, int b) {
t = a;
a = b;
b = t;
}
int main() {
int x=3, y=5, z;
if ((x+y)>6)
z = 0;
else
z = 1;
int i=0, s=0;
while (i<10) {
s = s + i;
i++;
}
int total=sum(10);
=swap(x, y);
}
編譯執行
D:\oc\cc0\v1.1>gcc scanner.c cc0lib.c -o scanner
D:\oc\cc0\v1.1>scanner test.c0
token=int tag=ID kind=1,TYPE line=1
token=debug tag=ID kind=3,VAR line=1
token== tag=OP kind=4,NONE line=1
token=1 tag=INTEGER kind=4,NONE line=1
token=; tag=OP kind=4,NONE line=1
token=int tag=ID kind=1,TYPE line=3
token=sum tag=ID kind=3,VAR line=3
token=( tag=OP kind=4,NONE line=3
token=int tag=ID kind=1,TYPE line=3
token=n tag=ID kind=3,VAR line=3
token=) tag=OP kind=4,NONE line=3
token={ tag=OP kind=4,NONE line=3
token=int tag=ID kind=1,TYPE line=4
token=s tag=ID kind=3,VAR line=4
token== tag=OP kind=4,NONE line=4
token=0 tag=INTEGER kind=4,NONE line=4
token=; tag=OP kind=4,NONE line=4
token=for tag=ID kind=0,KEY line=5
token=( tag=OP kind=4,NONE line=5
token=i tag=ID kind=3,VAR line=5
token== tag=OP kind=4,NONE line=5
token=0 tag=INTEGER kind=4,NONE line=5
token=; tag=OP kind=4,NONE line=5
token=i tag=ID kind=3,VAR line=5
token=< tag=OP kind=4,NONE line=5
token=n tag=ID kind=3,VAR line=5
token=; tag=OP kind=4,NONE line=5
token=i tag=ID kind=3,VAR line=5
token=++ tag=OP kind=4,NONE line=5
token=) tag=OP kind=4,NONE line=5
token=s tag=ID kind=3,VAR line=6
token== tag=OP kind=4,NONE line=6
token=s tag=ID kind=3,VAR line=6
token=+ tag=OP kind=4,NONE line=6
token=i tag=ID kind=3,VAR line=6
token=; tag=OP kind=4,NONE line=6
token=return tag=ID kind=0,KEY line=7
token=s tag=ID kind=3,VAR line=7
token=; tag=OP kind=4,NONE line=7
token=} tag=OP kind=4,NONE line=8
token=int tag=ID kind=1,TYPE line=10
token=swap tag=ID kind=3,VAR line=10
token=( tag=OP kind=4,NONE line=10
token=int tag=ID kind=1,TYPE line=10
token=a tag=ID kind=3,VAR line=10
token=, tag=OP kind=4,NONE line=10
token=int tag=ID kind=1,TYPE line=10
token=b tag=ID kind=3,VAR line=10
token=) tag=OP kind=4,NONE line=10
token={ tag=OP kind=4,NONE line=10
token=t tag=ID kind=3,VAR line=11
token== tag=OP kind=4,NONE line=11
token=a tag=ID kind=3,VAR line=11
token=; tag=OP kind=4,NONE line=11
token=a tag=ID kind=3,VAR line=12
token== tag=OP kind=4,NONE line=12
token=b tag=ID kind=3,VAR line=12
token=; tag=OP kind=4,NONE line=12
token=b tag=ID kind=3,VAR line=13
token== tag=OP kind=4,NONE line=13
token=t tag=ID kind=3,VAR line=13
token=; tag=OP kind=4,NONE line=13
token=} tag=OP kind=4,NONE line=14
token=int tag=ID kind=1,TYPE line=16
token=main tag=ID kind=3,VAR line=16
token=( tag=OP kind=4,NONE line=16
token=) tag=OP kind=4,NONE line=16
token={ tag=OP kind=4,NONE line=16
token=int tag=ID kind=1,TYPE line=17
token=x tag=ID kind=3,VAR line=17
token== tag=OP kind=4,NONE line=17
token=3 tag=INTEGER kind=4,NONE line=17
token=, tag=OP kind=4,NONE line=17
token=y tag=ID kind=3,VAR line=17
token== tag=OP kind=4,NONE line=17
token=5 tag=INTEGER kind=4,NONE line=17
token=, tag=OP kind=4,NONE line=17
token=z tag=ID kind=3,VAR line=17
token=; tag=OP kind=4,NONE line=17
token=if tag=ID kind=0,KEY line=18
token=( tag=OP kind=4,NONE line=18
token=( tag=OP kind=4,NONE line=18
token=x tag=ID kind=3,VAR line=18
token=+ tag=OP kind=4,NONE line=18
token=y tag=ID kind=3,VAR line=18
token=) tag=OP kind=4,NONE line=18
token=> tag=OP kind=4,NONE line=18
token=6 tag=INTEGER kind=4,NONE line=18
token=) tag=OP kind=4,NONE line=18
token=z tag=ID kind=3,VAR line=19
token== tag=OP kind=4,NONE line=19
token=0 tag=INTEGER kind=4,NONE line=19
token=; tag=OP kind=4,NONE line=19
token=else tag=ID kind=0,KEY line=20
token=z tag=ID kind=3,VAR line=21
token== tag=OP kind=4,NONE line=21
token=1 tag=INTEGER kind=4,NONE line=21
token=; tag=OP kind=4,NONE line=21
token=int tag=ID kind=1,TYPE line=23
token=i tag=ID kind=3,VAR line=23
token== tag=OP kind=4,NONE line=23
token=0 tag=INTEGER kind=4,NONE line=23
token=, tag=OP kind=4,NONE line=23
token=s tag=ID kind=3,VAR line=23
token== tag=OP kind=4,NONE line=23
token=0 tag=INTEGER kind=4,NONE line=23
token=; tag=OP kind=4,NONE line=23
token=while tag=ID kind=0,KEY line=24
token=( tag=OP kind=4,NONE line=24
token=i tag=ID kind=3,VAR line=24
token=< tag=OP kind=4,NONE line=24
token=10 tag=INTEGER kind=4,NONE line=24
token=) tag=OP kind=4,NONE line=24
token={ tag=OP kind=4,NONE line=24
token=s tag=ID kind=3,VAR line=25
token== tag=OP kind=4,NONE line=25
token=s tag=ID kind=3,VAR line=25
token=+ tag=OP kind=4,NONE line=25
token=i tag=ID kind=3,VAR line=25
token=; tag=OP kind=4,NONE line=25
token=i tag=ID kind=3,VAR line=26
token=++ tag=OP kind=4,NONE line=26
token=; tag=OP kind=4,NONE line=26
token=} tag=OP kind=4,NONE line=27
token=int tag=ID kind=1,TYPE line=29
token=total tag=ID kind=3,VAR line=29
token== tag=OP kind=4,NONE line=29
token=sum tag=ID kind=3,VAR line=29
token=( tag=OP kind=4,NONE line=29
token=10 tag=INTEGER kind=4,NONE line=29
token=) tag=OP kind=4,NONE line=29
token=; tag=OP kind=4,NONE line=29
token== tag=OP kind=4,NONE line=30
token=swap tag=ID kind=3,VAR line=30
token=( tag=OP kind=4,NONE line=30
token=x tag=ID kind=3,VAR line=30
token=, tag=OP kind=4,NONE line=30
token=y tag=ID kind=3,VAR line=30
token=) tag=OP kind=4,NONE line=30
token=; tag=OP kind=4,NONE line=30
token=} tag=OP kind=4,NONE line=31
掃描器主程式:scanner.c
#include "cc0.h" // 引入檔頭,包含資料結構與常數定義
void cnext() {
token[tokenIdx++]=ch;
pos++;
ch=fgetc(file);
}
void tnext() {
while (cmember(ch, SPACE)) {
if (ch=='\n') {
line++;
pos = 1;
}
cnext();
}
if (feof(file)) {
strcpy(token, "$ENDP");
tag = ENDP;
return;
}
tokenIdx = 0;
if (ch == '\"') { // 如果是 " 代表字串開頭
cnext();
while (ch != '\"') cnext(); // 一直讀到下一個 " 符號為止。
cnext();
tag=STRING;
} else if (cmember(ch, OPERATOR)) {
while (cmember(ch, OPERATOR)) cnext();
tag=OP;
} else if (cmember(ch, DIGIT)) {
while (cmember(ch, DIGIT))
cnext();
tag=INTEGER;
if (ch == '.') {
cnext();
tag = FLOAT;
}
while (cmember(ch, DIGIT))
cnext();
} else if (cmember(ch, ALPHA)) {
while (cmember(ch, ALPHA) || cmember(ch, DIGIT))
cnext();
tag=ID;
} else {
tag = OP;
cnext();
}
token[tokenIdx] = '\0';
if (strFind(keys, token)!=NIL)
kind = KEY;
else if (strFind(types, token)!=NIL)
kind = TYPE;
else if (tag == ID)
kind = VAR;
else
kind = NONE;
}
int init() {
fseek(file, 0, SEEK_SET);
tokenIdx = 0;
tnext();
}
int scan() {
init();
while (TRUE) {
if (tag == ENDP)
break;
printf("token=%-8s tag=%-8s kind=%d,%-8s line=%d\n",
token, tags[tag], kind, kinds[kind], line);
tnext();
}
}
int main(int argc, char * argv[]) {
char *fname = argv[1];
file = fopen(fname, "r");
scan();
fclose(file);
}
Facebook
|
Post preview:
Close preview