From 3a83d91ef3b37d50680c15c00fc4ee44cb70c6ea Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Sun, 16 Jun 2019 10:16:07 +1000 Subject: [PATCH] oceani: change NEWLINE parsing in statements to new model. 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 --- csrc/oceani.mdc | 82 +++++++++++++++++++------------------------------ 1 file changed, 32 insertions(+), 50 deletions(-) diff --git a/csrc/oceani.mdc b/csrc/oceani.mdc index 8fef864..478186a 100644 --- a/csrc/oceani.mdc +++ b/csrc/oceani.mdc @@ -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 -- 2.43.0