$TERM if { } : * + - / ; =
-Program -> Statementlist ${ print_statement($1, 0); }$
+Program -> OptNL Statementlist ${ print_statement($S, 0); }$
+
+OptNL ->
+ | OptNL NEWLINE
+Newlines -> NEWLINE
+ | Newlines NEWLINE
$*statement
- Newlines -> NEWLINE
- | Newlines NEWLINE
- Statementlist -> Statements ${ $0 = $<S; }$
- | Newlines Statements ${ $0 = $<S1; }$
-
- Statements -> Statements Statement ${
- {
- struct statement **s;
- $0 = $<1;
- s = &$0;
- while (*s)
- s = &(*s)->next;
- *s = $<2;
- }
- }$
- | Statement ${ $0 = $<1; }$
- | ERROR ${ printf("statement ERROR\n"); $0 = NULL; }$
-
- Open -> {
- | Newlines {
- Close -> }
- | Newlines }
- Block -> Open Statementlist Close ${ $0 = $<S; }$
- | Open SimpleStatements } ${ $0 = $<S; }$
- | : SimpleStatements ${ $0 = $<SS; }$
- | : StatementBlock ${ $0 = $<SB; }$
- StatementBlock -> Statementlist ${ $0 = $<Sl; }$
+
+ Statementlist -> Statementlist Statement ${
+ {
+ struct statement **s;
+ $0 = $<1;
+ s = &$0;
+ while (*s)
+ s = &(*s)->next;
+ *s = $<2;
+ }
+ }$
+ | Statement ${ $0 = $<1; }$
+
+ Block -> { IN OptNL Statementlist OUT OptNL } ${ $0 = $<Stat; }$
+ | { SimpleStatements } ${ $0 = $<S; }$
+ | { SimpleStatements ; } ${ $0 = $<S; }$
+ | : IN OptNL Statementlist OUT ${ $0 = $<Sl; }$
+ | : SimpleStatements EOL ${ $0 = $<Si; }$
+ | : SimpleStatements ; ${ $0 = $<Si; }$
SimpleStatements -> SimpleStatements ; SimpleStatement ${
{
}
}$
| SimpleStatement ${ $0 = $<1; }$
- | SimpleStatements ; ${ $0 = $<1; }$
SimpleStatement -> Factor = Expression ${
$0 = calloc(1, sizeof(struct statement));
$0->expr->op = $2.txt;
$0->expr->right = $<3;
}$
- SSline -> SimpleStatements NEWLINE ${ $0 = $<1; }$
- Statement -> SSline ${ $0 = $<1; }$
- | IfStatement ${ $0 = $<1; }$
- | Statement NEWLINE ${ $0 = $<1; }$
+ Statement -> SimpleStatements Newlines ${ $0 = $<SS; }$
+ | SimpleStatements ; Newlines ${ $0 = $<SS; }$
+ | IfHead Newlines ${ $0 = $<If; }$
+ | IfHead Newlines IfSuffix ${
+ $0 = $<IH;
+ $0->next = $IS->next;
+ $IS->next = NULL;
+ $0->elsepart = $<IS;
+ }$
+ | IfHead IfSuffix ${
+ $0 = $<IH;
+ $0->next = $IS->next;
+ $IS->next = NULL;
+ $0->elsepart = $<IS;
+ }$
+ | ERROR Newlines ${ printf("statement ERROR\n"); $0 = NULL; }$
$RIGHT else
IfHead -> if Expression Block ${
$0 = calloc(1, sizeof(struct statement));
- $0->expr = $<2;
- $0->thenpart = $<3;
+ $0->expr = $<Ex;
+ $0->thenpart = $<Bl;
}$
- | IfHead NEWLINE ${ $0 = $<1; }$
- IfStatement -> IfHead $$else ${ $0 = $<1; }$
- | IfHead else Block ${
- $0 = $<1;
- $0->elsepart = $<3;
- }$
- | IfHead else IfStatement ${
- $0 = $<1;
- $0->elsepart = $<3;
- }$
+ IfSuffix -> else Block Newlines ${ $0 = $<Bl; }$
+ | else IfHead Newlines ${ $0 = $<IH; }$
+ | else IfHead IfSuffix ${
+ $0 = $<IH;
+ $0->elsepart = $IS;
+ $0->next = $IS->next;
+ $IS->next = NULL;
+ }$
+ | else IfHead Newlines IfSuffix ${
+ $0 = $<IH;
+ $0->elsepart = $IS;
+ $0->next = $IS->next;
+ $IS->next = NULL;
+ }$
$*expression
Expression -> Expression + Term ${