diff --git a/examples/input.sel b/examples/input.sel new file mode 100644 index 0000000..f9682e1 --- /dev/null +++ b/examples/input.sel @@ -0,0 +1,9 @@ +whisper "Enter an int:"; + +wax int x = 0; + +x = read_int(); + +whisper "You entered:"; + +whisper x; \ No newline at end of file diff --git a/inc_dec b/inc_dec deleted file mode 100755 index 0d47ee52571725f3bbb8d0d7e30188fedc8f3112..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50024 zcmX^A>+L@t1_nk31_lNu1_lNp1_lNWRtAPv1_h81gCqk3g9ifxLwtOIqq}RAYmh%! z7=-|9MiIf}fXwM&1ep`!8WDmj57zI1D#ifivobI+fG`VGIzGN6wW0*d0lN#;JP%fg zXO=*ffcPMPLAeYJEDQ~BHdudgNoi6sTqr&s)x0-Q^LU^tKzwBLIH2aiM5{Qp4%`4B$ONr0SOUnnl7u9`#pyow@6f-a|fcWTU zK&8MGC>~~j&2e!Iag2BN_X~!^h65zrVBwBVGczzSfG{Yo1i<>!^O2%~AwC|vc^qI{ z85lt3f%L<;Yz$EQpaLLwy#SjFG6yOMq8gy;py>e~dr&^eOb~|oIX*rmu_O_s5rQG^ zg0R6P)I3=DgUo~J1?P#gy#uzSGX<@m&+#lXM- z_8-(74F-k=kU60I3>5-XAbTyKc0l6M2b?3|Zpq0^3a%_JNzK)B(o3n#$xH%kV^D*d zzu*7^11ODZLiwQZ0;!ON@&gVsFi1cQ1_|TD{|_@<{9Dbm@^3T4L=J|ApcT#XJN6%z z-{HZ)FyRF|!%t3Dhn)(n41x@-3_ArG7^b{nclgP`>adfKfnkaVNDVi`PfkX#nnDIf zhMgQBHQWwA85kXQvNAACS!!UYa*8K{qt zX^?k8;S9=RAPg$=K*~UD5DmkixZ+`8WDo$G1QrD)B`{-@7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@RpeO`T_QX?U(x~Rq5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4FQrvfQw`uqZ&p-U^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1ZWWg3JeSk0SpWbAq)%* zj8F`-hZV+PU|^6yXFISlFgPFt!Frh(7#QLUiZb&`(!er|@eFbx21uNRp{0R|frX)= zfr){c;RF{01512vMto{TYI12wYJ5g&VoGWe17{`!Zx(}aZenI0gX9UW0+4P7Ed~Y# zK1K$H9jp*Hf{f#56adSC>=k2RVBlwGU|?y0$V-CwYzzzxP`(U^&&a^w0oAVr@h3%m={HfY!TOUymA!1VWHdz)pPT}*K*X8U8`Xnb2+zh+ZJ{;`*72UxCOyqL}8AHn*+ zW=l;~>#e=r9-TVNDV4u}^>y3FscFm$b=b_lB+I9L7U44sj%$fW2?8{UhNWF6UL<3z4PaRxOKM`KSwD{=U<&nNI#|Wy!xr9N-Y*gZkxTa c-zUg8k!i0Fujw2euk;U2U(^j!!a(r_0AWDJZvX%Q diff --git a/break_continue b/input similarity index 92% rename from break_continue rename to input index cfd37731eb8860721157cfa9df94d32d0fcd6661..823df9645dd8450af9533550baf83f15c0f1fa7d 100755 GIT binary patch delta 1261 zcmX@m%5T&62 zfhhoabfP855iFB?m_#KHK+ST1DrkVv9?X+>F)4XwFfcF}GcYs=FfcG=G%zq&fV49( zFn~f}MFRr^2Ll6xMI!@40RsaAHvvu8Mzc!O6Fk3MGn0%7iUu^-@TulZB29UiVdqBp@LirmS85m|TPHtpX znw-GG^(j0`)$auE^} zIT#qGykK_t$-wBaQ;30K$^&kPos%!HNXR^3XZZPo-Qnj;W`>Cxj0``)8hRuq$}uoZ znS6momwkoAL_r8!A|0e?g)qZKxWYLQlNTJ0-|@HFapnJJhKUE5 zBoAS;LD;T&C8N6b984E(V6l@~pDFptJ~z z9uWSp*^_mxC9^;S<7P&O-}bT!&_D;JGEiy)r({rQF)%Q&PF8F%u4e?L>G*=8%)F8` zhWO&-#Jn^H2F7@B6oS({Gs6!~1{Q{f1||ju=J?!<_|%Hj9!Vl++>y&fLVz zJOj0_AR&2~R)!>S<^nm5pAi(BkmM%D zz`(%I$iM*d8pz2qAU-IeKoh$>B#DEhz@AY@B)B+6zVG&(EJ!*oSKuG zmsy$%5sxn}Day=CXFwOu%qu|>D@sjFi3bURZG{rQ?(u+f$s~vyz=9&b?(r}&Ffi6J zFtLD24kl2Bh+|-20L24H1t$YT;|2vL2A;`{tm^u(QiL%xub{Mq;csyFs>V$U6Pp88 z2hWjfJM(a{^`^CqT`x2KI56#RT~IrDcVmJ=V$hbltSeooSbCh6G%;k>>|c=6Re4G< zC+3~ENmHfR3XmeT*>`?#-29^LrCPxg)SN%Z`$xBqw;7#JBC7#Nrs7#IW@7#I{LitZLnV1bBk0Ld^gFeFTTXfG(h z3K8Ui3JOd%WV9EOfr_#~MP*ngH!<3YDnNxJpu!+N)8vV4(vv?h7BF&5PGpj1WSlI@ ztRmR}F_pmqsA7Gjs#H{3+z`(#@%)rnf0CGhG1A_t7sS*qf3^N)S7(muOXkcKl zU|?Y2W?*0lfanJM3FI%3x0ok7%Cp{RU|?XH7$`jX1G9#JnB(-L`g;v7%)BW5_Yl9$ z#mO2h7K{m#6IuM#CNwZGa4;}1XfiM`fGh=B0y0w;%2#M)U|7I7c_N$A$A!7Ca^GoLlYFD0-Gb*)>>{}z$VDZ*sysbTPcX$&L*n>4XY3aNbrNg z3gk@?W|^$mU|i1-Ur>~pSCR%2VPK4B5CSp4!O8G|gMoo5J~tyiwIVgSv?Mh?BQ-H4 zwTOW;H!(AhftP{d0Y?o;HG>KR0|Or;1H&C?dID+ZX9NW+#8xo|1_pjc1_qFeK`xMi zxCX@J0vo{0z`(#f*|bps=9u{6)ST43%+g$lKzwFi30NVB_;rux00RT#Y=|Ks5eAW8 z_js5X7#Q0bm{>q*9OQs>1_lOLvgBl7XjD*OV&IuPkxktKmfRVWic%A^^(9yg1B|HnHo;Z2c(TWW{uWT&PCh5J`uw|$(N#=KC6 z&Fo9EeA-7|?j2X&Exr`p^x)|vrY&zlid4Be^0c(|0vCVMd2>)FNRTJs>B4ClEKSlC OF>ha;=Vv?&b~FI`HpYbj diff --git a/selenium/codegen_c.py b/selenium/codegen_c.py index 0dc4c42..ef7e41c 100644 --- a/selenium/codegen_c.py +++ b/selenium/codegen_c.py @@ -77,6 +77,10 @@ class CCodeGenerator: ) self._writeline("static void selenium_print_char(char value) { printf(\"%c\\n\", value); }") self._writeline("static void selenium_print_string(const char *value) { printf(\"%s\\n\", value); }") + self._writeline("static int selenium_read_int() { int x; scanf(\"%d\", &x); return x; }") + self._writeline("static double selenium_read_float() { double x; scanf(\"%lf\", &x); return x; }") + self._writeline("static _Bool selenium_read_bool() { int x; scanf(\"%d\", &x); return x; }") + self._writeline("static char selenium_read_char() { char x; scanf(\" %c\", &x); return x; }") self._writeline("") def _emit_function(self, fn: FunctionDecl) -> None: @@ -242,6 +246,8 @@ class CCodeGenerator: target = self._c_type(expr.target_type.name) return f"(({target})({self._expr(expr.expr)}))" if isinstance(expr, Call): + if expr.callee in {"read_int", "read_float", "read_bool", "read_char"}: + return f"selenium_{expr.callee}()" args = ", ".join(self._expr(arg) for arg in expr.args) return f"{expr.callee}({args})" if isinstance(expr, Unary): diff --git a/selenium/runtime.c b/selenium/runtime.c index f4fa070..9cdedff 100644 --- a/selenium/runtime.c +++ b/selenium/runtime.c @@ -6,3 +6,8 @@ void selenium_print_float(double value) { printf("%g\n", value); } void selenium_print_bool(_Bool value) { printf("%s\n", value ? "true" : "false"); } void selenium_print_char(char value) { printf("%c\n", value); } void selenium_print_string(const char *value) { printf("%s\n", value); } + +int selenium_read_int() { int x; scanf("%d", &x); return x; } +double selenium_read_float() { double x; scanf("%lf", &x); return x; } +_Bool selenium_read_bool() { int x; scanf("%d", &x); return x; } +char selenium_read_char() { char x; scanf(" %c", &x); return x; } diff --git a/selenium/sema.py b/selenium/sema.py index 4b64130..e2cdcb0 100644 --- a/selenium/sema.py +++ b/selenium/sema.py @@ -307,6 +307,12 @@ class SemanticAnalyzer: return BUILTINS["bool"] raise SemanticError(f"Unsupported binary operator: {op}") if isinstance(expr, Call): + if expr.callee in {"read_int", "read_float", "read_bool", "read_char"}: + if len(expr.args) != 0: + raise SemanticError(f"Function {expr.callee} expects 0 arguments") + return_type = {"read_int": "int", "read_float": "float", "read_bool": "bool", "read_char": "char"}[expr.callee] + self.expr_types[id(expr)] = BUILTINS[return_type] + return BUILTINS[return_type] if expr.callee not in self.functions: raise SemanticError(f"Unknown function: {expr.callee}") info = self.functions[expr.callee] diff --git a/switch b/switch deleted file mode 100755 index 1445338d35c69a2a5b1090f58341bffeb7012f32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50008 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 MC93lueg?%C0AV}ds{jB1