Changeset 3111

Show
Ignore:
Timestamp:
11/26/08 13:22:06 (12 months ago)
Author:
sukyoungryu
Message:

[ast refactoring] Merged AbstractTupleExpr?, TupleExpr?, ArgExpr?, and VarargsExpr? to TupleExpr?.

Location:
trunk/ProjectFortress
Files:
8 modified

Legend:

Unmodified
Added
Removed
  • trunk/ProjectFortress/astgen/Fortress.ast

    r3109 r3111  
    814814                /** 
    815815                 * labeled expression: tuple expression or argument expression 
    816                  */ 
    817                 abstract AbstractTupleExpr(List<Expr> exprs); 
    818                     /** 
    819                      * tuple expression 
    820                      * TupleExpr ::= ( (Expr,)+ Expr ) 
    821                      * e.g.) (1, 2, 5) 
    822                      */ 
    823                     TupleExpr(); 
    824                     /** 
    825                      * argument expression 
    826                      * ArgExpr ::= ( (Expr,)* (Expr...,)? KeywordExpr(, KeywordExpr)* ) 
    827                      *           | ( (Expr,)* Expr... ) 
    828                      *           | TupleExpr 
    829                      * e.g.) (1, 2, [3 4]..., x = 5) 
    830                      */ 
    831                     ArgExpr(Option<VarargsExpr> varargs 
    832                                 = Option.<VarargsExpr>none(), 
    833                             List<KeywordExpr> keywords 
    834                                 = Collections.<KeywordExpr>emptyList(), 
    835                             boolean inApp = false); 
     816                 * 
     817                 * tuple expression 
     818                 * TupleExpr ::= ( (Expr,)+ Expr ) 
     819                 * 
     820                 * argument expression 
     821                 * ArgExpr ::= ( (Expr,)* (Expr...,)? KeywordExpr(, KeywordExpr)* ) 
     822                 *           | ( (Expr,)* Expr... ) 
     823                 *           | TupleExpr 
     824                 * e.g.) (1, 2, [3 4]..., x = 5) 
     825                 * e.g.) (1, 2, 5) 
     826                 */ 
     827                TupleExpr(List<Expr> exprs, 
     828                          Option<Expr> varargs = Option.<Expr>none(), 
     829                          List<KeywordExpr> keywords 
     830                              = Collections.<KeywordExpr>emptyList(), 
     831                          boolean inApp = false); 
    836832                /** 
    837833                 * typecase expression 
     
    20412037            GeneratorClause(List<Id> bind, Expr init); 
    20422038            /** 
    2043              * varargs expression used in tuple expressions 
    2044              * Expr... 
    2045              * e.g.) [3 4 5]... 
    2046              */ 
    2047             VarargsExpr(Expr varargs); 
    2048             /** 
    20492039             * keyword type used in tuple types 
    20502040             * Names must be unqualified. 
  • trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/TypeChecker.java

    r3109 r3111  
    10251025        } 
    10261026 
    1027         /* 
    1028          * FIXME: Figure out what type these should have and make them propogate ast 
    1029          */ 
    1030         @Override 
    1031         public TypeCheckerResult forArgExprOnly(ArgExpr that, Option<TypeCheckerResult> exprType_result, 
    1032                         List<TypeCheckerResult> exprs_result, 
    1033                         Option<TypeCheckerResult> varargs_result, 
    1034                         List<TypeCheckerResult> keywords_result) { 
    1035                 if (varargs_result.isSome()) { 
    1036                         return TypeCheckerResult.compose(that, 
    1037                                         subtypeChecker, 
    1038                                         TypeCheckerResult.compose(that, subtypeChecker, exprs_result), 
    1039                                         TypeCheckerResult.compose(that, subtypeChecker, varargs_result.unwrap()), TypeCheckerResult.compose(that, subtypeChecker, keywords_result)); 
    1040                 } else { 
    1041                         return TypeCheckerResult.compose(that, 
    1042                                         subtypeChecker, 
    1043                                         TypeCheckerResult.compose(that, subtypeChecker, exprs_result), TypeCheckerResult.compose(that, subtypeChecker, keywords_result)); 
    1044                 } 
    1045         } 
    1046  
    10471027        // This case is only called for single element arrays ( e.g., [5] ) 
    10481028        // and not for pieces of ArrayElements 
     
    41044084        @Override 
    41054085        public TypeCheckerResult forTupleExprOnly(TupleExpr that, Option<TypeCheckerResult> exprType_result, 
    4106                         List<TypeCheckerResult> exprs_result) { 
     4086                                                  List<TypeCheckerResult> exprs_result, 
     4087                                                  Option<TypeCheckerResult> varargs_result, 
     4088                                                  List<TypeCheckerResult> keywords_result) { 
     4089            if ( varargs_result.isSome() || keywords_result.size() > 0 ) { // ArgExpr 
     4090                /* 
     4091                 * FIXME: Figure out what type these should have and make them propogate ast 
     4092                 */ 
     4093                if (varargs_result.isSome()) { 
     4094                        return TypeCheckerResult.compose(that, 
     4095                                        subtypeChecker, 
     4096                                        TypeCheckerResult.compose(that, subtypeChecker, exprs_result), 
     4097                                        TypeCheckerResult.compose(that, subtypeChecker, varargs_result.unwrap()), TypeCheckerResult.compose(that, subtypeChecker, keywords_result)); 
     4098                } else { 
     4099                        return TypeCheckerResult.compose(that, 
     4100                                        subtypeChecker, 
     4101                                        TypeCheckerResult.compose(that, subtypeChecker, exprs_result), TypeCheckerResult.compose(that, subtypeChecker, keywords_result)); 
     4102                } 
     4103            } else { 
    41074104                List<Type> types = new ArrayList<Type>(exprs_result.size()); 
    41084105                for (TypeCheckerResult r : exprs_result) { 
     
    41234120                return TypeCheckerResult.compose(new_node, tuple_type, 
    41244121                                subtypeChecker, exprs_result); 
     4122            } 
    41254123        } 
    41264124 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/Evaluator.java

    r3082 r3111  
    7070import com.sun.fortress.nodes.AbstractNode; 
    7171import com.sun.fortress.nodes.AmbiguousMultifixOpExpr; 
    72 import com.sun.fortress.nodes.ArgExpr; 
    7372import com.sun.fortress.nodes.ArrayComprehension; 
    7473import com.sun.fortress.nodes.ArrayComprehensionClause; 
     
    161160public class Evaluator extends EvaluatorBase<FValue> { 
    162161     boolean debug = false; 
    163     final private static boolean isArgExpr = false; 
    164162 
    165163    public FValue eval(Expr e) { 
     
    261259                // an Expr in this context.  Yet it isn't an Expr, and 
    262260                // we can't pass the lhses to the numerous functions 
    263                 // which expect a List<Expr>---for example ArgExpr 
     261                // which expect a List<Expr>---for example, 
     262                // TupleExpr with a varargs or keywords 
    264263                // or evalExprListParallel!  This is extremely annoying! 
    265264                List<FValue> lhsComps = new ArrayList<FValue>(lhsSize); 
     
    16051604    } 
    16061605 
    1607     public FValue forArgExpr(ArgExpr x) { 
    1608         List<Expr> exprs = x.getExprs(); 
    1609         /* 
    1610         if (!isArgExpr) 
    1611             error(x, "Tuples are not allowed to have varargs or keyword expressions."); 
    1612         */ 
    1613         return FTuple.make(evalExprListParallel(exprs)); 
    1614     } 
    1615  
    16161606    public FValue forTupleExpr(TupleExpr x) { 
    1617         List<Expr> exprs = x.getExprs(); 
    1618         return FTuple.make(evalExprListParallel(exprs)); 
     1607        if ( x.getVarargs().isSome() || x.getKeywords().size() > 0 ) { // ArgExpr 
     1608            List<Expr> exprs = x.getExprs(); 
     1609            return FTuple.make(evalExprListParallel(exprs)); 
     1610        } else { 
     1611            List<Expr> exprs = x.getExprs(); 
     1612            return FTuple.make(evalExprListParallel(exprs)); 
     1613        } 
    16191614    } 
    16201615 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/LHSEvaluator.java

    r3082 r3111  
    5252import com.sun.fortress.nodes.SubscriptExpr; 
    5353import com.sun.fortress.nodes.Enclosing; 
    54 import com.sun.fortress.nodes.ArgExpr; 
    5554import com.sun.fortress.nodes.TupleExpr; 
    5655import com.sun.fortress.nodes.Type; 
     
    273272 
    274273    /* (non-Javadoc) 
    275      * @see com.sun.fortress.interpreter.nodes.NodeVisitor#forArgExpr(com.sun.fortress.interpreter.nodes.ArgExpr) 
    276      */ 
    277     @Override 
    278     public Voidoid forArgExpr(ArgExpr x) { 
     274     * @see com.sun.fortress.interpreter.nodes.NodeVisitor#forTupleExpr(com.sun.fortress.interpreter.nodes.TupleExpr) 
     275     */ 
     276    @Override 
     277    public Voidoid forTupleExpr(TupleExpr x) { 
    279278        if (!(value instanceof FTuple)) { 
    280279            error(x, evaluator.e, errorMsg("RHS yields non-tuple ", value)); 
     
    289288        return null; 
    290289    } 
    291  
    292     /* (non-Javadoc) 
    293      * @see com.sun.fortress.interpreter.nodes.NodeVisitor#forTupleExpr(com.sun.fortress.interpreter.nodes.TupleExpr) 
    294      */ 
    295     @Override 
    296     public Voidoid forTupleExpr(TupleExpr x) { 
    297         if (!(value instanceof FTuple)) { 
    298             error(x, evaluator.e, errorMsg("RHS yields non-tuple ", value)); 
    299         } 
    300         FTuple t = (FTuple)value; 
    301         Iterator<FValue> rhsIterator = t.getVals().iterator(); 
    302         for (Expr lhs : x.getExprs()) { 
    303             // TODO: arity matching and exotic tuple types. 
    304             lhs.accept(new LHSEvaluator(evaluator, rhsIterator.next())); 
    305         } 
    306  
    307         return null; 
    308     } 
    309290} 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/LHSToLValue.java

    r3082 r3111  
    3232import com.sun.fortress.nodes.LValue; 
    3333import com.sun.fortress.nodes.SubscriptExpr; 
    34 import com.sun.fortress.nodes.ArgExpr; 
    3534import com.sun.fortress.nodes.TupleExpr; 
    3635import com.sun.fortress.nodes.VarRef; 
     
    125124 
    126125    /* (non-Javadoc) 
    127      * @see com.sun.fortress.interpreter.nodes.NodeVisitor#forArgExpr(com.sun.fortress.interpreter.nodes.ArgExpr) 
    128      */ 
    129     @Override 
    130     public Lhs forArgExpr(ArgExpr x) { 
    131         return NI.nyi("nested tuple in LHS of binding"); 
    132     } 
    133  
    134     /* (non-Javadoc) 
    135126     * @see com.sun.fortress.interpreter.nodes.NodeVisitor#forTupleExpr(com.sun.fortress.interpreter.nodes.TupleExpr) 
    136127     */ 
  • trunk/ProjectFortress/src/com/sun/fortress/nodes_util/ExprFactory.java

    r3101 r3111  
    762762                    e.getFinallyClause()); 
    763763        } 
    764         public Expr forArgExpr(ArgExpr e) { 
    765             return new ArgExpr(e.getSpan(), true, e.getExprs(), e.getVarargs()); 
    766         } 
    767764        public Expr forTupleExpr(TupleExpr e) { 
    768             return new TupleExpr(e.getSpan(), true, e.getExprs()); 
     765            return new TupleExpr(e.getSpan(), true, e.getExprs(), e.getVarargs(), e.getKeywords()); 
    769766        } 
    770767        public Expr forTypecase(Typecase e) { 
  • trunk/ProjectFortress/src/com/sun/fortress/parser/DelimitedExpr.rats

    r3079 r3111  
    186186     a3:KeywordExpr a4s:(w comma w KeywordExpr)* w closeparen 
    187187     { List<Expr> es = a1s.list(); 
    188        Option<VarargsExpr> vs = ((a2 != null) ? 
    189                               Option.some(new VarargsExpr(a2.getSpan(), a2)) : 
    190                               Option.<VarargsExpr>none()); 
     188       Option<Expr> vs = ((a2 != null) ? Option.some(a2) 
     189                                       : Option.<Expr>none()); 
    191190       List<KeywordExpr> ks = new ArrayList<KeywordExpr>(); 
    192191       ks.add(a3); 
     
    194193           ks.add(b); 
    195194       } 
    196        yyValue = new ArgExpr(createSpan(yyStart,yyCount), false, es, vs, ks); 
     195       yyValue = new TupleExpr(createSpan(yyStart,yyCount), false, es, vs, ks); 
    197196     } 
    198197   / openparen w a1s:(Expr w comma w)* a2:Expr w ellipses w closeparen 
    199      { Option<VarargsExpr> vs = Option.some(new VarargsExpr(a2.getSpan(), a2)); 
    200        yyValue = new ArgExpr(createSpan(yyStart,yyCount),false,a1s.list(),vs); 
     198     { Option<Expr> vs = Option.some(a2); 
     199       yyValue = new TupleExpr(createSpan(yyStart,yyCount),false,a1s.list(),vs); 
    201200     } 
    202201   / TupleExpr ; 
  • trunk/ProjectFortress/src/com/sun/fortress/tools/FortressAstToConcrete.java

    r3109 r3111  
    12841284 
    12851285    @Override public String forTupleExprOnly(TupleExpr that, Option<String> exprType_result, 
    1286                                              List<String> exprs_result) { 
    1287         if ( exprs_result.size() == 1 ) 
    1288             return handleParen( exprs_result.get(0), 
    1289                                 that.isParenthesized() ); 
    1290         else { 
     1286                                             List<String> exprs_result, 
     1287                                             Option<String> varargs_result, 
     1288                                             List<String> keywords_result) { 
     1289        if ( varargs_result.isSome() || keywords_result.size() > 0 ) { // ArgExpr 
    12911290            StringBuilder s = new StringBuilder(); 
    12921291 
    12931292            s.append( "(" ); 
    1294             s.append( join(exprs_result, ", ") ); 
     1293            int exprs_size = exprs_result.size(); 
     1294            int varargs_size = (varargs_result.isSome()) ? 1 : 0; 
     1295            int keywords_size = keywords_result.size(); 
     1296            s.append( join(exprs_result, ", " ) ); 
     1297            if ( varargs_size == 1 ) { 
     1298                if ( exprs_size > 0 ) 
     1299                    s.append( ", " ); 
     1300                s.append( varargs_result.unwrap() ); 
     1301                s.append( "..." ); 
     1302            } 
     1303            if ( keywords_size > 0 ) { 
     1304                if ( exprs_size + varargs_size > 0) 
     1305                    s.append( ", " ); 
     1306                s.append( join(keywords_result, ", ") ); 
     1307            } 
    12951308            s.append( ")" ); 
    12961309 
    12971310            return s.toString(); 
    1298         } 
    1299     } 
    1300  
    1301     @Override public String forArgExprOnly(ArgExpr that, Option<String> exprType_result, 
    1302                                            List<String> exprs_result, 
    1303                                            Option<String> varargs_result, 
    1304                                            List<String> keywords_result) { 
    1305         StringBuilder s = new StringBuilder(); 
    1306  
    1307         s.append( "(" ); 
    1308         int exprs_size = exprs_result.size(); 
    1309         int varargs_size = (varargs_result.isSome()) ? 1 : 0; 
    1310         int keywords_size = keywords_result.size(); 
    1311         s.append( join(exprs_result, ", " ) ); 
    1312         if ( varargs_size == 1 ) { 
    1313             if ( exprs_size > 0 ) 
    1314                 s.append( ", " ); 
    1315             s.append( varargs_result.unwrap() ); 
    1316         } 
    1317         if ( keywords_size > 0 ) { 
    1318             if ( exprs_size + varargs_size > 0) 
    1319                 s.append( ", " ); 
    1320             s.append( join(keywords_result, ", ") ); 
    1321         } 
    1322         s.append( ")" ); 
    1323  
    1324         return s.toString(); 
     1311        } else { 
     1312            if ( exprs_result.size() == 1 ) 
     1313                return handleParen( exprs_result.get(0), 
     1314                                    that.isParenthesized() ); 
     1315            else { 
     1316                StringBuilder s = new StringBuilder(); 
     1317 
     1318                s.append( "(" ); 
     1319                s.append( join(exprs_result, ", ") ); 
     1320                s.append( ")" ); 
     1321 
     1322                return s.toString(); 
     1323            } 
     1324        } 
    13251325    } 
    13261326 
     
    29142914    } 
    29152915 
    2916     @Override public String forVarargsExprOnly(VarargsExpr that, 
    2917                                                String varargs_result) { 
    2918         return varargs_result + "..."; 
    2919     } 
    2920  
    29212916    @Override public String forKeywordTypeOnly(KeywordType that, 
    29222917                                               String name_result,