]> ocean-lang.org Git - ocean/commitdiff
parsergen: allow $$OUT to be satisfied are start-of-line.
authorNeilBrown <neil@brown.name>
Sun, 23 Jun 2019 00:21:14 +0000 (10:21 +1000)
committerNeilBrown <neil@brown.name>
Sun, 23 Jun 2019 00:21:14 +0000 (10:21 +1000)
If a $$OUT (or $$NEWLINE) production is being reduced at
start-of-line (with no indents), then that is satisfactory,
we don't need NEWLINE etc as look-ahead.

This means that in cases where this is relevant, the computed
lookahead is wrong - we shouldn't have striped it.
I don't think this matters as it only affects conflict warnings,
and I think these will be reported at a higher level if relevant.
If essense, the $$OUT marking is like a precendence marking which
suppresses shift/reduce warnings as it say that decision is being made
on some basis other than look-ahead.

Signed-off-by: NeilBrown <neil@brown.name>
csrc/indent_test.mdc
csrc/parsergen.mdc

index 88e93914aa6f88a7b49638e230c3d99e372019eb..7e4f95627a57096a6c1982a960330916a9171145 100644 (file)
@@ -160,7 +160,7 @@ $*statement
                | NEWLINE Close
        Block -> Open Statementlist Close ${ $0 = $<2; }$
                | Open SimpleStatements } ${ $0 = $<2; }$
-               | : SimpleStatements $$NEWLINE ${ $0 = $<2; }$
+               | : SimpleStatements ${ $0 = $<2; }$
                | : StatementBlock ${ $0 = $<2; }$
        StatementBlock -> Statementlist $$OUT ${ $0 = $<1; }$
 
@@ -185,9 +185,9 @@ $*statement
                        $0->expr->right = $<3;
                        }$
        SSline -> SimpleStatements NEWLINE ${ $0 = $<1; }$
-               | SSline NEWLINE ${ $0 = $<1; }$
        Statement -> SSline ${ $0 = $<1; }$
-               | IfStatement ${ $0 = $<1; }$
+               | IfStatement $$NEWLINE ${ $0 = $<1; }$
+               | Statement NEWLINE ${ $0 = $<1; }$
 
        $RIGHT else
 
@@ -197,20 +197,16 @@ $*statement
                                $0->thenpart = $<3;
                                }$
                | IfHead NEWLINE ${ $0 = $<1; }$
-       IfTail -> else Block ${ $0 = $<2; }$
-               | IfTail NEWLINE ${ $0 = $<1; }$
 
        IfStatement -> IfHead $$else ${ $0 = $<1; }$
-               | IfHead IfTail ${
+               | IfHead else Block ${
                        $0 = $<1;
-                       $0->elsepart = $<2;
+                       $0->elsepart = $<3;
                        }$
                | IfHead else IfStatement ${
                        $0 = $<1;
                        $0->elsepart = $<3;
                        }$
-               | IfStatement NEWLINE ${ $0 = $<1; }$
-
 
 $*expression
        Expression -> Expression + Term ${
@@ -272,6 +268,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
@@ -309,6 +306,10 @@ $*expression
        if true:
            (yes=no);
            (no=yes);
+       if false:
+           (yes=ok);
+       else:
+           (no=ok);
        if false:
            (print=OK);
        else:
index 76fec3a70a779cefe4589a9d79e861a61acd726e..df73f513ceec725931af6c78832d234a0913e45a 100644 (file)
@@ -2871,9 +2871,13 @@ checks if a given token is in any of these look-ahead sets.
                force_reduce:
                        if (states[tos->state].reduce_prod >= 0 &&
                            states[tos->state].newline_only &&
-                           tk->num != TK_newline && tk->num != TK_eof && tk->num != TK_out) {
-                               /* Anything other than newline in an error as this
-                                * production must end at EOL
+                           !(tk->num == TK_newline ||
+                             tk->num == TK_eof ||
+                             tk->num == TK_out ||
+                             (tos->indents == 0 && tos->since_newline == 0))) {
+                               /* Anything other than newline or out or eof
+                                * in an error unless we are already at start
+                                * of line, as this production must end at EOL.
                                 */
                        } else if (states[tos->state].reduce_prod >= 0) {
                                void **body;