From ab5559d2069b5e9680854d98b2b23b6fec3d7da1 Mon Sep 17 00:00:00 2001 From: uan Date: Wed, 4 Feb 2026 21:39:14 +0100 Subject: [PATCH] function calls --- .gitignore | 1 + generator.v | 15 +++++++++++---- main.v | 2 +- parser.v | 27 ++++++++++++++++++++++----- test | Bin 12576 -> 0 bytes 5 files changed, 35 insertions(+), 10 deletions(-) delete mode 100755 test diff --git a/.gitignore b/.gitignore index b9e3ca7..56ada95 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Binaries for programs and plugins main onev +exec *.exe *.exe~ *.so diff --git a/generator.v b/generator.v index 14bf965..cd7495b 100644 --- a/generator.v +++ b/generator.v @@ -17,7 +17,7 @@ fn (mut g Generator) gen_stmt(stmt Stmt) { match stmt { VarDecl { c_type := g.get_c_type(stmt.type) - g.out.write_string('${c_type} ${stmt.name} = ') + g.out.write_string('${c_type} v${stmt.name}${stmt.scope_depth.str()} = ') g.gen_expr(stmt.value) g.out.writeln(';') } @@ -57,10 +57,9 @@ fn (mut g Generator) gen_expr(expr Expr) { g.out.write_string(expr.val.str()) } Variable { - g.out.write_string(expr.name) + g.out.write_string('v${expr.name}${expr.scope_depth.str()}') } UnaryExpr { - // Handle postfix/prefix logic if necessary g.out.write_string('${expr.ident}${expr.op}') } BinaryExpr { @@ -86,7 +85,15 @@ fn (mut g Generator) gen_expr(expr Expr) { g.out.write_string('(${c_type})') g.gen_expr(expr.expr) } - else {panic('unimplemented ${expr}')} + ParenExpr { + g.out.write_string('(') + g.gen_expr(expr.expr) + g.out.write_string(')') + } + FnCall { + g.out.write_string('${expr.name}()') + } + else {panic("Unimplemented expression")} } } diff --git a/main.v b/main.v index c732235..4cd1079 100644 --- a/main.v +++ b/main.v @@ -31,6 +31,6 @@ fn main() { out_c := generator.gen_c(statements) - compile_with_clang(out_c, 'test', true) + compile_with_clang(out_c, 'exec', true) } diff --git a/parser.v b/parser.v index cbef600..ad19de7 100644 --- a/parser.v +++ b/parser.v @@ -91,7 +91,7 @@ fn (mut s SymbolTable) is_in_global_scope() bool { // ------------------------------------------- Expressions -type Expr = VoidExpr | UnaryExpr | BinaryExpr | IntegerLiteral | RealLiteral | BoolLiteral | Variable | TypeExpr | Function | TypeCast | ParenExpr | PrintExpr +type Expr = VoidExpr | UnaryExpr | BinaryExpr | IntegerLiteral | RealLiteral | BoolLiteral | Variable | TypeExpr | Function | TypeCast | ParenExpr | PrintExpr | FnCall struct VoidExpr {} @@ -120,6 +120,7 @@ struct BoolLiteral { struct Variable { name string + scope_depth int } struct TypeExpr { @@ -144,6 +145,10 @@ struct PrintExpr { type string } +struct FnCall { + name string +} + // ------------------------------------------- Statements type Stmt = VarDecl | ExprStmt | ReturnStmt | Block | FuncDecl @@ -152,6 +157,7 @@ struct VarDecl { name string type string value Expr + scope_depth int } struct FuncDecl { @@ -253,10 +259,16 @@ fn (mut p Parser) parse_expr(prec Precedence) Expr { } fn (mut p Parser) parse_ident(ident string) Expr { - return match p.peek().type { - .increment, .decrement {UnaryExpr {ident: ident, op: p.next().text}} - else {Variable{ident}} + expr := match p.peek().type { + .increment, .decrement {Expr(UnaryExpr {ident: ident, op: p.next().text})} + .lparen { + p.expect(.lparen) + p.expect(.rparen) + FnCall{name: ident} + } + else {Variable{ident, p.symbols.variable_scopes.len}} } + return expr } fn (mut p Parser) parse_print() PrintExpr { @@ -333,6 +345,10 @@ fn (mut p Parser) get_expr_type(expr Expr) string { return info.type } TypeCast {expr.type} + FnCall { + fninfo := p.symbols.lookup_func(expr.name) or {parse_error("Tried to call undefined function ${expr.name}")} + fninfo.type + } else {"Tried getting type of unexpected Expr"} } @@ -407,6 +423,7 @@ fn (mut p Parser) parse_var_decl() VarDecl { name: name_tok.text value: val type: type_tok.text + scope_depth: p.symbols.variable_scopes.len } } @@ -463,7 +480,7 @@ fn (mut p Parser) parse_return_stmt() ReturnStmt { .integer {IntegerLiteral{token.text.int()}} .real {RealLiteral{token.text.f32()}} .boolean {BoolLiteral{token.text == 'true'}} - .identifier {Variable{token.text}} + .identifier {Variable{token.text, p.symbols.variable_scopes.len}} .semicolon {VoidExpr{}} else {parse_error("Unexpected Token")} } diff --git a/test b/test deleted file mode 100755 index f0afffd84d6996684db3ec4f120d515cbfc16551..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12576 zcmeHNZ)_Y_5r22ipKF`gXQv@<0?7hS>p;A|^S?TmhOYmgD=xEfKU6R-FY)_elxSPdvD*o+b@nxj7B37!7VC2A&^^X(4@#a3!&_jEXn%CR-p++ z>=BzlvH=cFjv)1VOs_`00j4q1YXFKk5hp=h^EyO7NMfcOA<~UB<`IoJk3J)f3c-}^ zBW^u^OB5$lKMt?))`vVdw>msOOz$OJD^bQFi@4Zs4;NEC9MhNSf|zn%Fh)FDF+q}Q zHMC7~LNG;LY)J9wZ$S>JRznrZ!F?ne^fybmS;8@8eWvVh`Zd>lKmH~OcdFS7Lzo*1CT&x^GPBw#Z!G3(oL1j2(GYXutmYjm0x(e%tWQ zrx#Dy-!IQR-TcyDn|8mOKKW)W{nd@%hIrFoUUj3Dm(wSI5xZOsv(kG8hAMlXf^*Xz z4SL8g;`pDgRVo#ke6g?r)VFto`rGqr)1Fh( zChA|l!=AkuPiP{22+!`ei>QKO+;s^Bm22~7FQe1>JAmh;{+Dh@a{6Za`5O_?W2wKdqpwFT<<%}}6W8T@{3lKj(^3bpZ4LQBkSlfc zg|0({8NK8hMOV)mwj&Bf+i~XwiZRYUF*Y$iIHY%}U21Q&-`xYqgu&o9iqQ|oF$sPjK*2y`+-l@q120yzk9M&>j;@GRjGuFZeH=#~$FX64YOh|3!&8`n zFau!*!VH8N2s037Ak09RfiMIA;|v_%ph*u2qP%X$nh4t#kBEmFG}+rq{5jIUk9htc zbQkelA+Q~xYI21C$K~;NZddX+pv1j#u20Srze%Em(1^dA_(zD|L$sCXcA`wU7Q0UM z8P^@G&vg{mXV`XlM9k9vkt}Z~p5w-P3L6xQvavn*-%4K3Es7WZ6q7vX^(OJJ(>THZ zZ-oDM4mx~-?k~#6hK5o~J5+1?lw>bd(@CW((bb#mN+y-|Da%yShD!q-z57HaYd8za z6IQWg=N+XhsV3EarG3;g^F@Q$jvjSB)6>0A3>-`K6p~#B4v48^sbbl2Y=ACgGC@CL z@L0-locx^a)EypsER|S#(Cka}_H`+$+F4pInO33H3A+}Z#+=>ZJif;sf4hn;ZzfX?bt5(lU}GVO;W!`7j`gQJJV6L zviXb`V?qhYq@93F+6&0wUg7hI^)(jQV*_oGZX;R!X5(49r}cDxMq^Ct>F{rUY8^W~ z51gm@pq`yo!q2ax^E8byt!IbFnAX$bSRY#_W{&k4@`>qNt3_a7gLtbF97o>~*x3qx zAJMXgK7KY51xuU@wzr4mHz{70cafauWtOL*6A|}`EeTDEFg|QEa71vohUQr*gwyBY zK)*cCv-~U2iHL22=WUih3!Qq``{Om_KbLmmBGIBjueQ~*^Ae~;#C8#!hptFyli=?^ z*wU*~e}~}to8|992Xh^42OuGeXcaNa50CEvc^u@NHZY47mUN@MBr^G2A#1so zsV3@c=<_g%>PE3>EbErz7MI0*(a2f4SnaddECLO(h>Iz2L@&kPJsi~u6I z5v}pQGwwB8rr{bw22C5()nVM0h9tnaw-*ge&Bip0mGb(c;XuejA3q9OrtRqEl4XKj z2To>Im#+=Owa^5-M)ZOWy82wHL^kElxUSC}9^wncq`P# z1-r$(OqFUa(mh->L6bS5R>LY3^98HuE|X|raJ&PbHyNaNx4j^_4}OfCoq-_o;08{r z^yhhlObHbpx*R-9LZvl^^ab*25>&%=i}qaEh3EFa({NpkYsu>Rvq6)F`TM>$$=x~e ze83VFI`C5zn@GU#=7(s3%j<5|58}TTz#k|7#|f`6kf>Z!K%Z$3^!@&MzF8qW&aeK) zIF_ZLbj4=hYk8; zp6M%qZSvu(>rDQx8OHpLaZKNUL7cnTKd=AzyJ-IYnd@oB(c>xJ1}xq`#`FKMS8)Li zjrBb4&hx`|{tg3vJg+CO6JB8;QN}Ti0@#n|^sNybHTau5Z*aK3*H|E{0CTAYuCrW@_=XOU;q$c#XkWXWhABm