summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: b240f3d)
raw | patch | inline | side by side (parent: b240f3d)
author | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Sun, 8 Oct 2017 15:25:39 +0000 (18:25 +0300) | ||
committer | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Sun, 8 Oct 2017 15:25:39 +0000 (18:25 +0300) |
diff --git a/Test.obn b/Test.obn
index 22a2a55a2296d4cb933c58e7bf882acf1207e69e..ea2d143a6b9a4cd952a1d30505f5ff09d90616ea 100644 (file)
--- a/Test.obn
+++ b/Test.obn
MODULE Test;
-PROCEDURE A(a : INTEGER);
VAR
x : INTEGER;
-END A;
+ p : PROCEDURE;
-PROCEDURE B(b : SHORTINT);
- PROCEDURE A(c : LONGINT);
- VAR
- y : ARRAY 3 OF INTEGER;
- END A;
-END B;
+ PROCEDURE X;
+ BEGIN
+ x := 1;
+ x := 2;
+ x := 3;
+ p
+ END X;
+BEGIN
+ X;
END Test.
index 0aa5f4efc0cfacc852f08c3e7a337ebbba2b959b..9ff5af38d1d1334d8adee189a0d370664dca1269 100644 (file)
--- a/notes
+++ b/notes
- Jasmin создаёт ошибку в float константах, надо как-то порешать.
- Нужно делать проверку границ при касте индекса массива с типом HUGEINT
-- Нужно передавать информацию о файле и строках в кодогенератор.
- Нет процедур привязанных к типм (10.2)
- Не полная реализация модуля Files
* Нет процедур ReadNum WriteNum
index 9cade33f431a92b3db20095545b259c69f93c588..f26c9513e000ca18cc3203fc0e67155b3111398c 100644 (file)
var -> gen_var -> forcetype = (enable) ? (var -> type -> gen_type) : (NULL);
}
+void oberon_set_line(oberon_context_t * ctx, int line)
+{
+ gen_module_t * m;
+ gen_proc_t * p;
+
+ m = ctx -> mod -> gen_mod;
+ if(m != NULL)
+ {
+ p = m -> class -> p;
+
+ if(p != NULL)
+ {
+ jvm_generate(p, 0, 0, ".line %i", line);
+ }
+
+ m -> line = line;
+ }
+}
index 44f89324f4c4495a063db9119e0bd1e73e6e1e07..52d59fa0e76eda02d804dffbcf797746dc492239 100644 (file)
{
struct gen_class * class;
int rec_id;
+ int line;
};
struct gen_label_t
diff --git a/src/generator.h b/src/generator.h
index 2618ec77e09b856c78a33a094effdc8306c7dd01..03e410ed384f35b620046cde9c969ea17bada88d 100644 (file)
--- a/src/generator.h
+++ b/src/generator.h
void oberon_generate_return(oberon_context_t * ctx, oberon_expr_t * expr);
void oberon_set_out_directory(oberon_context_t * ctx, const char * path);
+
+void oberon_set_line(oberon_context_t * ctx, int line);
diff --git a/src/oberon.c b/src/oberon.c
index 82566471b9a11b929d832f2d51ef355aa4d23dfc..931a30724697a03476cff779779b3385bad5f2b4 100644 (file)
--- a/src/oberon.c
+++ b/src/oberon.c
ctx -> xloc.col = 1;
ctx -> loc = ctx -> xloc;
ctx -> c = ctx -> code[ctx -> code_index];
+ oberon_set_line(ctx, 1);
}
static void
}
ctx -> xloc.line += 1;
ctx -> xloc.col = 1;
+ oberon_set_line(ctx, ctx -> xloc.line);
}
else if(ctx -> c == 0xA)
{
oberon_get_char(ctx);
ctx -> xloc.line += 1;
ctx -> xloc.col = 1;
+ oberon_set_line(ctx, ctx -> xloc.line);
}
else
{