summaryrefslogtreecommitdiff
path: root/04b/in04
diff options
context:
space:
mode:
Diffstat (limited to '04b/in04')
-rw-r--r--04b/in0495
1 files changed, 95 insertions, 0 deletions
diff --git a/04b/in04 b/04b/in04
new file mode 100644
index 0000000..1b362ad
--- /dev/null
+++ b/04b/in04
@@ -0,0 +1,95 @@
+// types: char, uchar, short, ushort, int, uint, long, ulong, *type
+// declaration:
+// static <type> <name>;
+// local <type> <name>;
+// :<label>
+// statement:
+// <declaration>
+// if <term> <==/</>/>=/<=/!=> <term> goto <label>
+// goto <label>
+// <lvalue> = <rvalue>
+// <lvalue> += <rvalue>
+// <lvalue> -= <rvalue>
+// <function>(<term>, <term>, ...)
+// syscall(<term>, <term>, ...)
+// return <rvalue>;
+// term:
+// <var>
+// <number>
+// number:
+// 'c
+// 12345
+// 0xabc
+// lvalue:
+// <var>
+// *<var>
+// <var>[<term>]
+// rvalue:
+// `<string>`
+// <var>
+// &<var>
+// *<var>
+// <var>[<term>]
+// ~<var>
+// <function>(<term>, <term>, ...)
+// syscall(<term>, <term>, ...)
+// <term> + <term>
+// <term> - <term>
+// <term> * <term>
+// <term> / <term>
+// <term> % <term>
+// <term> & <term>
+// <term> | <term>
+// <term> ^ <term>
+// <term> < <term> (left shift)
+// <term> > <term> (right shift)
+// (<term> ] <term>)
+
+main();
+
+static char x;
+static uchar y;
+static long z;
+
+function strlen(*char s)
+ local ulong len;
+ local char c;
+ len = 0;
+ :strlen.loop
+ c = s[len];
+ if c == 0 goto strlen.loop_end;
+ len += 1;
+ goto strlen.loop
+ :strlen.loop_end
+ return len;
+
+function putc(char c)
+ local char *p;
+ p = &c;
+ syscall(1, 1, p, 1, 0, 0, 0, 0);
+ return;
+
+function puts(*char s)
+ local ulong len;
+ len = strlen(s);
+ syscall(1, 1, s, len, 0, 0, 0, 0);
+ return;
+
+function main()
+ local *char hello;
+ hello = `Hello, world!
+`;
+ puts(hello);
+ syscall(0x3c, 0, 0, 0, 0, 0, 0, 0);
+
+function f(*long x, **long y)
+ local long v;
+ local *long p;
+ v = *x;
+ p = *y;
+ *p = v;
+ if v == 0 goto something;
+ p[1] = v + 1;
+ return p[2];
+ :something
+ return p[1];