summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 8b545fd)
raw | patch | inline | side by side (parent: 8b545fd)
author | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Wed, 9 Aug 2017 14:05:35 +0000 (17:05 +0300) | ||
committer | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Wed, 9 Aug 2017 14:05:35 +0000 (17:05 +0300) |
Out.obn | [new file with mode: 0644] | patch | blob |
Test.obn | [new file with mode: 0644] | patch | blob |
jvm_test.sh | patch | blob | history | |
notes | patch | blob | history | |
run.sh | patch | blob | history | |
src/backends/jvm/generator-jvm-abi.c | patch | blob | history | |
src/test.c | patch | blob | history |
diff --git a/Out.obn b/Out.obn
--- /dev/null
+++ b/Out.obn
@@ -0,0 +1,24 @@
+MODULE Out;
+
+PROCEDURE Open*;
+END Open;
+
+PROCEDURE Char*(ch : CHAR);
+END Char;
+
+PROCEDURE String*(str : ARRAY OF CHAR);
+END String;
+
+PROCEDURE Int*(i, n : LONGINT);
+END Int;
+
+PROCEDURE Real*(x : REAL; n : INTEGER);
+END Real;
+
+PROCEDURE LongReal*(x : LONGREAL; n : INTEGER);
+END LongReal;
+
+PROCEDURE Ln*;
+END Ln;
+
+END Out.
diff --git a/Test.obn b/Test.obn
--- /dev/null
+++ b/Test.obn
@@ -0,0 +1,8 @@
+MODULE Test;
+
+IMPORT Out;
+
+BEGIN
+ Out.Open;
+ Out.String("Hello World!"); Out.Ln;
+END Test.
diff --git a/jvm_test.sh b/jvm_test.sh
index 6519656ef1f13317b42551fb8e3b63bf9a35f1cc..4944b91404c0099a0e36e1aede03e4fc679630dd 100755 (executable)
--- a/jvm_test.sh
+++ b/jvm_test.sh
rm -f *.j *.jad
mkdir -p classes
-./run.sh
+./run.sh $*
javac -d classes Launcher.java
jasmin -d classes *.j
index b6f9cdd9019b12eaca3a4b8183b84af4e8ffebef..1e0a9e58c2a1176e3c9b99fc2bc23b97da5523a2 100644 (file)
--- a/notes
+++ b/notes
- Не реализована свёртка констант
- Нужно пробежаться по стандарту и всё перепроверить.
-- JVM: Не реализованы VAR-параметры.
-- JVM: Не реализованы локальные процедуры.
- JVM: Не реализовано полное сранение массивов.
- JVM: Не реализовано полное сранение записей.
+- JVM: Не достаточно средств для реализации рефлексии на уровне локальных процедур.
+ (Как минимум нужно каждой функции добавлять фрейм к параметрам)
- Нужны средства создания биндингов. На данный момент реализуемо как заглушки для модулей.
- Любая ошибка фатальна
index 58023d2a432f2c23471c6d78395f8c59eb797f14..f53eb55a689bfb7b09f28ec9bbf35f4365323a94 100755 (executable)
--- a/run.sh
+++ b/run.sh
export PATH="/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1:${PATH}"
export LIBRARY_PATH="/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1:${LIBRARY_PATH}"
-exec ./a.out
+exec ./a.out $*
index a750b927fb170a568a27f0f5bc29fe1ab6bdf038..ddaf45f77cfe6e9e66b535adef6e1413ee5144fa 100644 (file)
#include "generator-jvm-asm.h"
#include "generator-jvm-basic.h"
-/*
- * --- Каждый модуль является объектом.
- * Импортируемые модули представляются полями.
- * Каждая глобальная переменная представляется не статическим полем.
- * Каждая процедура представляется не статическим метеодом.
- * Процедура инициализации модуля имеет название BEGIN.
- * Процедура финализации модуля имеет название END.
- * Это позволит сделать динамическую загрузку и выгрузку.
- * +++ всем переменным и полям в дескриптор добавляется "["
- * Это позволит делать ссылки на переменные в VAR-параметрах.
- * --- Каждая процедура снабжается параметром-фреймом.
- * Это позволит реализовать локальные процедуры и средства рефлекции над стеком.
- */
-
void
jvm_generate_ldst_prepare(gen_proc_t * p, gen_var_t * v)
{
diff --git a/src/test.c b/src/test.c
index ad95a34cf1f36fc78a7ed440cff0f1cbfccdd7ea..8029be718d08bc4823e6723657a66441b68fe651 100644 (file)
--- a/src/test.c
+++ b/src/test.c
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "../include/oberon.h"
-static char source_test[] =
- "(* Main module *)"
- "MODULE Test;"
- "IMPORT Out;"
- ""
- "VAR i : INTEGER;"
- ""
- "PROCEDURE X(VAR x : INTEGER; y : INTEGER);"
- " VAR"
- " q, w, r : INTEGER;"
- " PROCEDURE Y;"
- " VAR levY : INTEGER;"
- " BEGIN"
- " x := 3345;"
- " q := 666;"
- " END Y;"
- "BEGIN"
- " x := 54646;"
- " q := 1;"
- " Y;"
- " Out.String('Pos Y: q = '); Out.Int(q, 0); Out.Ln;"
- "END X;"
- ""
- "BEGIN;"
- " i := 1;"
- " X(i, i);"
- " Out.Int(i, 0); Out.Ln;"
- "END Test."
-;
-
-static char source_out[] =
- "MODULE Out;"
- " PROCEDURE Open*;"
- " END Open;"
- ""
- " PROCEDURE Char* (ch : CHAR);"
- " END Char;"
- ""
- " PROCEDURE String* (str : ARRAY OF CHAR);"
- " END String;"
- ""
- " PROCEDURE Int*(i, n : LONGINT);"
- " END Int;"
- ""
- " PROCEDURE Real*(x : REAL; n : INTEGER);"
- " END Real;"
- ""
- " PROCEDURE LongReal*(x : LONGREAL; n : INTEGER);"
- " END LongReal;"
- ""
- " PROCEDURE Ln*;"
- " END Ln;"
- ""
- "END Out."
-;
-
static oberon_context_t * ctx;
static oberon_module_t * mod;
static const char *
import_module(const char * name)
{
- if(strcmp(name, "Test") == 0)
- {
- return source_test;
- }
- else if(strcmp(name, "Out") == 0)
- {
- return source_out;
- }
- else
- {
- return NULL;
- }
-}
-
-typedef void (*TOutOpen)();
-static TOutOpen * OutOpenPtr;
-void ImplOutOpen()
-{
-}
+ assert(name);
-typedef void (*TOutInt)(int, int);
-static TOutInt * OutIntPtr;
-void ImplOutInt(int i, int n)
-{
- char number[22];
- snprintf(number, 22, "%d", i);
- int len = strlen(number);
- for(int i = 0; i < n - len; i++)
+ FILE * fp;
+ char fname[256];
+ snprintf(fname, 256, "%s.obn", name);
+ fp = fopen(fname, "r");
+ if(fp == NULL)
{
- putchar(' ');
+ printf("can't open file %s\n", fname);
+ exit(1);
+ return NULL;
}
- printf("%s", number);
-}
-typedef void (*TOutReal)(float, int);
-static TOutReal * OutRealPtr;
-void ImplOutReal(float i, int n)
-{
- char number[32];
- snprintf(number, 32, "%F", i);
- int len = strlen(number);
- for(int i = 0; i < n - len; i++)
- {
- putchar(' ');
- }
- printf("%s", number);
-}
+ char * source;
+ size_t len;
-typedef void (*TOutLn)();
-static TOutLn * OutLnPtr;
-void ImplOutLn()
-{
- putchar('\n');
-}
+ fseek(fp, 0, SEEK_END);
+ len = ftell(fp);
+ fseek(fp, 0, SEEK_SET);
-void init_system_modules()
-{
- OutOpenPtr = oberon_generator_get_var(ctx, "Out_Open");
- *OutOpenPtr = ImplOutOpen;
- OutIntPtr = oberon_generator_get_var(ctx, "Out_Int");
- *OutIntPtr = ImplOutInt;
- OutRealPtr = oberon_generator_get_var(ctx, "Out_Real");
- *OutRealPtr = ImplOutReal;
- OutLnPtr = oberon_generator_get_var(ctx, "Out_Ln");
- *OutLnPtr = ImplOutLn;
-}
+ source = calloc(1, len + 1);
+ fread(source, len, 1, fp);
-void start_module()
-{
- void (*begin)() = oberon_generator_get_procedure(ctx, "Test_BEGIN");
- begin();
+ return source;
}
int
main(int argc, char ** argv)
{
- ctx = oberon_create_context(import_module);
- mod = oberon_compile_module(ctx, source_test);
-
- oberon_generate_code(ctx);
+ const char * code;
-// init_system_modules();
+ if(argc != 2)
+ {
+ printf("use: %s <source>\n", argv[0]);
+ return 1;
+ }
-// oberon_generator_dump(ctx, "dump.txt");
+ code = import_module(argv[1]);
-// start_module();
+ ctx = oberon_create_context(import_module);
+ mod = oberon_compile_module(ctx, code);
+ oberon_generate_code(ctx);
oberon_destroy_context(ctx);
return 0;
}