diff --git a/src/oberon.c b/src/oberon.c
index 58823246bde98fb0e9ebedd171d7fe24e85659c4..931a30724697a03476cff779779b3385bad5f2b4 100644 (file)
--- a/src/oberon.c
+++ b/src/oberon.c
return result;
}
return result;
}
+static oberon_object_t *
+oberon_find_object_in_scope(oberon_scope_t * scope, char * name, bool check_it)
+{
+ oberon_object_t * result = NULL;
+
+ result = oberon_find_object_in_list(scope -> list, name);
+
+ if(check_it && result == NULL)
+ {
+ oberon_error(scope -> ctx, "undefined ident %s", name);
+ }
+
+ return result;
+}
+
static oberon_object_t *
oberon_create_object(oberon_scope_t * scope, char * name, int class, bool export, bool read_only)
{
static oberon_object_t *
oberon_create_object(oberon_scope_t * scope, char * name, int class, bool export, bool read_only)
{
ctx -> xloc.col = 1;
ctx -> loc = ctx -> xloc;
ctx -> c = ctx -> code[ctx -> code_index];
ctx -> xloc.col = 1;
ctx -> loc = ctx -> xloc;
ctx -> c = ctx -> code[ctx -> code_index];
+ oberon_set_line(ctx, 1);
}
static void
}
static void
}
ctx -> xloc.line += 1;
ctx -> xloc.col = 1;
}
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;
}
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
{
}
else
{
char * name;
int export;
int read_only;
char * name;
int export;
int read_only;
+
+ if(ctx -> token == STAR)
+ {
+ oberon_assert_token(ctx, STAR);
+ }
+
name = oberon_assert_ident(ctx);
oberon_def(ctx, &export, &read_only);
name = oberon_assert_ident(ctx);
oberon_def(ctx, &export, &read_only);
oberon_close_scope(ctx -> decl);
oberon_object_t * proc;
oberon_close_scope(ctx -> decl);
oberon_object_t * proc;
- proc = oberon_find_object(ctx -> decl, name, 0);
+ proc = oberon_find_object_in_scope(ctx -> decl, name, 0);
if(proc == NULL)
{
proc = oberon_define_object(ctx -> decl, name, OBERON_CLASS_PROC, export, read_only, false);
if(proc == NULL)
{
proc = oberon_define_object(ctx -> decl, name, OBERON_CLASS_PROC, export, read_only, false);
@@ -2631,9 +2655,8 @@ oberon_field_list(oberon_context_t * ctx, oberon_type_t * rec, oberon_scope_t *
static void
oberon_type_record_body(oberon_context_t * ctx, oberon_type_t * rec)
{
static void
oberon_type_record_body(oberon_context_t * ctx, oberon_type_t * rec)
{
- oberon_scope_t * modscope = ctx -> mod -> decl;
oberon_scope_t * oldscope = ctx -> decl;
oberon_scope_t * oldscope = ctx -> decl;
- ctx -> decl = modscope;
+ ctx -> decl = oldscope;
if(ctx -> token == LPAREN)
{
if(ctx -> token == LPAREN)
{
this_scope -> parent = NULL;
this_scope -> parent_type = rec;
this_scope -> parent = NULL;
this_scope -> parent_type = rec;
- oberon_field_list(ctx, rec, modscope);
+ oberon_field_list(ctx, rec, oldscope);
while(ctx -> token == SEMICOLON)
{
oberon_assert_token(ctx, SEMICOLON);
while(ctx -> token == SEMICOLON)
{
oberon_assert_token(ctx, SEMICOLON);
- oberon_field_list(ctx, rec, modscope);
+ oberon_field_list(ctx, rec, oldscope);
}
rec -> scope = this_scope;
}
rec -> scope = this_scope;
static void
oberon_decl_seq(oberon_context_t * ctx)
{
static void
oberon_decl_seq(oberon_context_t * ctx)
{
- if(ctx -> token == CONST)
+ while(ctx -> token >= CONST && ctx -> token <= VAR)
{
{
- oberon_assert_token(ctx, CONST);
- while(ctx -> token == IDENT)
+ if(ctx -> token == CONST)
{
{
- oberon_const_decl(ctx);
- oberon_assert_token(ctx, SEMICOLON);
+ oberon_assert_token(ctx, CONST);
+ while(ctx -> token == IDENT)
+ {
+ oberon_const_decl(ctx);
+ oberon_assert_token(ctx, SEMICOLON);
+ }
}
}
- }
-
- if(ctx -> token == TYPE)
- {
- oberon_assert_token(ctx, TYPE);
- while(ctx -> token == IDENT)
+ else if(ctx -> token == TYPE)
{
{
- oberon_type_decl(ctx);
- oberon_assert_token(ctx, SEMICOLON);
+ oberon_assert_token(ctx, TYPE);
+ while(ctx -> token == IDENT)
+ {
+ oberon_type_decl(ctx);
+ oberon_assert_token(ctx, SEMICOLON);
+ }
}
}
- }
-
- if(ctx -> token == VAR)
- {
- oberon_assert_token(ctx, VAR);
- while(ctx -> token == IDENT)
+ else if(ctx -> token == VAR)
{
{
- oberon_var_decl(ctx);
- oberon_assert_token(ctx, SEMICOLON);
+ oberon_assert_token(ctx, VAR);
+ while(ctx -> token == IDENT)
+ {
+ oberon_var_decl(ctx);
+ oberon_assert_token(ctx, SEMICOLON);
+ }
}
}
}
}
/* Types */
oberon_new_intrinsic_type(ctx, "BYTE", ctx -> system_byte_type);
oberon_new_intrinsic_type(ctx, "PTR", ctx -> system_ptr_type);
/* Types */
oberon_new_intrinsic_type(ctx, "BYTE", ctx -> system_byte_type);
oberon_new_intrinsic_type(ctx, "PTR", ctx -> system_ptr_type);
+ oberon_new_intrinsic_type(ctx, "INT8", ctx -> byte_type);
+ oberon_new_intrinsic_type(ctx, "INT16", ctx -> shortint_type);
oberon_new_intrinsic_type(ctx, "INT32", ctx -> int_type);
oberon_new_intrinsic_type(ctx, "INT32", ctx -> int_type);
+ oberon_new_intrinsic_type(ctx, "INT64", ctx -> longint_type);
oberon_new_intrinsic_type(ctx, "SET32", ctx -> set_type);
/* Functions */
oberon_new_intrinsic_type(ctx, "SET32", ctx -> set_type);
/* Functions */