]> ocean-lang.org Git - ocean/commitdiff
oceani: change NEWLINE parsing in statements to new model.
authorNeilBrown <neil@brown.name>
Sun, 16 Jun 2019 00:16:07 +0000 (10:16 +1000)
committerNeilBrown <neil@brown.name>
Sun, 16 Jun 2019 00:33:49 +0000 (10:33 +1000)
The new module is:

 A list of line-like things must access a newline first:
  Statementlist -> Statements
                | NEWLINE Statementlist

 Any line-like thing must reduce to a single symbol:
   SimpleStatementLine IfPart WhilePart CasePart etc
 An individual line-like thing must allow following newlines
 e.g.
   IfHead -> if Expression Block
           | IfHead NEWLINE

 A block that can be multi-line or single-line should be marked with
   $$NEWLINE
 This will require a NEWLINE to reduce it, but won't swollow the newline.

Signed-off-by: NeilBrown <neil@brown.name>
csrc/oceani.mdc

index 8fef86460ab64f08583b8ec2776d945bc302771b..478186ae19d81f0eadea542c19166c4a1794aacf 100644 (file)
@@ -3048,17 +3048,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; }$
+               | : SimpleStatements $$NEWLINE ${ $0 = reorder_bilist($<2); }$
+               | : Statementlist $$NEWLINE ${ $0 = $<2; }$
 
        Statementlist -> ComplexStatements ${ $0 = reorder_bilist($<1); }$
+               | NEWLINE Statementlist ${ $0 = $<2; }$
 
        ComplexStatements -> ComplexStatements ComplexStatement ${
                        if ($2 == NULL) {
@@ -3082,10 +3079,10 @@ is in-place.
                }$
 
        $*exec
-       ComplexStatement -> SimpleStatements NEWLINE ${
+       ComplexStatement -> SimpleStatementLine ${
                        $0 = reorder_bilist($<1);
                        }$
-               | Newlines ${ $0 = NULL; }$
+               | ComplexStatement NEWLINE ${ $0 = $<1; }$
                ## ComplexStatement Grammar
 
        $*binode
@@ -3103,6 +3100,9 @@ is in-place.
                        }$
                | SimpleStatements ; ${ $0 = $<1; }$
 
+       SimpleStatementLine -> SimpleStatements NEWLINE ${ $0 = $<1; }$
+               | SimpleStatementLine NEWLINE ${ $0 = $<1; }$
+
        SimpleStatement -> pass ${ $0 = NULL; }$
                | ERROR ${ tok_err(c, "Syntax error in statement", &$1); }$
                ## SimpleStatement Grammar
@@ -3557,14 +3557,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 +3572,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 +3580,16 @@ 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 ${
+               | SwitchPart CondSuffix ${
                        $0 = $<2;
                        $0->condpart = $<1;
                        }$
-               | ifPart IfSuffix ${
+               | IfPart IfSuffix ${
                        $0 = $<2;
                        $0->condpart = $1.condpart; $1.condpart = NULL;
                        $0->thenpart = $1.thenpart; $1.thenpart = NULL;
@@ -3609,20 +3609,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 +3632,67 @@ 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 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 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 ${
-                       $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 ${
+       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