X-Git-Url: https://ocean-lang.org/code/?a=blobdiff_plain;f=csrc%2Foceani.mdc;h=e02057f31a27f9f01fdfa5d27ed2533d1cc9645f;hb=7b1280e4a50fee191043436ebc8b2f8c482ccdaf;hp=af7768dd1d763638d5142987c895d108d2a9f0a1;hpb=cbbbc8ec0230cf82765da33ecff7be9824006519;p=ocean diff --git a/csrc/oceani.mdc b/csrc/oceani.mdc index af7768d..e02057f 100644 --- a/csrc/oceani.mdc +++ b/csrc/oceani.mdc @@ -2001,41 +2001,50 @@ function will be needed. ###### top level grammar DeclareStruct -> struct IDENTIFIER FieldBlock ${ { - struct type *t = - add_type(c, $2.txt, &structure_prototype); - int cnt = 0; - struct fieldlist *f; - - for (f = $3; f; f=f->prev) - cnt += 1; - - t->structure.nfields = cnt; - t->structure.fields = calloc(cnt, sizeof(struct field)); - f = $3; - while (cnt > 0) { - cnt -= 1; - t->structure.fields[cnt] = f->f; - f->f.init = val_prepare(Tnone); - f = f->prev; - } - } }$ + struct type *t = + add_type(c, $2.txt, &structure_prototype); + int cnt = 0; + struct fieldlist *f; + + for (f = $3; f; f=f->prev) + cnt += 1; + + t->structure.nfields = cnt; + t->structure.fields = calloc(cnt, sizeof(struct field)); + f = $3; + while (cnt > 0) { + cnt -= 1; + t->structure.fields[cnt] = f->f; + f->f.init = val_prepare(Tnone); + f = f->prev; + } + } }$ + | DeclareStruct NEWLINE $void + Newlines -> NEWLINE + | Newlines NEWLINE Open -> { - | NEWLINE Open + | Newlines { Close -> } - | NEWLINE Close + | Newlines } $*fieldlist - FieldBlock -> Open FieldList Close ${ $0 = $<2; }$ + FieldBlock -> Open FieldList } ${ $0 = $<2; }$ | Open SimpleFieldList } ${ $0 = $<2; }$ - | : FieldList ${ $0 = $<2; }$ + | : FieldList $$NEWLINE ${ $0 = $<2; }$ - FieldList -> SimpleFieldList NEWLINE ${ $0 = $<1; }$ - | FieldList SimpleFieldList NEWLINE ${ + FieldList -> FieldLines ${ $0 = $<1; }$ + | Newlines FieldLines ${ $0 = $<2; }$ + FieldLines -> SimpleFieldListLine ${ $0 = $<1; }$ + | FieldLines SimpleFieldListLine ${ $2->prev = $<1; $0 = $<2; }$ + SimpleFieldListLine -> SimpleFieldList NEWLINE ${ $0 = $<1; }$ + | SimpleFieldListLine NEWLINE ${ $0 = $<1; }$ + | ERROR NEWLINE ${ tok_err(c, "Syntax error in struct field", &$1); }$ + SimpleFieldList -> Field ${ $0 = $<1; }$ | SimpleFieldList ; Field ${ $3->prev = $<1; @@ -2067,7 +2076,6 @@ function will be needed. $0->f.type = $<3; $0->f.init = val_init($3); }$ - | ERROR ${ tok_err(c, "Syntax error in struct field", &$1); }$ ###### forward decls static void structure_print_type(struct type *t, FILE *f); @@ -3051,11 +3059,11 @@ is in-place. $*binode Block -> Open Statementlist Close ${ $0 = $<2; }$ | Open SimpleStatements } ${ $0 = reorder_bilist($<2); }$ - | : SimpleStatements $$NEWLINE ${ $0 = reorder_bilist($<2); }$ - | : Statementlist $$NEWLINE ${ $0 = $<2; }$ + | : SimpleStatements ${ $0 = reorder_bilist($<2); }$ + | : Statementlist $$OUT ${ $0 = $<2; }$ Statementlist -> ComplexStatements ${ $0 = reorder_bilist($<1); }$ - | NEWLINE Statementlist ${ $0 = $<2; }$ + | Newlines ComplexStatements ${ $0 = reorder_bilist($<2); }$ ComplexStatements -> ComplexStatements ComplexStatement ${ if ($2 == NULL) { @@ -3098,9 +3106,9 @@ is in-place. $0->left = NULL; $0->right = $<1; }$ - | SimpleStatements ; ${ $0 = $<1; }$ SimpleStatementLine -> SimpleStatements NEWLINE ${ $0 = $<1; }$ + | SimpleStatements ; NEWLINE ${ $0 = $<1; }$ | SimpleStatementLine NEWLINE ${ $0 = $<1; }$ SimpleStatement -> pass ${ $0 = NULL; }$ @@ -3557,7 +3565,7 @@ defined. case Xcond_statement: free_cond_statement(cast(cond_statement, e)); break; ###### ComplexStatement Grammar - | CondStatement ${ $0 = $<1; }$ + | CondStatement $$NEWLINE ${ $0 = $<1; }$ ###### Grammar @@ -3636,7 +3644,10 @@ defined. $*exec // These scopes are closed in CondSuffix - ForPart -> for OpenScope SimpleStatements ${ + ForPart -> for OpenScope SimpleStatements ; ${ + $0 = reorder_bilist($<3); + }$ + | for OpenScope SimpleStatements NEWLINE ${ $0 = reorder_bilist($<3); }$ | for OpenScope Block ${ @@ -3644,7 +3655,11 @@ defined. }$ | ForPart NEWLINE ${ $0 = $<1; }$ - ThenPart -> then OpenScope SimpleStatements ${ + ThenPart -> then OpenScope SimpleStatements ; ${ + $0 = reorder_bilist($<3); + var_block_close(c, CloseSequential); + }$ + | then OpenScope SimpleStatements NEWLINE ${ $0 = reorder_bilist($<3); var_block_close(c, CloseSequential); }$ @@ -3932,14 +3947,15 @@ various declarations in the parse context. $void Ocean -> DeclarationList + | Newlines DeclarationList DeclarationList -> Declaration | DeclarationList Declaration - Declaration -> DeclareConstant + Declaration -> Declaration NEWLINE + | DeclareConstant | DeclareProgram | DeclareStruct - | NEWLINE | ERROR NEWLINE ${ tok_err(c, "error: unhandled parse error", &$1); @@ -3974,17 +3990,19 @@ searching through for the Nth constant for decreasing N. DeclareConstant -> const Open ConstList Close | const Open SimpleConstList } - | const : ConstList + | const : ConstList $$NEWLINE | const SimpleConstList NEWLINE - ConstList -> ComplexConsts - | NEWLINE ConstList - ComplexConsts -> ComplexConst ComplexConsts - | ComplexConst - ComplexConst -> SimpleConstList NEWLINE + ConstList -> ConstLines + | Newlines ConstLines + ConstLines -> ConstLines SimpleConstLine + | SimpleConstLine SimpleConstList -> SimpleConstList ; Const | Const | SimpleConstList ; + SimpleConstLine -> SimpleConstList NEWLINE + | SimpleConstLine NEWLINE + | ERROR NEWLINE ${ tok_err(c, "Syntax error in constant", &$1); }$ $*type CType -> Type ${ $0 = $<1; }$ @@ -4017,7 +4035,6 @@ searching through for the Nth constant for decreasing N. v->val = interp_exec($5); } } }$ - | ERROR NEWLINE ${ tok_err(c, "Syntax error in constant", &$1); }$ ###### print const decls { @@ -4316,6 +4333,8 @@ things which will likely grow as the languages grows. print "", list[i], print + if 1 == 2: print "yes" else: print "no" + bob:fred bob.name = "Hello" bob.alive = (bob.name == "Hello")