diff --git a/Examples/for.mc b/Examples/for.mc
new file mode 100644
index 0000000..265016f
--- /dev/null
+++ b/Examples/for.mc
@@ -0,0 +1,13 @@
+void main()
+{
+ int x;
+
+ for( int i=0; i<=10; i++)
+ {
+ x = 333;
+ x++;
+ write(x);
+ x %= 10;
+ write(x);
+ }
+}
\ No newline at end of file
diff --git a/MiniCScanner/MiniCScanner.vcxproj.filters b/MiniCScanner/MiniCScanner.vcxproj.filters
index cca10a4..aaacf7c 100644
--- a/MiniCScanner/MiniCScanner.vcxproj.filters
+++ b/MiniCScanner/MiniCScanner.vcxproj.filters
@@ -24,7 +24,7 @@
- 소스 파일
+ 헤더 파일
\ No newline at end of file
diff --git a/MiniCScanner/MiniCScanner.vcxproj.user b/MiniCScanner/MiniCScanner.vcxproj.user
index e0ef295..dca5cda 100644
--- a/MiniCScanner/MiniCScanner.vcxproj.user
+++ b/MiniCScanner/MiniCScanner.vcxproj.user
@@ -10,4 +10,8 @@
$(ProjectDir)..\Examples\
WindowsLocalDebugger
+
+ for.mc
+ WindowsLocalDebugger
+
\ No newline at end of file
diff --git a/MiniCScanner/MiniCScannerTester.c b/MiniCScanner/MiniCScannerTester.c
index f3a986d..9524f62 100644
--- a/MiniCScanner/MiniCScannerTester.c
+++ b/MiniCScanner/MiniCScannerTester.c
@@ -14,28 +14,48 @@ FILE* outputFile; // output file
extern char* tokenName[];
void icgError(int n);
+void startScanner(char* fn);
int main(int argc, char *argv[])
{
-
- char fileName[30] = "", buffer[30] = "";
- struct tokenType token;
- int errorNo = 0;
- char *fileNamePtr = NULL, *context = NULL;
-
printf(" *** start of Mini C Compiler\n");
- if (argc != 2) {
+ if (argc < 2) {
icgError(1);
exit(1);
}
- strncpy_s(fileName, sizeof(fileName), argv[1], sizeof(fileName)-1);
+ for (int i = 1;i < argc;i++)
+ {
+ startScanner(argv[i]);
+
+ }
+ return 0;
+}
+
+void icgError(int n)
+{
+ printf("icg_error: %d\n", n);
+ //3:printf("A Mini C Source file must be specified.!!!\n");
+ //"error in DCL_SPEC"
+ //"error in DCL_ITEM"
+}
+
+void startScanner(char* fn)
+{
+ char fileName[30] = "";
+ char buffer[30] = "";
+ struct tokenType token;
+ int errorNo = 0;
+ char* fileNamePtr = NULL, * context = NULL;
+
+ strncpy_s(fileName, sizeof(fileName), fn, sizeof(fileName) - 1);
+ printf("fileName : %s\n", fileName);
printf(" * source file name: %30s\n", fileName);
if (fopen_s(&sourceFile, fileName, "r") != 0) {
- icgError(2);
+ icgError(2);
exit(1);
}
-
+
strncpy_s(buffer, sizeof(buffer), fileName, sizeof(fileName) - 1);
fileNamePtr = strtok_s(buffer, ".", &context);
strcat_s(buffer, sizeof(buffer), ".out");
@@ -48,51 +68,39 @@ int main(int argc, char *argv[])
exit(1);
}
-
// Test code for scanner
printf(" === start of Scanner\n");
-
+
do {
token = scanner(sourceFile);
-
// write on console
- /*
+
if (token.number == tident) {
printf("Token %10s ( %3d, %12s )\n", tokenName[token.number], token.number, token.value.id);
}
else if (token.number == tnumber) {
printf("Token %10s ( %3d, %12d )\n", tokenName[token.number], token.number, token.value.num);
}
+ else if (token.number == trealnumber) {
+ printf("Token %10s ( %3d, %12.6f )\n", tokenName[token.number], token.number, token.value.real_num);
+ }
+ else if (token.number == tcharacter) {
+ printf("Token %10s ( %3d, %c )\n", tokenName[token.number], token.number, token.value.character);
+ }
+ else if (token.number == tstring) {
+ printf("Token %10s ( %3d, %s )\n", tokenName[token.number], token.number, token.value.string);
+ }
else {
printf("Token %10s ( %3d, %12s )\n", tokenName[token.number], token.number, "");
}
- */
-
+
+
writeToken(token, outputFile);
} while (token.number != teof);
-
- /*
- printf(" === start of Parser\n");
- root = parser();
- printTree(root, 0);
- printf(" === start of ICG\n");
- codeGen(root);
- */
+
printf(" *** end of Mini C Compiler\n");
fclose(sourceFile);
fclose(outputFile);
-
-
}
-
-
-void icgError(int n)
-{
- printf("icg_error: %d\n", n);
- //3:printf("A Mini C Source file must be specified.!!!\n");
- //"error in DCL_SPEC"
- //"error in DCL_ITEM"
-}
-
diff --git a/MiniCScanner/Scanner.c b/MiniCScanner/Scanner.c
index 4189ecf..c3e3b96 100644
--- a/MiniCScanner/Scanner.c
+++ b/MiniCScanner/Scanner.c
@@ -3,22 +3,24 @@
* 2020. 5. 11 *
***************************************************************/
-
-
#include
#include
#include
+#include
#include "Scanner.h"
+/*
+ - 인식 키워드 추가: char, double, string,for, switch, case, default, continue, break
+ - 인식 리터럴 추가: 문자, 실수, 문자열
+ - 자바기준 documented comment /** ~ *\/
+ */
enum tsymbol tnum[NO_KEYWORD] = {
- tconst, telse, tif, tint, treturn, tvoid, twhile
+ tconst, telse, tif, tint, treturn, tvoid, twhile,
+ tchar, tdouble, tfor, tswitch, tcase, tdefault, tcontinue, tbreak
};
-
-
-
char* tokenName[] = {
"!", "!=", "%", "%=", "%ident", "%number",
/* 0 1 2 3 4 5 */
@@ -30,15 +32,21 @@ char* tokenName[] = {
/* 18 19 20 21 22 23 */
"==", ">", ">=", "[", "]", "eof",
/* 24 25 26 27 28 29 */
+ "%realnumber", "%character", "%string",
+ /* 30 31 32 실수, 문자, 문자열 literal 추가 */
// ........... word symbols ................................. //
- /* 30 31 32 33 34 35 */
"const", "else", "if", "int", "return", "void",
- /* 36 37 38 39 */
- "while", "{", "||", "}"
+ /* 33 34 35 36 37 38 */
+ "while", "{", "||", "}", "char", "double",
+ /* 39 40 41 42 43 44 */
+ "for", "switch", "case", "default", "continue", "break",
+ /* 45 46 47 48 49 50 */
};
char* keyword[NO_KEYWORD] = {
- "const", "else", "if", "int", "return", "void", "while"
+ /* 정수, 실수, 문자열 등의 keyword 추가 */
+ "const", "else", "if", "int", "return", "void", "while",
+ "char", "double", "for", "switch", "case", "default", "continue", "break"
};
struct tokenType scanner(FILE *sourceFile)
@@ -51,18 +59,23 @@ struct tokenType scanner(FILE *sourceFile)
do {
while (isspace(ch = fgetc(sourceFile))); // state 1: skip blanks
+ printf("%c", ch);
if (superLetter(ch)) { // identifier or keyword
i = 0;
do {
if (i < ID_LENGTH) id[i++] = ch;
ch = fgetc(sourceFile);
} while (superLetterOrDigit(ch));
+ // identifier의 길이는 12를 넘을 수 없다
if (i >= ID_LENGTH) lexicalError(1);
id[i] = '\0';
+ printf("id : %s\n", id);
ungetc(ch, sourceFile); // retract
+
// find the identifier in the keyword table
for (index = 0; index < NO_KEYWORD; index++)
if (!strcmp(id, keyword[index])) break;
+
if (index < NO_KEYWORD) // found, keyword exit
token.number = tnum[index];
else { // not found, identifier exit
@@ -71,123 +84,167 @@ struct tokenType scanner(FILE *sourceFile)
}
} // end of identifier or keyword
else if (isdigit(ch)) { // number
- token.number = tnumber;
- token.value.num = getNumber(sourceFile, ch);
- }
- else switch (ch) { // special character
- case '/':
- ch = fgetc(sourceFile);
- if (ch == '*') // text comment
- do {
- while (ch != '*') ch = fgetc(sourceFile);
- ch = fgetc(sourceFile);
- } while (ch != '/');
- else if (ch == '/') // line comment
- while (fgetc(sourceFile) != '\n');
- else if (ch == '=') token.number = tdivAssign;
- else {
- token.number = tdiv;
- ungetc(ch, sourceFile); // retract
- }
- break;
- case '!':
+ /*
+ floating point가 있으면 실수, 없으면 정수.
+ 첫 문자에 판단 및 두 계산을 동시에 진행하는 것은 불가능하므로
+ 정수 부분을 계산한 후, 남은 문자에 floating point가 존재하면 실수인 것으로 판단하고 추가 계산.
+ */
+ char tmp_ch = ch;
+ // 임시로 정수값을 저장
+ int tmp_num = getNumber(sourceFile, ch);
ch = fgetc(sourceFile);
- if (ch == '=') token.number = tnotequ;
- else {
- token.number = tnot;
- ungetc(ch, sourceFile); // retract
- }
- break;
- case '%':
- ch = fgetc(sourceFile);
- if (ch == '=') {
- token.number = tremAssign;
- }
- else {
- token.number = tremainder;
- ungetc(ch, sourceFile);
- }
- break;
- case '&':
- ch = fgetc(sourceFile);
- if (ch == '&') token.number = tand;
- else {
- lexicalError(2);
- ungetc(ch, sourceFile); // retract
- }
- break;
- case '*':
- ch = fgetc(sourceFile);
- if (ch == '=') token.number = tmulAssign;
- else {
- token.number = tmul;
- ungetc(ch, sourceFile); // retract
- }
- break;
- case '+':
- ch = fgetc(sourceFile);
- if (ch == '+') token.number = tinc;
- else if (ch == '=') token.number = taddAssign;
- else {
- token.number = tplus;
- ungetc(ch, sourceFile); // retract
- }
- break;
- case '-':
- ch = fgetc(sourceFile);
- if (ch == '-') token.number = tdec;
- else if (ch == '=') token.number = tsubAssign;
- else {
- token.number = tminus;
- ungetc(ch, sourceFile); // retract
- }
- break;
- case '<':
- ch = fgetc(sourceFile);
- if (ch == '=') token.number = tlesse;
- else {
- token.number = tless;
- ungetc(ch, sourceFile); // retract
- }
- break;
- case '=':
- ch = fgetc(sourceFile);
- if (ch == '=') token.number = tequal;
- else {
- token.number = tassign;
- ungetc(ch, sourceFile); // retract
+ if (ch == '.') {
+ // floating point가 있는 경우 실수로 판단하고 나머지 부분도 계산해야함.
+ float tmp_float = getDecPoint(sourceFile);
+ int tmp_exp = 1;
+ ch = fgetc(sourceFile);
+ if (ch == 'e') {
+ // 지수부가 존재하면 계산.
+ tmp_exp = getExpNum(sourceFile, ch);
+ }
+ token.number = trealnumber;
+ token.value.real_num = ((float)(tmp_num) + tmp_float)*pow(10, tmp_exp);
}
- break;
- case '>':
- ch = fgetc(sourceFile);
- if (ch == '=') token.number = tgreate;
else {
- token.number = tgreat;
- ungetc(ch, sourceFile); // retract
+ // 실수가 아닌 경우 정수로 판단.
+ token.number = tnumber;
+ token.value.num = tmp_num;
+ ungetc(ch, sourceFile); /* retract */
}
- break;
- case '|':
- ch = fgetc(sourceFile);
- if (ch == '|') token.number = tor;
- else {
- lexicalError(3);
- ungetc(ch, sourceFile); // retract
+ }
+ else if (ch == '\'') // character
+ {
+ /*
+ 문자는 작은 따옴표 ' 다음 문자 그리고 ' 가 순서대로 나열된다.
+ */
+ token.number = tcharacter;
+ token.value.character = fgetc(sourceFile); // 문자는 하나만 받을 수 있음.
+ char endc = fgetc(sourceFile);
+ //항상 ' 으로 끝나야 함.
+ if (endc != '\'')
+ {
+ lexicalError(5);
}
- break;
- case '(': token.number = tlparen; break;
- case ')': token.number = trparen; break;
- case ',': token.number = tcomma; break;
- case ';': token.number = tsemicolon; break;
- case '[': token.number = tlbracket; break;
- case ']': token.number = trbracket; break;
- case '{': token.number = tlbrace; break;
- case '}': token.number = trbrace; break;
- case EOF: token.number = teof; break;
- default: {
- printf("Current character : %c", ch);
- lexicalError(4);
- break;
}
+ else if (ch == '"') // string
+ { //
+ token.number = tstring;
+ strcpy_s(token.value.string, sizeof(token.value.string), getString(sourceFile));
+ }
+ else switch (ch) { // special character
+ case '/':
+ ch = fgetc(sourceFile);
+ if (ch == '*') // text comment
+ do {
+ while (ch != '*') ch = fgetc(sourceFile);
+ ch = fgetc(sourceFile);
+ } while (ch != '/');
+ else if (ch == '/') // line comment
+ while (fgetc(sourceFile) != '\n');
+ else if (ch == '=') token.number = tdivAssign;
+ else {
+ token.number = tdiv;
+ ungetc(ch, sourceFile); // retract
+ }
+ break;
+ case '!':
+ ch = fgetc(sourceFile);
+ if (ch == '=') token.number = tnotequ;
+ else {
+ token.number = tnot;
+ ungetc(ch, sourceFile); // retract
+ }
+ break;
+ case '%':
+ ch = fgetc(sourceFile);
+ if (ch == '=') {
+ token.number = tremAssign;
+ }
+ else {
+ token.number = tremainder;
+ ungetc(ch, sourceFile);
+ }
+ break;
+ case '&':
+ ch = fgetc(sourceFile);
+ if (ch == '&') token.number = tand;
+ else {
+ lexicalError(2);
+ ungetc(ch, sourceFile); // retract
+ }
+ break;
+ case '*':
+ ch = fgetc(sourceFile);
+ if (ch == '=') token.number = tmulAssign;
+ else {
+ token.number = tmul;
+ ungetc(ch, sourceFile); // retract
+ }
+ break;
+ case '+':
+ ch = fgetc(sourceFile);
+ if (ch == '+') token.number = tinc;
+ else if (ch == '=') token.number = taddAssign;
+ else {
+ token.number = tplus;
+ ungetc(ch, sourceFile); // retract
+ }
+ break;
+ case '-':
+ ch = fgetc(sourceFile);
+ if (ch == '-') token.number = tdec;
+ else if (ch == '=') token.number = tsubAssign;
+ else {
+ token.number = tminus;
+ ungetc(ch, sourceFile); // retract
+ }
+ break;
+ case '<':
+ ch = fgetc(sourceFile);
+ if (ch == '=') token.number = tlesse;
+ else {
+ token.number = tless;
+ ungetc(ch, sourceFile); // retract
+ }
+ break;
+ case '=':
+ ch = fgetc(sourceFile);
+ if (ch == '=') token.number = tequal;
+ else {
+ token.number = tassign;
+ ungetc(ch, sourceFile); // retract
+ }
+ break;
+ case '>':
+ ch = fgetc(sourceFile);
+ if (ch == '=') token.number = tgreate;
+ else {
+ token.number = tgreat;
+ ungetc(ch, sourceFile); // retract
+ }
+ break;
+ case '|':
+ ch = fgetc(sourceFile);
+ if (ch == '|') token.number = tor;
+ else {
+ lexicalError(3);
+ ungetc(ch, sourceFile); // retract
+ }
+ break;
+ case '(': token.number = tlparen; break;
+ case ')': token.number = trparen; break;
+ case ',': token.number = tcomma; break;
+ case ';': token.number = tsemicolon; break;
+ case '[': token.number = tlbracket; break;
+ case ']': token.number = trbracket; break;
+ case '{': token.number = tlbrace; break;
+ case '}': token.number = trbrace; break;
+ case EOF: token.number = teof; break;
+ default: {
+ printf("Current character : %c", ch);
+ lexicalError(4);
+ break;
+ }
} // switch end
} while (token.number == tnull);
@@ -206,6 +263,12 @@ void lexicalError(int n)
break;
case 4: printf("invalid character\n");
break;
+ case 5: printf("character form must be 'your character'. \n");
+ break;
+ case 6: printf("length of string must be less than 22.\n");
+ break;
+ default:
+ break;
}
}
@@ -221,6 +284,34 @@ int superLetterOrDigit(char ch)
else return 0;
}
+char* getString(FILE* sourcefile)
+{
+ /*
+ string의 길이는 22('\0' 포함)으로 고정.
+ */
+ char string[22] = "";
+ char end = 0;
+
+ char ch = fgetc(sourcefile);
+ do {
+ if (ch == '\\') {
+ /* \ 가 입력으로 들어온 경우
+ \을 제외한 모든 문자열을 한번 받고 돌아온다.
+ */
+ string[end++] = ch;
+ ch = fgetc(sourcefile);
+ string[end++] = ch;
+ }
+ else {
+ // 나머지 경우는 문자열에 붙임
+ string[end++] = ch;
+ }
+ ch = fgetc(sourcefile);
+ } while (ch != '"');
+ string[end] = '\0';
+ return string;
+}
+
int getNumber(FILE *sourceFile, char firstCharacter)
{
int num = 0;
@@ -246,11 +337,57 @@ int getNumber(FILE *sourceFile, char firstCharacter)
num = 10 * num + (int)(ch - '0');
ch = fgetc(sourceFile);
} while (isdigit(ch));
+ }
+ ungetc(ch, sourceFile); /* retract */
+ return num;
+}
+
+float getDecPoint(FILE* sourceFile)
+{
+ // floating point를 읽는 함수
+ float num = 0.0;
+ int exp=-1;
+ char ch;
+ // 실수 부분 읽기
+ ch = fgetc(sourceFile); // '.' 다음 정수를 읽음.
+ while (isdigit(ch)) {
+ num += (double)((ch - '0') * pow(10, exp--));
+ ch = fgetc(sourceFile);
}
ungetc(ch, sourceFile); /* retract */
return num;
}
+int getExpNum(FILE* sourceFile)
+{
+ // 지수부를 계산하는 함수
+ char ch;
+ int exp_num = 0; // 뒤에 숫자가 안붙는 경우는 0으로 처리
+ int flag = 1;
+ ch = fgetc(sourceFile);
+ /*
+ + or 바로 숫자가 나오는 경우 양의 지수
+ - 가 나오는 경우 음의 지수로 판단.
+ */
+ if (ch == '+') {
+ ch = fgetc(sourceFile);
+ }
+ else if (ch == '-') {
+ flag = -1;
+ ch = fgetc(sourceFile);
+ }
+ if (isdigit(ch))
+ {
+ do {
+ exp_num += (10 * exp_num + (int)(ch - '0'));
+ ch = fgetc(sourceFile);
+ } while (isdigit(ch));
+ }
+ exp_num *= flag;
+ ungetc(ch, sourceFile); /* retract */
+ return exp_num;
+}
+
int hexValue(char ch)
{
switch (ch) {
@@ -266,15 +403,24 @@ int hexValue(char ch)
}
void writeToken(struct tokenType token, FILE *outputFile)
-{
+{ //
if (token.number == tident) {
fprintf(outputFile, "Token %10s ( %3d, %12s )\n", tokenName[token.number], token.number, token.value.id);
}
else if (token.number == tnumber) {
fprintf(outputFile, "Token %10s ( %3d, %12d )\n", tokenName[token.number], token.number, token.value.num);
}
+ else if (token.number == trealnumber) {
+ fprintf(outputFile, "Token %10s ( %3d, %12.6f )\n", tokenName[token.number], token.number, token.value.real_num);
+ }
+ else if (token.number == tcharacter) {
+ fprintf(outputFile, "Token %10s ( %3d, %c )\n", tokenName[token.number], token.number, token.value.character);
+ }
+ else if (token.number == tstring) {
+ fprintf(outputFile, "Token %10s ( %3d, %s )\n", tokenName[token.number], token.number, token.value.string);
+ }
else {
fprintf(outputFile, "Token %10s ( %3d, %12s )\n", tokenName[token.number], token.number, "");
}
-}
+}
\ No newline at end of file
diff --git a/MiniCScanner/Scanner.h b/MiniCScanner/Scanner.h
index 33c8ae6..31fad65 100644
--- a/MiniCScanner/Scanner.h
+++ b/MiniCScanner/Scanner.h
@@ -11,16 +11,21 @@
#include
-#define NO_KEYWORD 7
-#define ID_LENGTH 12
-
-
+#define NO_KEYWORD 15
+#define ID_LENGTH 30
struct tokenType {
int number;
union {
+ /*
+ Ǽ , ڿ ߰.
+ ID_LENGTH 30 ø.
+ */
char id[ID_LENGTH];
- int num;
+ int num; //
+ float real_num; // Ǽ
+ char character; //
+ char string[22]; // ڿ (string symbol ̰ 7(%string)̱ 22 .)
} value;
};
@@ -36,21 +41,27 @@ enum tsymbol {
/* 18 19 20 21 22 23 */
tequal, tgreat, tgreate, tlbracket, trbracket, teof,
/* 24 25 26 27 28 29 */
+ trealnumber, tcharacter, tstring,
+ /* 30 31 32 Ǽ, , ڿ literal ߰ */
// ........... word symbols ................................. //
- /* 30 31 32 33 34 35 */
- tconst, telse, tif, tint, treturn, tvoid,
- /* 36 37 38 39 */
- twhile, tlbrace, tor, trbrace
+ /* 33 34 35 36 37 38 */
+ tconst, telse, tif, tint, treturn, tvoid,
+ /* 39 40 41 42 43 44 */
+ twhile, tlbrace, tor, trbrace, tchar, tdouble,
+ /* 45 46 47 48 49 50 */
+ tfor, tswitch, tcase, tdefault, tcontinue, tbreak,
};
int superLetter(char ch);
int superLetterOrDigit(char ch);
+char* getString(FILE* sourcefile);
int getNumber(FILE *sourceFile, char firstCharacter);
+float getDecPoint(FILE* sourceFile);
+int getExpNum(FILE* sourceFile);
int hexValue(char ch);
void lexicalError(int n);
struct tokenType scanner(FILE *sourceFile);
void writeToken(struct tokenType token, FILE* outputFile);
-
#endif // !SCANNER_H
diff --git a/MiniCScanner/Scanner.o b/MiniCScanner/Scanner.o
new file mode 100644
index 0000000..75a53b8
Binary files /dev/null and b/MiniCScanner/Scanner.o differ
diff --git a/MiniCScanner/a.out b/MiniCScanner/a.out
new file mode 100755
index 0000000..69a0756
Binary files /dev/null and b/MiniCScanner/a.out differ
diff --git a/MiniCScanner/char.mc b/MiniCScanner/char.mc
new file mode 100644
index 0000000..5464844
--- /dev/null
+++ b/MiniCScanner/char.mc
@@ -0,0 +1,6 @@
+void main()
+{
+ char ch;
+ ch = 'a';
+ write(i); // printf it
+}
\ No newline at end of file
diff --git a/MiniCScanner/for.mc b/MiniCScanner/for.mc
new file mode 100644
index 0000000..f8f9b12
--- /dev/null
+++ b/MiniCScanner/for.mc
@@ -0,0 +1,19 @@
+void main()
+{
+ // char, double, string,for, switch, case, default, continue, break
+ int x;
+ double y;
+ char t;
+ char a[10];
+ y = 3.141519e+10;
+ t = 'q';
+ a = "This is string.";
+ for( int i=0; i<=10; i++)
+ {
+ x = 333;
+ x++;
+ write(x);
+ x %= 10;
+ write(x);
+ }
+}
\ No newline at end of file
diff --git a/MiniCScanner/for.out b/MiniCScanner/for.out
new file mode 100644
index 0000000..6c43c4a
--- /dev/null
+++ b/MiniCScanner/for.out
@@ -0,0 +1,47 @@
+Token void ( 35, )
+Token %ident ( 4, main )
+Token ( ( 7, )
+Token ) ( 8, )
+Token { ( 37, )
+Token int ( 33, )
+Token %ident ( 4, x )
+Token ; ( 20, )
+Token for ( 42, )
+Token ( ( 7, )
+Token int ( 33, )
+Token %ident ( 4, i )
+Token = ( 23, )
+Token %number ( 5, 0 )
+Token ; ( 20, )
+Token %ident ( 4, i )
+Token <= ( 22, )
+Token %number ( 5, 10 )
+Token ; ( 20, )
+Token %ident ( 4, i )
+Token ++ ( 12, )
+Token ) ( 8, )
+Token { ( 37, )
+Token %ident ( 4, x )
+Token = ( 23, )
+Token %number ( 5, 333 )
+Token ; ( 20, )
+Token %ident ( 4, x )
+Token ++ ( 12, )
+Token ; ( 20, )
+Token %ident ( 4, write )
+Token ( ( 7, )
+Token %ident ( 4, x )
+Token ) ( 8, )
+Token ; ( 20, )
+Token %ident ( 4, x )
+Token %= ( 3, )
+Token %number ( 5, 10 )
+Token ; ( 20, )
+Token %ident ( 4, write )
+Token ( ( 7, )
+Token %ident ( 4, x )
+Token ) ( 8, )
+Token ; ( 20, )
+Token } ( 39, )
+Token } ( 39, )
+Token eof ( 29, )
diff --git a/MiniCScanner/mod.mc b/MiniCScanner/mod.mc
new file mode 100644
index 0000000..de40d3c
--- /dev/null
+++ b/MiniCScanner/mod.mc
@@ -0,0 +1,10 @@
+void main()
+{
+ int x;
+
+ x = 333;
+ x++;
+ write(x);
+ x %= 10;
+ write(x);
+}
diff --git a/MiniCScanner/mod.out b/MiniCScanner/mod.out
new file mode 100644
index 0000000..204099f
--- /dev/null
+++ b/MiniCScanner/mod.out
@@ -0,0 +1,31 @@
+Token void ( 35, )
+Token %ident ( 4, main )
+Token ( ( 7, )
+Token ) ( 8, )
+Token { ( 37, )
+Token int ( 33, )
+Token %ident ( 4, x )
+Token ; ( 20, )
+Token %ident ( 4, x )
+Token = ( 23, )
+Token %number ( 5, 333 )
+Token ; ( 20, )
+Token %ident ( 4, x )
+Token ++ ( 12, )
+Token ; ( 20, )
+Token %ident ( 4, write )
+Token ( ( 7, )
+Token %ident ( 4, x )
+Token ) ( 8, )
+Token ; ( 20, )
+Token %ident ( 4, x )
+Token %= ( 3, )
+Token %number ( 5, 10 )
+Token ; ( 20, )
+Token %ident ( 4, write )
+Token ( ( 7, )
+Token %ident ( 4, x )
+Token ) ( 8, )
+Token ; ( 20, )
+Token } ( 39, )
+Token eof ( 29, )
diff --git a/MiniCScanner/new_keyword.mc b/MiniCScanner/new_keyword.mc
new file mode 100644
index 0000000..a70513a
--- /dev/null
+++ b/MiniCScanner/new_keyword.mc
@@ -0,0 +1,25 @@
+void main()
+{
+ char ch;
+ char chs[10];
+ string str;
+ int x;
+ double y;
+ ch = 't';
+ chs = "test";
+ str = "string?";
+ x = 10;
+ y = 3.141519e+10;
+ for(int i=0;i<3;i++) {
+ if(i==1) break;
+ else continue;
+ }
+ switch(ch)
+ {
+ case 't':
+ read(ch);
+ break;
+ default:
+ break;
+ }
+}
diff --git a/MiniCScanner/x64/Debug/MiniCScanner.log b/MiniCScanner/x64/Debug/MiniCScanner.log
new file mode 100644
index 0000000..2ee3c62
--- /dev/null
+++ b/MiniCScanner/x64/Debug/MiniCScanner.log
@@ -0,0 +1,5 @@
+ MiniCScannerTester.c
+C:\Users\speci\OneDrive\바탕 화면\MiniCScanner\MiniCScanner\MiniCScannerTester.c(58,10): warning C4473: 'printf' : not enough arguments passed for format string
+C:\Users\speci\OneDrive\바탕 화면\MiniCScanner\MiniCScanner\MiniCScannerTester.c(58,10): message : placeholders and their parameters expect 1 variadic arguments, but 0 were provided
+C:\Users\speci\OneDrive\바탕 화면\MiniCScanner\MiniCScanner\MiniCScannerTester.c(58,10): message : the missing variadic argument 1 is required by format string '%c'
+ MiniCScanner.vcxproj -> C:\Users\speci\OneDrive\바탕 화면\MiniCScanner\x64\Debug\MiniCScanner.exe
diff --git a/MiniCScanner/x64/Debug/MiniCScanner.tlog/CL.command.1.tlog b/MiniCScanner/x64/Debug/MiniCScanner.tlog/CL.command.1.tlog
new file mode 100644
index 0000000..3bdd35b
Binary files /dev/null and b/MiniCScanner/x64/Debug/MiniCScanner.tlog/CL.command.1.tlog differ
diff --git a/MiniCScanner/x64/Debug/MiniCScanner.tlog/CL.read.1.tlog b/MiniCScanner/x64/Debug/MiniCScanner.tlog/CL.read.1.tlog
new file mode 100644
index 0000000..64be42e
Binary files /dev/null and b/MiniCScanner/x64/Debug/MiniCScanner.tlog/CL.read.1.tlog differ
diff --git a/MiniCScanner/x64/Debug/MiniCScanner.tlog/CL.write.1.tlog b/MiniCScanner/x64/Debug/MiniCScanner.tlog/CL.write.1.tlog
new file mode 100644
index 0000000..77937bc
Binary files /dev/null and b/MiniCScanner/x64/Debug/MiniCScanner.tlog/CL.write.1.tlog differ
diff --git a/MiniCScanner/x64/Debug/MiniCScanner.tlog/MiniCScanner.lastbuildstate b/MiniCScanner/x64/Debug/MiniCScanner.tlog/MiniCScanner.lastbuildstate
new file mode 100644
index 0000000..10fd3d3
--- /dev/null
+++ b/MiniCScanner/x64/Debug/MiniCScanner.tlog/MiniCScanner.lastbuildstate
@@ -0,0 +1,2 @@
+#TargetFrameworkVersion=v4.0:PlatformToolSet=v142:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit:WindowsTargetPlatformVersion=10.0
+Debug|x64|C:\Users\speci\OneDrive\바탕 화면\MiniCScanner\|
diff --git a/MiniCScanner/x64/Debug/MiniCScanner.tlog/link.command.1.tlog b/MiniCScanner/x64/Debug/MiniCScanner.tlog/link.command.1.tlog
new file mode 100644
index 0000000..e6b9110
Binary files /dev/null and b/MiniCScanner/x64/Debug/MiniCScanner.tlog/link.command.1.tlog differ
diff --git a/MiniCScanner/x64/Debug/MiniCScanner.tlog/link.read.1.tlog b/MiniCScanner/x64/Debug/MiniCScanner.tlog/link.read.1.tlog
new file mode 100644
index 0000000..2ff63cf
Binary files /dev/null and b/MiniCScanner/x64/Debug/MiniCScanner.tlog/link.read.1.tlog differ
diff --git a/MiniCScanner/x64/Debug/MiniCScanner.tlog/link.write.1.tlog b/MiniCScanner/x64/Debug/MiniCScanner.tlog/link.write.1.tlog
new file mode 100644
index 0000000..d3d5a8b
Binary files /dev/null and b/MiniCScanner/x64/Debug/MiniCScanner.tlog/link.write.1.tlog differ
diff --git a/MiniCScanner/x64/Debug/MiniCScannerTester.obj b/MiniCScanner/x64/Debug/MiniCScannerTester.obj
new file mode 100644
index 0000000..b69b284
Binary files /dev/null and b/MiniCScanner/x64/Debug/MiniCScannerTester.obj differ
diff --git a/MiniCScanner/x64/Debug/Scanner.obj b/MiniCScanner/x64/Debug/Scanner.obj
new file mode 100644
index 0000000..c3f6750
Binary files /dev/null and b/MiniCScanner/x64/Debug/Scanner.obj differ
diff --git a/MiniCScanner/x64/Debug/vc142.idb b/MiniCScanner/x64/Debug/vc142.idb
new file mode 100644
index 0000000..6b945b2
Binary files /dev/null and b/MiniCScanner/x64/Debug/vc142.idb differ
diff --git a/MiniCScanner/x64/Debug/vc142.pdb b/MiniCScanner/x64/Debug/vc142.pdb
new file mode 100644
index 0000000..2ed9a69
Binary files /dev/null and b/MiniCScanner/x64/Debug/vc142.pdb differ
diff --git a/test b/test
new file mode 100644
index 0000000..5f2f16b
--- /dev/null
+++ b/test
@@ -0,0 +1 @@
+1111