Changeset 3899

Show
Ignore:
Timestamp:
06/29/09 09:55:45 (5 months ago)
Author:
sukyoungryu
Message:

[parser] Implemented checking that 1) operator declarations not allowed in block expressions and 2) comprises clauses should not be empty. Added tests.

Location:
trunk/ProjectFortress
Files:
6 added
3 modified

Legend:

Unmodified
Added
Removed
  • trunk/ProjectFortress/src/com/sun/fortress/parser/NoNewlineHeader.rats

    r3822 r3899  
    8686       NodeUtil.validTraitTypes(writer, Useful.list(a1)); 
    8787     } 
    88    / comprises w void:opencurly w ComprisingTypeList w void:closecurly ; 
     88   / comprises w opencurly a1:(w ComprisingTypeList)? w closecurly 
     89     { if (a1 == null) { 
     90           Span span = createSpan(yyStart,yyCount); 
     91           log(span, "Comprises clauses should not be empty."); 
     92           yyValue = new Comprises(span, Collections.<BaseType>emptyList(), false); 
     93       } else yyValue = a1; 
     94     }; 
    8995 
    9096/* ComprisingTypeList ::= 
  • trunk/ProjectFortress/src/com/sun/fortress/parser/preparser/PreCompilation.rats

    r3845 r3899  
    7676   / object      { yyState.left(createSpan(yyStart,yyCount), "object"); } 
    7777   / trait       { yyState.left(createSpan(yyStart,yyCount), "trait"); } 
    78    / try         { yyState.left(createSpan(yyStart,yyCount), "try"); } 
     78   / try         { yyState.beginBlock(); 
     79                   yyState.left(createSpan(yyStart,yyCount), "try"); } 
    7980   / typecase    { yyState.left(createSpan(yyStart,yyCount), "typecase"); } 
    8081   / also        { yyState.left(createSpan(yyStart,yyCount), "also"); } 
     
    8889   / end s object // ignore the object keyword 
    8990                 { yyState.right(createSpan(yyStart,yyCount), "end"); } 
    90    / end         { yyState.right(createSpan(yyStart,yyCount), "end"); } 
     91   / end         { yyState.handleEnd(createSpan(yyStart,yyCount)); } 
    9192   / do          { yyState.handleDo(createSpan(yyStart,yyCount)); } 
    9293   / at          { yyState.handleAt(createSpan(yyStart,yyCount)); } 
     94   / opr         { yyState.handleOpr(createSpan(yyStart,yyCount)); } 
     95   / then        { yyState.beginBlock(); } 
     96   / fn          { yyState.handleFn(); } 
     97   / "=>"        { yyState.handleDoubleArrow(); } 
     98   / QualifiedName w "=>" w Id 
    9399   / Encloser    // ignore vertical bars 
    94100   / a1:LeftEncloser  { yyState.left(a1); } 
  • trunk/ProjectFortress/src/com/sun/fortress/parser/preparser/PreParserState.java

    r3676 r3899  
    5151    /** Nested component/API definitions are not allowed. */ 
    5252    private boolean sawCompilation = false; 
     53 
     54    /** Operator declarations are not allowed in block expressions. */ 
     55    private boolean inBlock = false; 
     56    private boolean sawFn = false; 
    5357 
    5458    /** Region annotation by "at" should be followed by "do". */ 
     
    125129                    "Unmatched delimiters \"" + open + "\" and \"" + close + "\"."); 
    126130            } 
     131            if ( open.getText().equals("(if") && close.getText().equals(")") ) 
     132                inBlock = false; 
    127133        } 
    128134    } 
     
    147153            } else { 
    148154                lefts.add(0, open); 
    149                 right(close); 
     155                handleEnd(span); 
    150156            } 
    151157        } 
     
    163169        Debug.debug( Debug.Type.PARSER, 1, "HandleAt"); 
    164170        sawAt = Option.<Span>some(span); 
     171    } 
     172 
     173    public void handleOpr(Span span) { 
     174        Debug.debug( Debug.Type.PARSER, 1, "HandleOpr"); 
     175        for ( IdOrOp left : lefts ) { 
     176            if ( left.getText().equals("object") ) return; 
     177            if ( left.getText().equals("do") || 
     178                 left.getText().startsWith("label$") || 
     179                 inBlock ) 
     180                log(span, "Operator declarations are not allowed in block expressions."); 
     181        } 
     182    } 
     183 
     184    public void beginBlock() { 
     185        inBlock = true; 
     186    } 
     187 
     188    public void handleFn() { 
     189        sawFn = true; 
     190    } 
     191 
     192    // "=>" does not introduce a block for import aliases and fn expressions. 
     193    public void handleDoubleArrow() { 
     194        if ( sawFn ) sawFn = false; 
     195        else if ( ! lefts.isEmpty() && ! lefts.get(0).getText().equals("{") ) 
     196            inBlock = true; 
     197    } 
     198 
     199    public void handleEnd(Span span) { 
     200        if ( ! lefts.isEmpty() && 
     201             ! lefts.get(0).getText().equals("object") ) 
     202            inBlock = false; 
     203        right(span, "end"); 
    165204    } 
    166205