post rebranding

This commit is contained in:
Antranig Vartanian 2024-05-11 19:17:23 +04:00
parent 4169aecd5b
commit 95b512baf4
No known key found for this signature in database
GPG key ID: DE3998662D59F21C
66 changed files with 716 additions and 15 deletions

View file

@ -8,21 +8,21 @@ Oberon By Example is a hands-on introduction to Oberon-2 using examples.
This repository is under heavy modification to make it better for beginners.
To start, make sure you have [Vishap Oberon Compiler](https://github.com/vishaps/voc)
To start, make sure you have [Vishap Oberon Compiler](https://github.com/vishapoberon/voc)
Check out the [hello-world](https://github.com/vishaps/oberonbyexample/tree/master/hello-world) example or browse the full list below.
Check out the [hello-world](https://github.com/vishapoberon/oberonbyexample/tree/master/examples/hello-world) example or browse the full list below.
- [Hello World](https://github.com/vishaps/oberonbyexample/tree/master/hello-world)
- [Types](https://github.com/vishaps/oberonbyexample/tree/master/value-types)
- [Variables](https://github.com/vishaps/oberonbyexample/tree/master/variables)
- [Constants](https://github.com/vishaps/oberonbyexample/tree/master/constants)
- [For](https://github.com/vishaps/oberonbyexample/tree/master/for)
- [While](https://github.com/vishaps/oberonbyexample/tree/master/while)
- [If/Else](https://github.com/vishaps/oberonbyexample/tree/master/ifelse)
- [Case](https://github.com/vishaps/oberonbyexample/tree/master/case)
- [Arrays](https://github.com/vishaps/oberonbyexample/tree/master/arrays)
- [Procedures](https://github.com/vishaps/oberonbyexample/tree/master/procedures)
- [Procedure](https://github.com/vishaps/oberonbyexample/tree/master/procedures/procedure)
- [Functions](https://github.com/vishaps/oberonbyexample/tree/master/procedures/function-procedure)
- [VAR-Parameters](https://github.com/vishaps/oberonbyexample/tree/master/procedures/var-parameter)
- [Hello World](https://github.com/vishapoberon/oberonbyexample/tree/master/examples/hello-world)
- [Types](https://github.com/vishapoberon/oberonbyexample/tree/master/examples/value-types)
- [Variables](https://github.com/vishapoberon/oberonbyexample/tree/master/examples/variables)
- [Constants](https://github.com/vishapoberon/oberonbyexample/tree/master/examples/constants)
- [For](https://github.com/vishapoberon/oberonbyexample/tree/master/examples/for)
- [While](https://github.com/vishapoberon/oberonbyexample/tree/master/examples/while)
- [If/Else](https://github.com/vishapoberon/oberonbyexample/tree/master/examples/ifelse)
- [Case](https://github.com/vishapoberon/oberonbyexample/tree/master/examples/case)
- [Arrays](https://github.com/vishapoberon/oberonbyexample/tree/master/examples/arrays)
- [Procedures](https://github.com/vishapoberon/oberonbyexample/tree/master/examples/procedures)
- [Procedure](https://github.com/vishapoberon/oberonbyexample/tree/master/examples/procedures/procedure)
- [Functions](https://github.com/vishapoberon/oberonbyexample/tree/master/examples/procedures/function-procedure)
- [VAR-Parameters](https://github.com/vishapoberon/oberonbyexample/tree/master/examples/procedures/var-parameter)
- TODO

BIN
build/obe Executable file

Binary file not shown.

44
build/obe.c Normal file
View file

@ -0,0 +1,44 @@
/* voc 2.1.0 [2022/05/16] for clang LP64 on darwin xtpam */
#define SHORTINT INT8
#define INTEGER INT16
#define LONGINT INT32
#define SET UINT32
#include "SYSTEM.h"
#include "Files.h"
#include "Out.h"
#include "Platform.h"
static void obe_CheckDirectories (void);
static void obe_GenIndex (void);
static void obe_CheckDirectories (void)
{
Files_File fd = NIL;
fd = Files_New((CHAR*)"public", 7);
}
static void obe_GenIndex (void)
{
Files_File outputfd = NIL, templfd = NIL, examplesfd = NIL;
Files_Rider outputrd, templrd, examplesrd;
}
export int main(int argc, char **argv)
{
__INIT(argc, argv);
__MODULE_IMPORT(Files);
__MODULE_IMPORT(Out);
__MODULE_IMPORT(Platform);
__REGMAIN("obe", 0);
/* BEGIN */
obe_CheckDirectories();
obe_GenIndex();
__FINI;
}

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.obe</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

Binary file not shown.

View file

@ -0,0 +1,10 @@
---
triple: 'arm64-apple-darwin'
binary-path: obe
relocations:
- { offsetInCU: 0x26, offset: 0x26, size: 0x8, addend: 0x0, symName: _main, symObjAddr: 0x0, symBinAddr: 0x100003E2C, symSize: 0x7C }
- { offsetInCU: 0x33, offset: 0x33, size: 0x8, addend: 0x0, symName: _main, symObjAddr: 0x0, symBinAddr: 0x100003E2C, symSize: 0x7C }
- { offsetInCU: 0x58, offset: 0x58, size: 0x8, addend: 0x0, symName: _main.m, symObjAddr: 0xA00, symBinAddr: 0x100008000, symSize: 0x0 }
- { offsetInCU: 0xA6, offset: 0xA6, size: 0x8, addend: 0x0, symName: _obe_CheckDirectories, symObjAddr: 0x7C, symBinAddr: 0x100003EA8, symSize: 0x30 }
- { offsetInCU: 0xCA, offset: 0xCA, size: 0x8, addend: 0x0, symName: _obe_GenIndex, symObjAddr: 0xAC, symBinAddr: 0x100003ED8, symSize: 0x58 }
...

View file

@ -0,0 +1,63 @@
MODULE partest;
IMPORT Oberon, Texts;
CONST
argStr0 = "str"; (* we only have two types of args, one string and one int *)
argInt0 = "int"; (* i. e. -str somestring -int somenumber *)
VAR
W: Texts.Writer; (* for console output *)
S: Texts.Scanner; T: Texts.Text;
BEGIN
Texts.OpenWriter(W);
Texts.WriteString(W, "hello, world, let's see which arguments do we get"); Texts.WriteLn(W);
(* open arguments scanner *)
Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos);
WHILE ~S.eot DO
Texts.Scan(S);
IF S.class = Texts.Char THEN (* do we get '-' sign ? *)
IF S.c = "-" THEN
Texts.Scan(S);
IF S.class = Texts.Name THEN (* we got the key *)
Texts.WriteString(W, "key: "); Texts.WriteString(W, S.s); Texts.WriteLn(W);
(* now get the value *)
IF S.s = argStr0 THEN
Texts.Scan(S);
IF S.class = Texts.Name THEN
Texts.WriteString(W, "value: "); Texts.WriteString (W, S.s); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf);
ELSE
Texts.WriteString(W, "string expected"); Texts.WriteLn(W);
Texts.Append(Oberon.Log, W.buf);
HALT(1);
END;
ELSIF S.s = argInt0 THEN
Texts.Scan(S);
IF S.class = Texts.Int THEN
Texts.WriteString(W, "value: "); Texts.WriteInt (W, S.i, 0); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf);
ELSE
Texts.WriteString(W, "integer expected"); Texts.WriteLn(W);
Texts.Append(Oberon.Log, W.buf);
HALT(1);
END;
END;
ELSE
(* we were expecting characters after the '-' sign *)
Texts.WriteString(W, "key name expected"); Texts. WriteLn(W);
Texts.Append(Oberon.Log, W.buf);
HALT(1);
END;
END
ELSE
Texts.WriteString(W, "key option must start with '-' sign "); Texts.WriteLn(W);
HALT(1);
END; (* if got '-' *)
Oberon.Par.pos := Texts.Pos(S);
Texts.Append(Oberon.Log, W.buf)
END; (* while *)
END partest.

View file

@ -0,0 +1,42 @@
MODULE arrays;
IMPORT Out;
VAR
tmp : INTEGER;
matrix : ARRAY 3 OF ARRAY 3 OF INTEGER;
i, v, k : INTEGER;
BEGIN
v := 1;
FOR i := 0 TO LEN(matrix) - 1 DO
FOR k := 0 TO LEN(matrix[i]) - 1 DO
matrix[i][k] := v;
INC(v);
END;
END;
FOR i := 0 TO LEN(matrix) - 1 DO
FOR k := 0 TO LEN(matrix[i]) - 1 DO
Out.Int(matrix[i][k], 0); Out.String(" ");
END;
Out.Ln;
END;
FOR i := 0 TO LEN(matrix) - 1 DO
FOR k := i + 1 TO LEN(matrix[i]) - 1 DO
tmp := matrix[i][k];
matrix[i][k] := matrix[k][i];
matrix[k][i] := tmp;
END;
END;
Out.Ln; Out.Ln;
FOR i := 0 TO LEN(matrix) - 1 DO
FOR k := 0 TO LEN(matrix[i]) - 1 DO
Out.Int(matrix[i][k], 0); Out.String(" ");
END;
Out.Ln;
END;
END arrays.

View file

@ -0,0 +1,14 @@
MODULE case;
IMPORT Out, Modules;
BEGIN
CASE Modules.ArgCount - 1 OF
0 : Out.String("There are no arguments");
| 1 : Out.String("There is one argument");
| 2 : Out.String("There are two arguments");
ELSE Out.String("There are more than two arguments") END;
Out.Ln;
END case.

View file

@ -0,0 +1,14 @@
MODULE constants;
IMPORT Out;
CONST
s = "if it moves, compile it!";
n = 42;
m = n * 2;
BEGIN
Out.String(s); Out.Ln;
Out.Int(n, 0); Out.Ln;
Out.Int(m, 0); Out.Ln;
END constants.

View file

@ -0,0 +1,68 @@
MODULE Days;
TYPE
Day* = POINTER TO DayDesc;
DayDesc = RECORD
next, prev : Day
END;
Week = ARRAY 7 OF Day;
VAR
sun*, mon*, tue*, wed*, thu*, fri*, sat* : Day;
week: Week;
PROCEDURE Next*(d : Day): Day;
BEGIN
RETURN d.next
END Next;
PROCEDURE Prev*(d: Day): Day;
BEGIN
RETURN d.prev;
END Prev;
PROCEDURE inc(VAR j: SHORTINT);
BEGIN
IF j = 6 THEN
j := 0
ELSE
INC(j)
END
END inc;
PROCEDURE dec(VAR j: SHORTINT);
BEGIN
IF j = 0 THEN
j := 6
ELSE
DEC(j)
END
END dec;
PROCEDURE init(VAR w : Week);
VAR
i,j : SHORTINT;
BEGIN
i := 0;
REPEAT
j := i; inc(j);
w[i].next := w[j];
j := i; dec(j);
w[i].prev := w[j];
INC(i)
UNTIL i > 6;
END init;
BEGIN
NEW(sun); NEW(mon); NEW(tue); NEW(wed); NEW(thu); NEW(fri); NEW(sat);
week[0] := sun;
week[1] := mon;
week[2] := tue;
week[3] := wed;
week[4] := thu;
week[5] := fri;
week[6] := sat;
init(week);
END Days.

View file

@ -0,0 +1,33 @@
MODULE Days;
TYPE
Day* = POINTER TO DayDesc;
DayDesc = RECORD
num: INTEGER
END;
Week* = ARRAY 7 OF Day;
VAR
sun*, mon*, tue*, wed*, thu*, fri*, sat* : Day;
week: Week;
PROCEDURE Next*(d : Day): Day;
BEGIN RETURN week[(d.num + 1) MOD 7];
END Next;
PROCEDURE Prev*(d: Day): Day;
BEGIN RETURN week[(d.num - 1) MOD 7];
END Prev;
PROCEDURE day(VAR d: Day; num: INTEGER);
BEGIN NEW(d); d.num := num; week[num] := d;
END day;
BEGIN
day(sun, 0);
day(mon, 1);
day(tue, 2);
day(wed, 3);
day(thu, 4);
day(fri, 5);
day(sat, 6);
END Days.

View file

@ -0,0 +1,22 @@
MODULE test;
IMPORT Days, Out;
VAR today, yesterday, tomorrow: Days.Day;
BEGIN
today := Days.mon; (*init*)
yesterday := Days.Prev(today);
IF yesterday = Days.sun
THEN
Out.String("it works!"); Out.Ln
END;
tomorrow := Days.Next(today);
IF tomorrow = Days.tue
THEN
Out.String("it works!"); Out.Ln
END;
END test.

View file

@ -0,0 +1,22 @@
MODULE test;
IMPORT Days, Out;
VAR today, yesterday, tomorrow: Days.Day;
BEGIN
today := Days.mon; (*init*)
yesterday := Days.Prev(today);
IF yesterday = Days.sun
THEN
Out.String("it works!"); Out.Ln
END;
tomorrow := Days.Next(today);
IF tomorrow = Days.tue
THEN
Out.String("it works!"); Out.Ln
END;
END test.

19
examples/for/For.Mod.ob2 Normal file
View file

@ -0,0 +1,19 @@
MODULE for;
IMPORT Out;
VAR
i : INTEGER;
BEGIN
Out.String("i is "); Out.Int(i, 0); Out.Ln;
Out.String("For loop started"); Out.Ln;
FOR i := 0 TO 10 DO
Out.String("i : "); Out.Int(i, 0); Out.Ln;
END;
Out.String("For-By loop started"); Out.Ln;
FOR i := 0 TO 10 BY 2 DO
Out.String("i : "); Out.Int(i, 0); Out.Ln;
END;
END for.

View file

@ -0,0 +1,10 @@
MODULE hello;
IMPORT Console;
BEGIN
Console.String("Hello World!");
Console.Ln
END hello.

View file

@ -0,0 +1,9 @@
MODULE hello;
IMPORT Out;
BEGIN
Out.String("Hello, World"); Out.Ln
END hello.

View file

@ -0,0 +1,49 @@
MODULE ifelse;
IMPORT Out;
VAR n, m : INTEGER;
BEGIN
n := 8; m := 4;
IF n MOD m = 0 THEN
Out.Int(n,0); Out.String(" is divisible by "); Out.Int(m,0); Out.Ln;
END;
n := 7; m := 6;
IF n * m = 42 THEN
Out.Int(n,0); Out.String(" times "); Out.Int(m,0); Out.String(" equals 42"); Out.Ln;
END;
IF n # m THEN Out.Int(n,0); Out.String(" does not equal "); Out.Int(m,0); Out.Ln; END;
IF ODD(n)
THEN
Out.Int(n,0); Out.String(" is odd"); Out.Ln;
ELSE
Out.Int(n,0); Out.String(" is even"); Out.Ln;
END;
IF ~ODD(m)
THEN
Out.Int(m,0); Out.String(" is even"); Out.Ln;
ELSE
Out.Int(m,0); Out.String(" is odd"); Out.Ln;
END;
n := 9;
IF n < 0
THEN
Out.Int(n, 0); Out.String(" is negative"); Out.Ln;
ELSIF n < 10
THEN
Out.Int(n, 0); Out.String(" has 1 digit"); Out.Ln;
ELSE
Out.Int(n, 0); Out.String(" has multiple digits"); Out.Ln;
END;
END ifelse.

View file

@ -0,0 +1,20 @@
MODULE square;
IMPORT Out;
VAR s : INTEGER;
PROCEDURE squared(x : INTEGER): INTEGER;
BEGIN
RETURN x * x
END squared;
BEGIN
s := squared(7);
Out.Int(s, 0); Out.Ln;
Out.Int(squared(8), 0); Out.Ln;
END square.

View file

@ -0,0 +1,15 @@
MODULE proc;
IMPORT Out;
PROCEDURE printSum(a, b : INTEGER);
BEGIN
Out.Int(a + b, 0); Out.Ln
END printSum;
BEGIN
printSum(6, 9)
END proc.

View file

@ -0,0 +1,24 @@
MODULE varparam;
IMPORT Out;
VAR a, b : INTEGER;
PROCEDURE swapVals(VAR x, y : INTEGER);
VAR tmp : INTEGER;
BEGIN
tmp := x; x := y; y := tmp;
END swapVals;
BEGIN
a := 6; b := 9;
Out.String("initial "); Out.Ln;
Out.String("a : "); Out.Int(a, 0); Out.String("; b : "); Out.Int(b, 0); Out.Ln;
swapVals(a, b);
Out.String("after swap"); Out.Ln;
Out.String("a : "); Out.Int(a, 0); Out.String("; b : "); Out.Int(b, 0); Out.Ln;
END varparam.

View file

@ -0,0 +1,53 @@
MODULE record;
IMPORT Out;
CONST
Male = 1;
Female = 2;
TYPE
SexDesc = INTEGER;
Person = RECORD
Name : ARRAY 32 OF CHAR;
Age : INTEGER;
Title : ARRAY 64 OF CHAR;
Sex : SexDesc;
END;
VAR
i : INTEGER;
employer : Person;
employee : ARRAY 2 OF Person;
PROCEDURE dumpPerson ( p : Person );
BEGIN
Out.String("Meet "); Out.String(p.Name);
IF p.Sex = Male THEN Out.String(". He is ") END;
IF p.Sex = Female THEN Out.String(". She is ") END;
Out.Int(p.Age, 0); Out.String(" years old and a "); Out.String(p.Title); Out.Ln;
END dumpPerson;
BEGIN
(* define people *)
employer.Name := "Bing"; employer.Age := 42; employer.Title := "CEO"; employer.Sex := Male;
employee[0].Name := "Bob"; employee[0].Age := 26;
employee[0].Title := "SysAdmin"; employee[0].Sex := Male;
employee[1].Name := "Alice" ; employee[1].Age := 22;
employee[1].Title := "Programmer"; employee[1].Sex := Female;
(* print people *)
dumpPerson(employer);
FOR i := 0 TO LEN(employee) - 1 DO
dumpPerson(employee[i]);
END;
END record.

View file

@ -0,0 +1,33 @@
MODULE fibonacci;
IMPORT Out, Modules;
VAR
n : LONGINT;
Arg0 : LONGINT;
PROCEDURE getFib (n : LONGINT) : LONGINT;
VAR result : LONGINT;
BEGIN
IF n = 0 THEN
result := 0
ELSIF n = 1 THEN
result:= 1
ELSE
result := getFib(n-1) + getFib(n-2)
END;
RETURN result
END getFib;
BEGIN
IF Modules.ArgCount # 2 THEN
Out.String("one argument needed"); Out.Ln;
HALT(1);
END;
Modules.GetIntArg(1, Arg0);
Out.Int(getFib(Arg0), 0); Out.Ln;
END fibonacci.

View file

@ -0,0 +1,31 @@
MODULE gcd;
IMPORT Out, Modules;
VAR
gcd : INTEGER;
arg0, arg1 : LONGINT;
PROCEDURE getGCD(a, b : INTEGER): INTEGER;
VAR ret : INTEGER;
BEGIN
IF a = 0 THEN ret := b;
ELSIF b = 0 THEN ret := a;
ELSIF b > a THEN ret := getGCD(b, a);
ELSE ret := getGCD(b, a MOD b) END;
RETURN ret;
END getGCD;
BEGIN
IF Modules.ArgCount # 3 THEN
Out.String("enter two integers to get GCD"); Out.Ln;
HALT(1)
END;
Modules.GetIntArg(1, arg0); Modules.GetIntArg(2, arg1);
gcd := getGCD(SHORT(arg0), SHORT(arg1));
Out.Int(gcd, 0); Out.Ln;
END gcd.

View file

@ -0,0 +1,12 @@
MODULE values;
IMPORT Out;
BEGIN
Out.String("Oberon has types, for example, I am a string type (ARRAY OF CHAR);"); Out.Ln;
Out.String("There are also other types, e.g. INTEGERs and BOOLEANs"); Out.Ln;
Out.Int(42, 0);
Out.Ln
END values.

View file

@ -0,0 +1,31 @@
MODULE variables;
IMPORT Out;
VAR
s : ARRAY 32 OF CHAR;
i : REAL;
n, m : INTEGER;
BEGIN
s := "Initial";
Out.String(s); Out.Ln;
i := 3.14;
n := 64;
m := 42;
Out.Int(m, 0); Out.Ln;
Out.Int(n, 0); Out.Ln;
Out.Real(i, 0); Out.Ln;
s := "assigning new values";
Out.String(s); Out.Ln;
i := 2.71;
n := 128;
m := 84;
Out.Int(m, 0); Out.Ln;
Out.Int(n, 0); Out.Ln;
Out.Real(i, 0);
Out.Ln
END variables.

View file

@ -0,0 +1,17 @@
MODULE while;
IMPORT Out;
VAR
i : INTEGER;
BEGIN
i := 0;
Out.String("WHILE loop started"); Out.Ln;
WHILE i < 10 DO
i := i + 1;
Out.Int(i, 0); Out.Ln;
END;
END while.

26
src/obe.Mod Normal file
View file

@ -0,0 +1,26 @@
MODULE obe;
IMPORT
Files,
Platform,
Out;
PROCEDURE CheckDirectories;
BEGIN
END CheckDirectories;
PROCEDURE GenIndex;
CONST
templpath = "../templates/index.html";
outputpath = "../public/index.html";
examplespath = "../examples.txt";
VAR
outputfd, templfd, examplesfd: Files.File;
outputrd, templrd, examplesrd: Files.Rider;
BEGIN
END GenIndex;
BEGIN
CheckDirectories;
GenIndex;
END obe.