char *section = NULL;
struct parse_context context = {
.config = {
- .ignored = (1 << TK_line_comment)
- | (1 << TK_block_comment)
- | (1 << TK_mark),
+ .ignored = (1 << TK_mark),
.number_chars = ".,_+- ",
.word_start = "_",
.word_cont = "_",
###### includes
#include <gmp.h>
- #include "string.h"
- #include "number.h"
+ #include "parse_string.h"
+ #include "parse_number.h"
###### libs
myLDLIBS := libnumber.o libstring.o -lgmp
###### 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;
$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);
$*binode
Block -> Open Statementlist Close ${ $0 = $<2; }$
| Open SimpleStatements } ${ $0 = reorder_bilist($<2); }$
- | : SimpleStatements $$NEWLINE ${ $0 = reorder_bilist($<2); }$
- | : Statementlist $$NEWLINE ${ $0 = $<2; }$
+ | : SimpleStatements ${ $0 = reorder_bilist($<2); }$
+ | : Statementlist $$OUT ${ $0 = $<2; }$
Statementlist -> ComplexStatements ${ $0 = reorder_bilist($<1); }$
- | NEWLINE Statementlist ${ $0 = $<2; }$
+ | Newlines ComplexStatements ${ $0 = reorder_bilist($<2); }$
ComplexStatements -> ComplexStatements ComplexStatement ${
if ($2 == NULL) {
$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; }$
$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 ${
$0 = $<2;
$0->elsepart = $<3;
var_block_close(c, CloseElse);
}$
+ | else OpenScope SimpleStatements NEWLINE ${
+ $0 = new(cond_statement);
+ $0->elsepart = reorder_bilist($<3);
+ var_block_close(c, CloseElse);
+ }$
| else OpenScope CondStatement ${
$0 = new(cond_statement);
$0->elsepart = $<3;
$*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 ${
}$
| ForPart NEWLINE ${ $0 = $<1; }$
- ThenPart -> then OpenScope SimpleStatements ${
+ ThenPart -> then OpenScope SimpleStatements ; ${
+ $0 = reorder_bilist($<3);
+ var_block_close(c, CloseSequential);
+ }$
+ | then OpenScope SimpleStatements NEWLINE ${
$0 = reorder_bilist($<3);
var_block_close(c, CloseSequential);
}$
$0.thenpart = $<5;
var_block_close(c, CloseParallel);
}$
+ | if OpenScope Expression OpenScope then Block ${
+ $0.type = Xcond_statement;
+ $0.condpart = $<3;
+ $0.thenpart = $<6;
+ var_block_close(c, CloseParallel);
+ }$
+ | if OpenScope Expression OpenScope then SimpleStatements ; ${
+ $0.type = Xcond_statement;
+ $0.condpart = $<3;
+ $0.thenpart = reorder_bilist($<6);
+ var_block_close(c, CloseParallel);
+ }$
+ | if OpenScope Expression OpenScope then SimpleStatements NEWLINE ${
+ $0.type = Xcond_statement;
+ $0.condpart = $<3;
+ $0.thenpart = reorder_bilist($<6);
+ var_block_close(c, CloseParallel);
+ }$
| if OpenScope Block then OpenScope Block ${
$0.type = Xcond_statement;
$0.condpart = $<3;
$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);
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; }$
v->val = interp_exec($5);
}
} }$
- | ERROR NEWLINE ${ tok_err(c, "Syntax error in constant", &$1); }$
###### print const decls
{
print "", list[i],
print
+ if 1 == 2 then print "yes"; else print "no"
+
bob:fred
bob.name = "Hello"
bob.alive = (bob.name == "Hello")