X-Git-Url: https://ocean-lang.org/code/?a=blobdiff_plain;f=csrc%2Foceani.mdc;h=e02057f31a27f9f01fdfa5d27ed2533d1cc9645f;hb=7b1280e4a50fee191043436ebc8b2f8c482ccdaf;hp=b1b5c334c1bc811c2d0172f45f050125b03d8053;hpb=e96a9148cef03554ac07203c2e2441277c9b5845;p=ocean diff --git a/csrc/oceani.mdc b/csrc/oceani.mdc index b1b5c33..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); @@ -2472,7 +2480,7 @@ room for ambiguity, so a full conditional expression is allowed in there. ###### Grammar - $LEFT $$ifelse + $LEFT if $$ifelse ## expr precedence $*exec @@ -2695,7 +2703,7 @@ expression operator. NEql, ###### expr precedence - $LEFT CMPop + $LEFT < > <= >= == != CMPop ###### expression grammar | Expression CMPop Expression ${ { @@ -2807,8 +2815,8 @@ precedence is handled better I might be able to discard this. Bracket, ###### expr precedence - $LEFT Eop - $LEFT Top + $LEFT + - Eop + $LEFT * / % ++ Top $LEFT Uop ###### expression grammar @@ -3048,17 +3056,14 @@ is in-place. ###### Grammar - $void - Newlines -> NEWLINE - | Newlines NEWLINE - $*binode Block -> Open Statementlist Close ${ $0 = $<2; }$ | Open SimpleStatements } ${ $0 = reorder_bilist($<2); }$ | : SimpleStatements ${ $0 = reorder_bilist($<2); }$ - | : Statementlist ${ $0 = $<2; }$ + | : Statementlist $$OUT ${ $0 = $<2; }$ Statementlist -> ComplexStatements ${ $0 = reorder_bilist($<1); }$ + | Newlines ComplexStatements ${ $0 = reorder_bilist($<2); }$ ComplexStatements -> ComplexStatements ComplexStatement ${ if ($2 == NULL) { @@ -3082,10 +3087,10 @@ is in-place. }$ $*exec - ComplexStatement -> SimpleStatements NEWLINE ${ + ComplexStatement -> SimpleStatementLine ${ $0 = reorder_bilist($<1); }$ - | Newlines ${ $0 = NULL; }$ + | ComplexStatement NEWLINE ${ $0 = $<1; }$ ## ComplexStatement Grammar $*binode @@ -3101,7 +3106,10 @@ 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; }$ | ERROR ${ tok_err(c, "Syntax error in statement", &$1); }$ @@ -3557,14 +3565,14 @@ defined. case Xcond_statement: free_cond_statement(cast(cond_statement, e)); break; ###### ComplexStatement Grammar - | CondStatement ${ $0 = $<1; }$ + | CondStatement $$NEWLINE ${ $0 = $<1; }$ ###### Grammar $*cond_statement // both ForThen and Whilepart open scopes, and CondSuffix only // closes one - so in the first branch here we have another to close. - CondStatement -> forPart ThenPart WhilePart CondSuffix ${ + CondStatement -> ForPart ThenPart WhilePart CondSuffix ${ $0 = $<4; $0->forpart = $<1; $0->thenpart = $<2; @@ -3572,7 +3580,7 @@ defined. $0->dopart = $3.dopart; $3.dopart = NULL; var_block_close(c, CloseSequential); }$ - | forPart WhilePart CondSuffix ${ + | ForPart WhilePart CondSuffix ${ $0 = $<3; $0->forpart = $<1; $0->thenpart = NULL; @@ -3580,16 +3588,18 @@ defined. $0->dopart = $2.dopart; $2.dopart = NULL; var_block_close(c, CloseSequential); }$ - | whilePart CondSuffix ${ + | WhilePart CondSuffix ${ $0 = $<2; $0->condpart = $1.condpart; $1.condpart = NULL; $0->dopart = $1.dopart; $1.dopart = NULL; }$ - | switchPart CondSuffix ${ - $0 = $<2; + | SwitchPart CasePart CondSuffix ${ + $0 = $<3; $0->condpart = $<1; + $2->next = $0->casepart; + $0->casepart = $<2; }$ - | ifPart IfSuffix ${ + | IfPart IfSuffix ${ $0 = $<2; $0->condpart = $1.condpart; $1.condpart = NULL; $0->thenpart = $1.thenpart; $1.thenpart = NULL; @@ -3609,20 +3619,18 @@ defined. $0->casepart = $<1; }$ - $void - Case -> case - | NEWLINE Case $*casepart - CasePart -> Case Expression OpenScope Block ${ + CasePart -> case Expression OpenScope Block ${ $0 = calloc(1,sizeof(struct casepart)); $0->value = $<2; $0->action = $<4; var_block_close(c, CloseParallel); }$ + | CasePart NEWLINE ${ $0 = $<1; }$ $*cond_statement IfSuffix -> ${ $0 = new(cond_statement); }$ - | NEWLINE IfSuffix ${ $0 = $<2; }$ + | IfSuffix NEWLINE ${ $0 = $<1; }$ | else OpenScope Block ${ $0 = new(cond_statement); $0->elsepart = $<3; @@ -3634,83 +3642,74 @@ defined. var_block_close(c, CloseElse); }$ - $void - Then -> then - | NEWLINE Then - While -> while - | NEWLINE While - Do -> do - | NEWLINE Do $*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 ${ $0 = $<3; }$ + | ForPart NEWLINE ${ $0 = $<1; }$ - ThenPart -> Then OpenScope SimpleStatements ${ + ThenPart -> then OpenScope SimpleStatements ; ${ $0 = reorder_bilist($<3); var_block_close(c, CloseSequential); }$ - | Then OpenScope Block ${ + | then OpenScope SimpleStatements NEWLINE ${ + $0 = reorder_bilist($<3); + var_block_close(c, CloseSequential); + }$ + | then OpenScope Block ${ $0 = $<3; var_block_close(c, CloseSequential); }$ + | ThenPart NEWLINE ${ $0 = $<1; }$ // This scope is closed in CondSuffix - WhileHead -> While OpenScope Block ${ - $0 = $<3; - }$ - whileHead -> while OpenScope Block ${ - $0 = $<3; - }$ + WhileHead -> while OpenScope Block ${ $0 = $<3; }$ + | WhileHead NEWLINE ${ $0 = $<1; }$ $cond_statement // This scope is closed in CondSuffix - whilePart -> while OpenScope Expression Block ${ + WhilePart -> while OpenScope Expression Block ${ $0.type = Xcond_statement; $0.condpart = $<3; $0.dopart = $<4; }$ - | whileHead Do Block ${ - $0.type = Xcond_statement; - $0.condpart = $<1; - $0.dopart = $<3; - }$ - WhilePart -> While OpenScope Expression Block ${ - $0.type = Xcond_statement; - $0.condpart = $<3; - $0.dopart = $<4; - }$ - | WhileHead Do Block ${ + | WhileHead do Block ${ $0.type = Xcond_statement; $0.condpart = $<1; $0.dopart = $<3; }$ + | WhilePart NEWLINE ${ $0 = $<1; }$ - ifPart -> if OpenScope Expression OpenScope Block ${ + IfPart -> if OpenScope Expression OpenScope Block ${ $0.type = Xcond_statement; $0.condpart = $<3; $0.thenpart = $<5; var_block_close(c, CloseParallel); }$ - | if OpenScope Block Then OpenScope Block ${ + | if OpenScope Block then OpenScope Block ${ $0.type = Xcond_statement; $0.condpart = $<3; $0.thenpart = $<6; var_block_close(c, CloseParallel); }$ + | IfPart NEWLINE ${ $0 = $<1; }$ $*exec // This scope is closed in CondSuffix - switchPart -> switch OpenScope Expression ${ + SwitchPart -> switch OpenScope Expression ${ $0 = $<3; }$ | switch OpenScope Block ${ $0 = $<3; }$ + | SwitchPart NEWLINE ${ $0 = $<1; }$ ###### print exec cases @@ -3948,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); @@ -3990,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; }$ @@ -4033,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 { @@ -4104,10 +4105,6 @@ analysis is a bit more interesting at this level. var_block_close(c, CloseSequential); if (c->scope_stack && !c->parse_error) abort(); }$ - | ERROR ${ - tok_err(c, - "error: unhandled parse error", &$1); - }$ Varlist -> Varlist ArgDecl ${ $0 = new(binode); @@ -4336,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")