From f1ce8b9812a370a600a7447dbac86e4c534f9e9d Mon Sep 17 00:00:00 2001 From: bangji Date: Tue, 26 May 2020 20:23:39 +0900 Subject: [PATCH 1/4] v0.1 --- MiniCScanner/Scanner.c | 46 ++++++++++++++++++++++++++++++++--------- MiniCScanner/Scanner.h | 6 ++---- MiniCScanner/Scanner.o | Bin 0 -> 6872 bytes MiniCScanner/a.out | Bin 0 -> 13764 bytes MiniCScanner/mod.mc | 10 +++++++++ 5 files changed, 48 insertions(+), 14 deletions(-) create mode 100644 MiniCScanner/Scanner.o create mode 100755 MiniCScanner/a.out create mode 100644 MiniCScanner/mod.mc diff --git a/MiniCScanner/Scanner.c b/MiniCScanner/Scanner.c index 4189ecf..e18b08d 100644 --- a/MiniCScanner/Scanner.c +++ b/MiniCScanner/Scanner.c @@ -3,8 +3,6 @@ * 2020. 5. 11 * ***************************************************************/ - - #include #include #include @@ -16,9 +14,6 @@ enum tsymbol tnum[NO_KEYWORD] = { tconst, telse, tif, tint, treturn, tvoid, twhile }; - - - char* tokenName[] = { "!", "!=", "%", "%=", "%ident", "%number", /* 0 1 2 3 4 5 */ @@ -31,14 +26,18 @@ char* tokenName[] = { "==", ">", ">=", "[", "]", "eof", /* 24 25 26 27 28 29 */ // ........... word symbols ................................. // - /* 30 31 32 33 34 35 */ "const", "else", "if", "int", "return", "void", - /* 36 37 38 39 */ - "while", "{", "||", "}" + /* 30 31 32 33 34 35 */ + "while", "{", "||", "}", "char", "double", + /* 36 37 38 39 40 41 */ + "for", "switch", "case", "default", "continue", "break" + /* 42 43 44 45 46 47 */ }; 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) @@ -67,7 +66,8 @@ struct tokenType scanner(FILE *sourceFile) token.number = tnum[index]; else { // not found, identifier exit token.number = tident; - strcpy_s(token.value.id, ID_LENGTH, id); + strcpy(token.value.id,id); + //strcpy_s(token.value.id, ID_LENGTH, id); } } // end of identifier or keyword else if (isdigit(ch)) { // number @@ -278,3 +278,29 @@ void writeToken(struct tokenType token, FILE *outputFile) } } + +// File을 open하는 함수 +FILE* fileOpen(char *filename) +{ + char file_path[30] = "../Examples/"; + strcat(file_path, filename); + FILE* pFile = fopen(file_path, "r"); + return pFile; +} + +int main() +{ + struct tokenType token; + //char token[50][50]; + char filename[30] = "mod.mc"; + int index = 0; + FILE* pFile = fileOpen(filename); + if(pFile == NULL) + { + return 0; + } + token = scanner(pFile); + printf("%d %s %d\n", token.number, token.value.id, token.value.num); + fclose(pFile); + return 0; +} diff --git a/MiniCScanner/Scanner.h b/MiniCScanner/Scanner.h index 33c8ae6..892fa4d 100644 --- a/MiniCScanner/Scanner.h +++ b/MiniCScanner/Scanner.h @@ -11,11 +11,9 @@ #include -#define NO_KEYWORD 7 +#define NO_KEYWORD 15 #define ID_LENGTH 12 - - struct tokenType { int number; union { @@ -51,6 +49,6 @@ int hexValue(char ch); void lexicalError(int n); struct tokenType scanner(FILE *sourceFile); void writeToken(struct tokenType token, FILE* outputFile); - +FILE* fileOpen(char *filename); #endif // !SCANNER_H diff --git a/MiniCScanner/Scanner.o b/MiniCScanner/Scanner.o new file mode 100644 index 0000000000000000000000000000000000000000..75a53b8767b20fb401caf739acd7f9b41ca6a77a GIT binary patch literal 6872 zcmd5>4Qx}_6}~BfKuUSpMpxR6VYY@+sHvf2{dE;a-t<}#h7e(_8+{nZiQOblYC9!m z$pkp2ei*N40>P&KWE*Ocx=E~RwM}cmA#Cwlrbb$|vNhGxtz~{B?Sj+^7c#u>ynCMQ zm_(VTPTEcG`|dgS-0z-y-u<)v#-$IgR0vTvL*Rit6WMP))>8=W(?ZZYs97N6hT;TDUHAF*#*nAgCmWRd z*USF6*uSNpk$g-quElG$%Y>_t(UtYi#k@*kWyrT86ICZF3CRhvi{pXNi3}#h7!Z77 z19EW!i=fP*FRq%lT(24LYr98#VW=gnNuwo%W~f=s=pGzUGdU!aShPgrvXL4kYT%7_UW7l^OMCH1CCY z?dqXY?jn|0A9$_i`)Pwzo>a){%)f_V^)(kSwDmj z(Q?s}YDSBu$~9x)1igmi(n&*o#XO4oiGle%4A73crjaWrI%L!gb<}*+vQ`IjDWfl% z`L1Tv9XHgUDo?C}UQ5pWIYFZCxaOT7*UC=i{#qJ3bs(Buro2W`p`4KF9vbMx z7UnPpI#DI9Z&zX|RGEG>$!iwdwD}g%Y$ZNYp+8715YWzer6oRf{z zneTx1qDecT^T+Oh_SBLN4#*Cko}z<75NLVXJhVZS@a#7qnwEn0Nt=SEMhQjSykS}j zdY3i@9la$KJ?5KGP8O-Ie595Tg*7K=f=xCjcA4Kp4ORpl(B>Xlo=xS)WSP!7^ATCb z`76waW%+Yd-YCnod6-|5W!i+ydt~_*DzA{`g;f3`9<;S+Np}vN@Q!p68;CGsU0AG^ zi$#kM71*dVIi=^?OSC6oM@!U?X$jsn=U|h~YIk4Ij95GE8O9+$K#5VrwS?3qESFhu0`uov6aX!fSN%K#~w;BDWG4Aa^>wXa(t*VJ<nL2`)k3_RulpcNo5IU6@Icx0(rN;86hs#Mci@kyTOsHdh z!{sy7Q9~Uwe@|X@Sv?Z1OWE(u3wJ6{ZnkNyMl+NXbt6&JRhCB6LPw|K^&=E_>6t5D zcV5|FaPCg!8Mu9ZpL+gSnG$=6`ja!n8mQdC?nO8I)QfR-q*)!SoVpjxz>&fX93(EZ zr2T$`_BZ+3yT=UmJtK?gJGS;0qOB~dvF2Z4E*l?5`v#+CrP2M7Q8%XSxuY=HkD{rQ z(abD_P1&=2g8ErYol*8!Ck8dK7D2{ksN*J?N^wmzRY@9o9ATAYJgnj60pD|29>pH! z=Y#92%X~&NIxt1*hq1+%E3rG#58^+Jn{6h4F`nO-sDs2;+2raboMaCesr-x{GF#CM z1T&SGYf6IJggUAvSJ$F(zU5i#Xqu|S)mL!QS(lticei|#H+eE*L6EDo)^Pl!mDntj zt%YH|ErqT(`Sb;p79l&37bDXt_$B0}PF~%1df5v#6@kPd$8Gpg}E5=tD`x(=WuQR^E z_(#UK8Q*368{;{~|CVpDSnL+nq8g7tgD)5n)xnO|?Y@v$vP3M!r{85_nOiIu%kl3P zw+W|k;@^$03~qOed&Pa?KDWT1Tih@1cZ+X{t-{yVD7euUcV=VZwGuK$32c}uW&3|w#>24*BS77S{!O9 z)JA&Y2|6q%1C0R~w)lcg5x=9gBOGyT_dyJY9T7ilR<2r6DT4TVrHIwGS~6u#S0y}s z%+nHRC^V}So7$RvK}YpUSJ<)CQGG|lZ78n_J8qq#rh#gTQvx6WCntCxunje*LRr?gzZDvOEwJnT5A0|xX}06IOv?8P z?6zfPzZ{=Q?cRgkv5%!4$7xc#xfr+OlCKA&r{vpv`OFVLW1{~VC` z4zcWIc_Ygz5dY4Fte?yJKjS2%cE1A>&taCkSiXHUsIs(5Gjt zA*U0Fd&9zusKggC&JTg0Sok`S`gs{h{u}`!bk2Q1;-ycW2#J&KSGf8)SFoOr1Bx%L zMYNkm{SxkC>||_b^fPW_+`_nlQDdxOyo=GrxRlYsxPY;WaW!4RaWbflovuy9%za|+I#YHb1iTogY z`&?LS%RowBL8f~9+`(G3Wc!?HCK-J8?*z}YJch|eNk^vk_PMYVGIeLC(tUg{$V-TI2bo|C!RrYIaaGcre3A9?)}-S{6K`v~(07Ca5ubH=5PAexD(cVE zVij~4dA!ZK*Wau+dIBv%Z*0deEs;i{+vxXoZuYcv_|TT_AM5F74iJR#0}2YwzQ=d8 cg&Oc1PZ3j7hlf-hK{(?Dr3C7<-R}|N-+yjm&Hw-a literal 0 HcmV?d00001 diff --git a/MiniCScanner/a.out b/MiniCScanner/a.out new file mode 100755 index 0000000000000000000000000000000000000000..69a0756b584d11626d0ed4a21b5a0dd1935c167f GIT binary patch literal 13764 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 Oa@HniQ95NgX6!$ZA}w Date: Thu, 28 May 2020 00:03:53 +0900 Subject: [PATCH 2/4] v0.2 --- Examples/for.mc | 13 + MiniCScanner/MiniCScanner.vcxproj.filters | 2 +- MiniCScanner/MiniCScanner.vcxproj.user | 4 + MiniCScanner/MiniCScannerTester.c | 8 +- MiniCScanner/Scanner.c | 265 ++++++++---------- MiniCScanner/Scanner.h | 9 +- MiniCScanner/for.mc | 13 + MiniCScanner/for.out | 47 ++++ MiniCScanner/mod.out | 31 ++ MiniCScanner/x64/Debug/MiniCScanner.log | 5 + .../Debug/MiniCScanner.tlog/CL.command.1.tlog | Bin 0 -> 1562 bytes .../Debug/MiniCScanner.tlog/CL.read.1.tlog | Bin 0 -> 8700 bytes .../Debug/MiniCScanner.tlog/CL.write.1.tlog | Bin 0 -> 1874 bytes .../MiniCScanner.lastbuildstate | 2 + .../MiniCScanner.tlog/link.command.1.tlog | Bin 0 -> 1558 bytes .../Debug/MiniCScanner.tlog/link.read.1.tlog | Bin 0 -> 3472 bytes .../Debug/MiniCScanner.tlog/link.write.1.tlog | Bin 0 -> 766 bytes MiniCScanner/x64/Debug/MiniCScannerTester.obj | Bin 0 -> 15082 bytes MiniCScanner/x64/Debug/Scanner.obj | Bin 0 -> 35359 bytes MiniCScanner/x64/Debug/vc142.idb | Bin 0 -> 76800 bytes MiniCScanner/x64/Debug/vc142.pdb | Bin 0 -> 86016 bytes 21 files changed, 249 insertions(+), 150 deletions(-) create mode 100644 Examples/for.mc create mode 100644 MiniCScanner/for.mc create mode 100644 MiniCScanner/for.out create mode 100644 MiniCScanner/mod.out create mode 100644 MiniCScanner/x64/Debug/MiniCScanner.log create mode 100644 MiniCScanner/x64/Debug/MiniCScanner.tlog/CL.command.1.tlog create mode 100644 MiniCScanner/x64/Debug/MiniCScanner.tlog/CL.read.1.tlog create mode 100644 MiniCScanner/x64/Debug/MiniCScanner.tlog/CL.write.1.tlog create mode 100644 MiniCScanner/x64/Debug/MiniCScanner.tlog/MiniCScanner.lastbuildstate create mode 100644 MiniCScanner/x64/Debug/MiniCScanner.tlog/link.command.1.tlog create mode 100644 MiniCScanner/x64/Debug/MiniCScanner.tlog/link.read.1.tlog create mode 100644 MiniCScanner/x64/Debug/MiniCScanner.tlog/link.write.1.tlog create mode 100644 MiniCScanner/x64/Debug/MiniCScannerTester.obj create mode 100644 MiniCScanner/x64/Debug/Scanner.obj create mode 100644 MiniCScanner/x64/Debug/vc142.idb create mode 100644 MiniCScanner/x64/Debug/vc142.pdb 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..da85b19 100644 --- a/MiniCScanner/MiniCScannerTester.c +++ b/MiniCScanner/MiniCScannerTester.c @@ -18,7 +18,8 @@ void icgError(int n); int main(int argc, char *argv[]) { - char fileName[30] = "", buffer[30] = ""; + char fileName[30] = ""; + char buffer[30] = ""; struct tokenType token; int errorNo = 0; char *fileNamePtr = NULL, *context = NULL; @@ -54,9 +55,10 @@ int main(int argc, char *argv[]) do { token = scanner(sourceFile); + printf("%c"); // write on console - /* + if (token.number == tident) { printf("Token %10s ( %3d, %12s )\n", tokenName[token.number], token.number, token.value.id); } @@ -66,7 +68,7 @@ int main(int argc, char *argv[]) else { printf("Token %10s ( %3d, %12s )\n", tokenName[token.number], token.number, ""); } - */ + writeToken(token, outputFile); diff --git a/MiniCScanner/Scanner.c b/MiniCScanner/Scanner.c index e18b08d..352132a 100644 --- a/MiniCScanner/Scanner.c +++ b/MiniCScanner/Scanner.c @@ -11,7 +11,8 @@ 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[] = { @@ -50,24 +51,28 @@ 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'; 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 token.number = tident; - strcpy(token.value.id,id); - //strcpy_s(token.value.id, ID_LENGTH, id); + //strcpy(token.value.id,id); + strcpy_s(token.value.id, ID_LENGTH, id); } } // end of identifier or keyword else if (isdigit(ch)) { // number @@ -75,119 +80,119 @@ struct tokenType scanner(FILE *sourceFile) 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 '!': - 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 + 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; } - 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); @@ -266,7 +271,7 @@ 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); } @@ -277,30 +282,4 @@ void writeToken(struct tokenType token, FILE *outputFile) fprintf(outputFile, "Token %10s ( %3d, %12s )\n", tokenName[token.number], token.number, ""); } -} - -// File을 open하는 함수 -FILE* fileOpen(char *filename) -{ - char file_path[30] = "../Examples/"; - strcat(file_path, filename); - FILE* pFile = fopen(file_path, "r"); - return pFile; -} - -int main() -{ - struct tokenType token; - //char token[50][50]; - char filename[30] = "mod.mc"; - int index = 0; - FILE* pFile = fileOpen(filename); - if(pFile == NULL) - { - return 0; - } - token = scanner(pFile); - printf("%d %s %d\n", token.number, token.value.id, token.value.num); - fclose(pFile); - return 0; -} +} \ No newline at end of file diff --git a/MiniCScanner/Scanner.h b/MiniCScanner/Scanner.h index 892fa4d..bff7bef 100644 --- a/MiniCScanner/Scanner.h +++ b/MiniCScanner/Scanner.h @@ -36,9 +36,12 @@ enum tsymbol { /* 24 25 26 27 28 29 */ // ........... word symbols ................................. // /* 30 31 32 33 34 35 */ - tconst, telse, tif, tint, treturn, tvoid, - /* 36 37 38 39 */ - twhile, tlbrace, tor, trbrace + tconst, telse, tif, tint, treturn, tvoid, + /* 36 37 38 39 40 41 */ + twhile, tlbrace, tor, trbrace, tchar, tdouble, + /* 42 43 44 45 46 47 */ + tfor, tswitch, tcase, tdefault, tcontinue, tbreak + }; diff --git a/MiniCScanner/for.mc b/MiniCScanner/for.mc new file mode 100644 index 0000000..265016f --- /dev/null +++ b/MiniCScanner/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/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.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/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 0000000000000000000000000000000000000000..3bdd35bf9126d592b4aab536dfab9792bdfbd10d GIT binary patch literal 1562 zcmeH{%T5AO42J);i8~*Fuot2d7wmL^5hGx@NytQFxF`uC8BpKN_z-UNan!Hpj6tI; zTxeXdIBicae@{E@yuO?&P+pN*YN)6>G~yg12Pz}iR7EaeDXWbXY2)GPF{S47{610z zZIu%c6KD_Fyz6)^w|w@@5Vx*1Wz|y(+6B${Aqat!Cc4&`bHOpoiFOj+(WaC78tELn zdCoNF)`RDv7I~v9EEYLapSwvlB;y6>8MLT|9}yZEo>@_*fp7CsuiX^;4edNQO2FokioTmz z_~DTP+59PVp~6FoTAk_o;RnO7@kQXxTS4V8a^SufYvk;3*9>w6oF;Y0y4!imT zmuSZw9$jf~TZCOMwU2xiT}zWfHxxVQU-(AzUwia~8CKLzsZ~thATr%K$`Joa_8HX8 z8L46>#fI`tT?&U>g^fMO>KXdcHN5S1(X|oHIfYTir>EMhk7&-rW6S4xA{a6I(>DoS zZ42KXvAg~^Gb464+^tyGmg@*R#(T2(P_etR8?n2;y^Zb4Zp7~T`_DQO8nL?}Zo1>e G?tTN8;Hc67 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..77937bc88d6382302701777892c8b9b708d83c89 GIT binary patch literal 1874 zcmezWFOI>P!HOY;0a{=Gx!17E{AC4N8}J4l0+S$EH6p)Vu~wxZ%nl psJQ^)X8Pw-^za+(xq<#6L|hyW_Hd(jDNCq)8(gIbadC{urvOVcIu8H< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e6b9110890168b6061817fd9fb73a6e998975837 GIT binary patch literal 1558 zcmd6n%}T>S6ot=PaOVSrZrmyU;G*CniLpl0H1tPXD1tvNh*iO=E1yh!2sipT>USqC zCDjTFLJ2dubMKj%Gxyw?kN0DRDyyrO8j4h>@6s~tP%(B*DfSMLSch0$Ej_=!cxt}g zJ#|&Zo6+4#9OQ3x{&IRM*dB@xqwV+ja zw%}Y=>7SVXCW9;Fu1zb+gPExnlFJBvBJ3ubB`%V}I-yl)o(_oCotB9T!Dl-yxE3V_?J%m&CWwnO(;FRzcXBg|~Tc7V#D56{V zV)mGDsWA%3Nf9^phA=5cR$*>+9&49uTeJaDvcic?16g7=w z=1w{=*14M*;4R literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2ff63cfa019196bdadea8b1bf4a3eab4825448d3 GIT binary patch literal 3472 zcmd6pOHS)R5Jm48i5Uy<5GEGkAq31EhvfO;Ph_|G$zl}@Ss7vxOkg?iPPJo&AbuhP zT2b27?W*>zU-x}^zE-MZb!yeP?XC5UbHSKa!ZX7z!8&85gk>~5 zYdbt-U`Nkbp!{EvF}G?RJO9@TLYgOEX?b5x<5S6EG848 rW&E_SjGr>a@O-lz*S;34cFn(aa<|$cKjY|z$5CHHU9}$J+nV|h#Ny-g literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d3d5a8b92b5da9cc0b1bd4081ad98d792dae2a21 GIT binary patch literal 766 zcmezWFOI>P!HOY;0a{=Gx!17E)Xb9gpe|pqgL?5E;av z2Xu=QgBL^1pl~s&e_?LpW#FQb>qrSTJz#i60P$dPjVFT-gZH3uO#m?EIe}dR0D5?W AXaE2J literal 0 HcmV?d00001 diff --git a/MiniCScanner/x64/Debug/MiniCScannerTester.obj b/MiniCScanner/x64/Debug/MiniCScannerTester.obj new file mode 100644 index 0000000000000000000000000000000000000000..b69b2843ff72d1cbb5d296cf14d078b55d782144 GIT binary patch literal 15082 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 literal 0 HcmV?d00001 diff --git a/MiniCScanner/x64/Debug/Scanner.obj b/MiniCScanner/x64/Debug/Scanner.obj new file mode 100644 index 0000000000000000000000000000000000000000..c3f6750420fd8a9ec617eedf46ccac74247f8baf GIT binary patch literal 35359 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 E3&<$CYXATM literal 0 HcmV?d00001 From e5ed7cb62cd1550ba73e458111122100ae4acbd4 Mon Sep 17 00:00:00 2001 From: VaporSiriz Date: Sat, 30 May 2020 03:08:51 +0900 Subject: [PATCH 3/4] v0.2 --- MiniCScanner/MiniCScannerTester.c | 78 ++++++++------- MiniCScanner/Scanner.c | 155 ++++++++++++++++++++++++++++-- MiniCScanner/Scanner.h | 26 +++-- MiniCScanner/char.mc | 6 ++ MiniCScanner/for.mc | 8 +- MiniCScanner/new_keyword.mc | 25 +++++ 6 files changed, 246 insertions(+), 52 deletions(-) create mode 100644 MiniCScanner/char.mc create mode 100644 MiniCScanner/new_keyword.mc diff --git a/MiniCScanner/MiniCScannerTester.c b/MiniCScanner/MiniCScannerTester.c index da85b19..9524f62 100644 --- a/MiniCScanner/MiniCScannerTester.c +++ b/MiniCScanner/MiniCScannerTester.c @@ -14,29 +14,48 @@ FILE* outputFile; // output file extern char* tokenName[]; void icgError(int n); +void startScanner(char* fn); int main(int argc, char *argv[]) { + printf(" *** start of Mini C Compiler\n"); + if (argc < 2) { + icgError(1); + exit(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; + char* fileNamePtr = NULL, * context = NULL; - printf(" *** start of Mini C Compiler\n"); - if (argc != 2) { - icgError(1); - exit(1); - } - strncpy_s(fileName, sizeof(fileName), argv[1], sizeof(fileName)-1); + 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"); @@ -49,52 +68,39 @@ int main(int argc, char *argv[]) exit(1); } - // Test code for scanner printf(" === start of Scanner\n"); - + do { token = scanner(sourceFile); - printf("%c"); - // 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 352132a..c3e3b96 100644 --- a/MiniCScanner/Scanner.c +++ b/MiniCScanner/Scanner.c @@ -6,9 +6,15 @@ #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, @@ -26,13 +32,15 @@ char* tokenName[] = { /* 18 19 20 21 22 23 */ "==", ">", ">=", "[", "]", "eof", /* 24 25 26 27 28 29 */ + "%realnumber", "%character", "%string", + /* 30 31 32 실수, 문자, 문자열 literal 추가 */ // ........... word symbols ................................. // "const", "else", "if", "int", "return", "void", - /* 30 31 32 33 34 35 */ + /* 33 34 35 36 37 38 */ "while", "{", "||", "}", "char", "double", - /* 36 37 38 39 40 41 */ - "for", "switch", "case", "default", "continue", "break" - /* 42 43 44 45 46 47 */ + /* 39 40 41 42 43 44 */ + "for", "switch", "case", "default", "continue", "break", + /* 45 46 47 48 49 50 */ }; char* keyword[NO_KEYWORD] = { @@ -61,6 +69,7 @@ struct tokenType scanner(FILE *sourceFile) // 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 @@ -71,13 +80,56 @@ struct tokenType scanner(FILE *sourceFile) token.number = tnum[index]; else { // not found, identifier exit token.number = tident; - //strcpy(token.value.id,id); strcpy_s(token.value.id, ID_LENGTH, id); } } // end of identifier or keyword else if (isdigit(ch)) { // number - token.number = tnumber; - token.value.num = getNumber(sourceFile, ch); + /* + floating point가 있으면 실수, 없으면 정수. + 첫 문자에 판단 및 두 계산을 동시에 진행하는 것은 불가능하므로 + 정수 부분을 계산한 후, 남은 문자에 floating point가 존재하면 실수인 것으로 판단하고 추가 계산. + */ + char tmp_ch = ch; + // 임시로 정수값을 저장 + int tmp_num = getNumber(sourceFile, ch); + ch = fgetc(sourceFile); + 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); + } + else { + // 실수가 아닌 경우 정수로 판단. + token.number = tnumber; + token.value.num = tmp_num; + ungetc(ch, sourceFile); /* retract */ + } + } + else if (ch == '\'') // character + { + /* + 문자는 작은 따옴표 ' 다음 문자 그리고 ' 가 순서대로 나열된다. + */ + token.number = tcharacter; + token.value.character = fgetc(sourceFile); // 문자는 하나만 받을 수 있음. + char endc = fgetc(sourceFile); + //항상 ' 으로 끝나야 함. + if (endc != '\'') + { + lexicalError(5); + } + } + else if (ch == '"') // string + { // + token.number = tstring; + strcpy_s(token.value.string, sizeof(token.value.string), getString(sourceFile)); } else switch (ch) { // special character case '/': @@ -211,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; } } @@ -226,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; @@ -251,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) { @@ -278,6 +410,15 @@ void writeToken(struct tokenType token, FILE *outputFile) 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, ""); } diff --git a/MiniCScanner/Scanner.h b/MiniCScanner/Scanner.h index bff7bef..31fad65 100644 --- a/MiniCScanner/Scanner.h +++ b/MiniCScanner/Scanner.h @@ -12,13 +12,20 @@ #include #define NO_KEYWORD 15 -#define ID_LENGTH 12 +#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; }; @@ -34,24 +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 */ + /* 33 34 35 36 37 38 */ tconst, telse, tif, tint, treturn, tvoid, - /* 36 37 38 39 40 41 */ + /* 39 40 41 42 43 44 */ twhile, tlbrace, tor, trbrace, tchar, tdouble, - /* 42 43 44 45 46 47 */ - tfor, tswitch, tcase, tdefault, tcontinue, tbreak - + /* 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); -FILE* fileOpen(char *filename); #endif // !SCANNER_H 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 index 265016f..f8f9b12 100644 --- a/MiniCScanner/for.mc +++ b/MiniCScanner/for.mc @@ -1,7 +1,13 @@ 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; 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; + } +} From 2332f8007b4969214efe38240e1eefbf17c7b45a Mon Sep 17 00:00:00 2001 From: VaporSiriz <61943747+VaporSiriz@users.noreply.github.com> Date: Thu, 12 Nov 2020 22:04:32 +0900 Subject: [PATCH 4/4] tret test --- test | 1 + 1 file changed, 1 insertion(+) create mode 100644 test diff --git a/test b/test new file mode 100644 index 0000000..5f2f16b --- /dev/null +++ b/test @@ -0,0 +1 @@ +1111