###### 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) {
}$
$*exec
- ComplexStatement -> SimpleStatements NEWLINE ${
+ ComplexStatement -> SimpleStatementLine ${
$0 = reorder_bilist($<1);
}$
- | Newlines ${ $0 = NULL; }$
+ | ComplexStatement NEWLINE ${ $0 = $<1; }$
## ComplexStatement Grammar
$*binode
}$
| 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
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;
$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;
$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;
$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;
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