X-Git-Url: https://ocean-lang.org/code/?a=blobdiff_plain;f=csrc%2Findent_test.mdc;h=f3bd7f1517960575b2ceb71253f2647c739223ae;hb=6c169be0f1605d213b40db3a99b6b3689fd524da;hp=699b3ca1b08c5502889526a547675579cbd05b51;hpb=70f81bfd8197056d800dad88ba4339fc6fad9801;p=ocean diff --git a/csrc/indent_test.mdc b/csrc/indent_test.mdc index 699b3ca..f3bd7f1 100644 --- a/csrc/indent_test.mdc +++ b/csrc/indent_test.mdc @@ -4,27 +4,30 @@ simple assignments with expressions, and then prints out the same with complete bracketing and indenting. # File: indent_test.mk - myCFLAGS := -Wall -g -fplan9-extensions - CFLAGS := $(filter-out $(myCFLAGS),$(CFLAGS)) $(myCFLAGS) - myLDLIBS:= libparser.o libscanner.o libmdcode.o -licuuc - LDLIBS := $(filter-out $(myLDLIBS),$(LDLIBS)) $(myLDLIBS) + itestCFLAGS := -Wall -g -fplan9-extensions + itestLDLIBS:= libparser.o libscanner.o libmdcode.o -licuuc all :: itest - itest.c itest.h : indent_test.mdc parsergen libparser.o libscanner.o libmdcode.o + itest.c itest.h : indent_test.mdc parsergen ./parsergen -o itest --LALR --tag indent indent_test.mdc - indent_test.mk: indent_test.mdc md2c + indent_test.mk itest.code: indent_test.mdc md2c ./md2c indent_test.mdc - itest: itest.c + itest: itest.c | $(filter %.o,$(itestLDLIBS)) + $(CC) $(itestCFLAGS) $^ $(itestLDLIBS) -o $@ - demos:: itest itest.code + doitest: itest itest.code ./itest itest.code + checkitest: itest itest.code + @grep -v '^#' itest.out > .tmp.out + @./itest itest.code | diff -u .tmp.out - || echo itest FAILED + @sed -e 'i\ + ' itest.code > itest2.code + @./itest itest2.code| diff -u .tmp.out - || echo itest2 FAILED + demos :: doitest + tests :: checkitest # indent: header - ./parsergen -o itest --LALR indent_test.cgm - cc -o itest itest.c lib*.o -licuuc -lgmp - ./itest itest.code - struct expression { struct text op; struct expression *left, *right; @@ -107,8 +110,6 @@ with complete bracketing and indenting. char *file = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0); struct section *s = code_extract(file, file+len, NULL); struct token_config config = { - .ignored = (1 << TK_line_comment) - | (1 << TK_block_comment), .number_chars = ".,_+-", .word_start = "", .word_cont = "", @@ -123,18 +124,19 @@ with complete bracketing and indenting. exit(0); } - # indent: grammar ~~~~~~ -Program -> Statementlist ${ print_statement($1, 0); }$ +$TERM if { } : * + - / ; = -OptNL -> NEWLINE - | +Program -> Statementlist ${ print_statement($1, 0); }$ $*statement - Statementlist -> Statements ${ $0 = $<1; }$ + Newlines -> NEWLINE + | Newlines NEWLINE + Statementlist -> Statements ${ $0 = $ Statements Statement ${ { @@ -150,21 +152,23 @@ $*statement | ERROR ${ printf("statement ERROR\n"); $0 = NULL; }$ Open -> { - | NEWLINE { + | Newlines { Close -> } - | NEWLINE } - Block -> Open Statementlist Close ${ $0 = $<2; }$ - | Open SimpleStatements } ${ $0 = $<2; }$ - | : Statementlist ${ $0 = $2; $2 = NULL; }$ + | Newlines } + Block -> Open Statementlist Close ${ $0 = $ Statementlist $$OUT ${ $0 = $ SimpleStatements ; SimpleStatement ${ { struct statement **s; - $0 = $<1; + $0 = $next; - *s = $<3; + *s = $expr->op = $2.txt; $0->expr->right = $<3; }$ - Statement -> SimpleStatements NEWLINE ${ - $0 = $<1; - }$ - | IfStatement ${ $0 = $<1; }$ + SSline -> SimpleStatements NEWLINE ${ $0 = $<1; }$ + Statement -> SSline ${ $0 = $<1; }$ + | IfStatement $$NEWLINE ${ $0 = $<1; }$ | Statement NEWLINE ${ $0 = $<1; }$ - IfStatement -> if Expression Block OptNL ${ - $0 = calloc(1, sizeof(struct statement)); - $0->expr = $<2; - $0->thenpart = $<3; - }$ - | if Expression : SimpleStatements ${ - $0 = calloc(1, sizeof(struct statement)); - $0->expr = $<2; - $0->thenpart = $<4; - }$ - | if Expression Block OptNL else Block ${ - $0 = calloc(1, sizeof(struct statement)); - $0->expr = $<2; - $0->thenpart = $<3; - $0->elsepart = $<6; - }$ - | if Expression Block OptNL else : SimpleStatements ${ - $0 = calloc(1, sizeof(struct statement)); - $0->expr = $<2; - $0->thenpart = $<3; - $0->elsepart = $<7; - }$ - | if Expression Block OptNL else IfStatement ${ + $RIGHT else + + IfHead -> if Expression Block ${ $0 = calloc(1, sizeof(struct statement)); $0->expr = $<2; $0->thenpart = $<3; - $0->elsepart = $<6; }$ + | 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; + }$ $*expression Expression -> Expression + Term ${ @@ -225,7 +218,7 @@ $*expression $0->left = $<1; $0->right = $<3; }$ - | Term ${ $0 = $1; $1 = NULL; }$ + | Term ${ $0 = $<1; }$ Term -> Term * Factor ${ $0 = calloc(1, sizeof(struct expression)); $0->op = $2.txt; @@ -238,7 +231,7 @@ $*expression $0->left = $<1; $0->right = $<3; }$ - | Factor ${ $0 = $1; $1 = NULL; }$ + | Factor ${ $0 = $<1; }$ Factor -> IDENTIFIER ${ $0 = calloc(1, sizeof(struct expression)); $0->op = $1.txt; @@ -272,6 +265,7 @@ $*expression all = y; if true {yes=x;} else : no=x if true: yes = no; no = yes; + if false: yes=ok; else: no=ok if false { print = OK @@ -284,3 +278,40 @@ $*expression c= d x = y +# File: itest.out + (hello=yes); + (mister=no); + (there=x); + (all=y); + if (cond+cond2): + (hello=x); + (hello2=x); + (sum=(val+val)); + if condX: + (foo=((x*x)+(y/two))); + else: + if cond2: + (there1=x); + (there1a=x); + (there2=x); + (there3=x); + (all=y); + if true: + (yes=x); + else: + (no=x); + if true: + (yes=no); + (no=yes); + if false: + (yes=ok); + else: + (no=ok); + if false: + (print=OK); + else: + (print=not_OK); + if a: + if b: + (c=d); + (x=y);