|
|
@ -1,6 +1,6 @@ |
|
|
|
# main.leg -- C parser + interpreter |
|
|
|
# |
|
|
|
# Last edited: 2025-02-01 10:24:25 by piumarta on xubuntu |
|
|
|
# Last edited: 2025-02-01 15:04:48 by piumarta on xubuntu |
|
|
|
|
|
|
|
%{ |
|
|
|
; |
|
|
@ -755,17 +755,19 @@ oop tags = 0; |
|
|
|
|
|
|
|
oop newTstruct(oop tag, oop members) |
|
|
|
{ |
|
|
|
List_do(tags, t) { |
|
|
|
if (tag == get(t, Tstruct,tag)) { |
|
|
|
if (!is(Tstruct, t)) |
|
|
|
fatal("tag '%s' redeclared as different type", symbolName(tag)); |
|
|
|
oop oldmembers = get(t, Tstruct,members); |
|
|
|
if (!isNil(oldmembers) && !isNil(members)) { |
|
|
|
fatal("tag '%s' redefined", symbolName(tag)); |
|
|
|
if (!isNil(tag)) { |
|
|
|
List_do(tags, t) { |
|
|
|
if (tag == get(t, Tstruct,tag)) { |
|
|
|
if (!is(Tstruct, t)) |
|
|
|
fatal("tag '%s' redeclared as different type", symbolName(tag)); |
|
|
|
oop oldmembers = get(t, Tstruct,members); |
|
|
|
if (!isNil(oldmembers) && !isNil(members)) { |
|
|
|
fatal("tag '%s' redefined", symbolName(tag)); |
|
|
|
} |
|
|
|
if (isNil(oldmembers) && !isNil(members)) |
|
|
|
set(t, Tstruct,members, members); |
|
|
|
return t; // uniqe types allow comparison by identity |
|
|
|
} |
|
|
|
if (isNil(oldmembers) && !isNil(members)) |
|
|
|
set(t, Tstruct,members, members); |
|
|
|
return t; // uniqe types allow comparison by identity |
|
|
|
} |
|
|
|
} |
|
|
|
oop obj = new(Tstruct); |
|
|
@ -1802,6 +1804,7 @@ stmt = WHILE c:cond s:stmt { $$ = newWhile(c, s) } |
|
|
|
| BREAK SEMI { $$ = newBreak() } |
|
|
|
| block |
|
|
|
| e:expr SEMI { $$ = e } |
|
|
|
| typedec |
|
|
|
| vardecl |
|
|
|
|
|
|
|
cond = LPAREN e:expr RPAREN { $$ = e } |
|
|
@ -3198,7 +3201,7 @@ oop assign(oop lhs, oop rhs) |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
case Member: { |
|
|
|
case Member: { // soru.name = rhs |
|
|
|
oop name = get(lhs, Member,name); |
|
|
|
oop soru = eval(get(lhs, Member,lhs)); // struct or union |
|
|
|
oop type = nil; |
|
|
@ -3231,7 +3234,7 @@ oop assign(oop lhs, oop rhs) |
|
|
|
assert(offset + vsize <= size); |
|
|
|
return setMemory(memory, offset, vtype, eval(rhs)); |
|
|
|
} |
|
|
|
case Dereference: { // *<&var> = rhs |
|
|
|
case Dereference: { // *<&var> = rhs, *<&const> = rhs, *<&memory> = rhs |
|
|
|
lhs = eval(get(lhs, Dereference,rhs)); |
|
|
|
switch (getType(lhs)) { |
|
|
|
case Pointer: { // &x |
|
|
@ -3848,13 +3851,7 @@ oop eval(oop exp) |
|
|
|
} |
|
|
|
RETURN(nil); |
|
|
|
} |
|
|
|
case TypeDecls: { |
|
|
|
oop types = get(exp, TypeDecls,typenames); |
|
|
|
List_do(types, type) { |
|
|
|
oop name = get(type, TypeName,name); |
|
|
|
oop type = get(type, TypeName,type); |
|
|
|
declareType(name, type); |
|
|
|
} |
|
|
|
case TypeDecls: { // local typenames only used within typeCheck() and can be ignored here |
|
|
|
RETURN(nil); |
|
|
|
} |
|
|
|
case Scope: break; |
|
|
|