Changeset 3111
- Timestamp:
- 11/26/08 13:22:06 (12 months ago)
- Location:
- trunk/ProjectFortress
- Files:
-
- 8 modified
-
astgen/Fortress.ast (modified) (2 diffs)
-
src/com/sun/fortress/compiler/typechecker/TypeChecker.java (modified) (3 diffs)
-
src/com/sun/fortress/interpreter/evaluator/Evaluator.java (modified) (4 diffs)
-
src/com/sun/fortress/interpreter/evaluator/LHSEvaluator.java (modified) (3 diffs)
-
src/com/sun/fortress/interpreter/evaluator/LHSToLValue.java (modified) (2 diffs)
-
src/com/sun/fortress/nodes_util/ExprFactory.java (modified) (1 diff)
-
src/com/sun/fortress/parser/DelimitedExpr.rats (modified) (2 diffs)
-
src/com/sun/fortress/tools/FortressAstToConcrete.java (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ProjectFortress/astgen/Fortress.ast
r3109 r3111 814 814 /** 815 815 * 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); 836 832 /** 837 833 * typecase expression … … 2041 2037 GeneratorClause(List<Id> bind, Expr init); 2042 2038 /** 2043 * varargs expression used in tuple expressions2044 * Expr...2045 * e.g.) [3 4 5]...2046 */2047 VarargsExpr(Expr varargs);2048 /**2049 2039 * keyword type used in tuple types 2050 2040 * Names must be unqualified. -
trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/TypeChecker.java
r3109 r3111 1025 1025 } 1026 1026 1027 /*1028 * FIXME: Figure out what type these should have and make them propogate ast1029 */1030 @Override1031 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 1047 1027 // This case is only called for single element arrays ( e.g., [5] ) 1048 1028 // and not for pieces of ArrayElements … … 4104 4084 @Override 4105 4085 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 { 4107 4104 List<Type> types = new ArrayList<Type>(exprs_result.size()); 4108 4105 for (TypeCheckerResult r : exprs_result) { … … 4123 4120 return TypeCheckerResult.compose(new_node, tuple_type, 4124 4121 subtypeChecker, exprs_result); 4122 } 4125 4123 } 4126 4124 -
trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/Evaluator.java
r3082 r3111 70 70 import com.sun.fortress.nodes.AbstractNode; 71 71 import com.sun.fortress.nodes.AmbiguousMultifixOpExpr; 72 import com.sun.fortress.nodes.ArgExpr;73 72 import com.sun.fortress.nodes.ArrayComprehension; 74 73 import com.sun.fortress.nodes.ArrayComprehensionClause; … … 161 160 public class Evaluator extends EvaluatorBase<FValue> { 162 161 boolean debug = false; 163 final private static boolean isArgExpr = false;164 162 165 163 public FValue eval(Expr e) { … … 261 259 // an Expr in this context. Yet it isn't an Expr, and 262 260 // 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 264 263 // or evalExprListParallel! This is extremely annoying! 265 264 List<FValue> lhsComps = new ArrayList<FValue>(lhsSize); … … 1605 1604 } 1606 1605 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 1616 1606 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 } 1619 1614 } 1620 1615 -
trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/LHSEvaluator.java
r3082 r3111 52 52 import com.sun.fortress.nodes.SubscriptExpr; 53 53 import com.sun.fortress.nodes.Enclosing; 54 import com.sun.fortress.nodes.ArgExpr;55 54 import com.sun.fortress.nodes.TupleExpr; 56 55 import com.sun.fortress.nodes.Type; … … 273 272 274 273 /* (non-Javadoc) 275 * @see com.sun.fortress.interpreter.nodes.NodeVisitor#for ArgExpr(com.sun.fortress.interpreter.nodes.ArgExpr)276 */ 277 @Override 278 public Voidoid for ArgExpr(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) { 279 278 if (!(value instanceof FTuple)) { 280 279 error(x, evaluator.e, errorMsg("RHS yields non-tuple ", value)); … … 289 288 return null; 290 289 } 291 292 /* (non-Javadoc)293 * @see com.sun.fortress.interpreter.nodes.NodeVisitor#forTupleExpr(com.sun.fortress.interpreter.nodes.TupleExpr)294 */295 @Override296 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 }309 290 } -
trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/LHSToLValue.java
r3082 r3111 32 32 import com.sun.fortress.nodes.LValue; 33 33 import com.sun.fortress.nodes.SubscriptExpr; 34 import com.sun.fortress.nodes.ArgExpr;35 34 import com.sun.fortress.nodes.TupleExpr; 36 35 import com.sun.fortress.nodes.VarRef; … … 125 124 126 125 /* (non-Javadoc) 127 * @see com.sun.fortress.interpreter.nodes.NodeVisitor#forArgExpr(com.sun.fortress.interpreter.nodes.ArgExpr)128 */129 @Override130 public Lhs forArgExpr(ArgExpr x) {131 return NI.nyi("nested tuple in LHS of binding");132 }133 134 /* (non-Javadoc)135 126 * @see com.sun.fortress.interpreter.nodes.NodeVisitor#forTupleExpr(com.sun.fortress.interpreter.nodes.TupleExpr) 136 127 */ -
trunk/ProjectFortress/src/com/sun/fortress/nodes_util/ExprFactory.java
r3101 r3111 762 762 e.getFinallyClause()); 763 763 } 764 public Expr forArgExpr(ArgExpr e) {765 return new ArgExpr(e.getSpan(), true, e.getExprs(), e.getVarargs());766 }767 764 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()); 769 766 } 770 767 public Expr forTypecase(Typecase e) { -
trunk/ProjectFortress/src/com/sun/fortress/parser/DelimitedExpr.rats
r3079 r3111 186 186 a3:KeywordExpr a4s:(w comma w KeywordExpr)* w closeparen 187 187 { 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()); 191 190 List<KeywordExpr> ks = new ArrayList<KeywordExpr>(); 192 191 ks.add(a3); … … 194 193 ks.add(b); 195 194 } 196 yyValue = new ArgExpr(createSpan(yyStart,yyCount), false, es, vs, ks);195 yyValue = new TupleExpr(createSpan(yyStart,yyCount), false, es, vs, ks); 197 196 } 198 197 / 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); 201 200 } 202 201 / TupleExpr ; -
trunk/ProjectFortress/src/com/sun/fortress/tools/FortressAstToConcrete.java
r3109 r3111 1284 1284 1285 1285 @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 1291 1290 StringBuilder s = new StringBuilder(); 1292 1291 1293 1292 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 } 1295 1308 s.append( ")" ); 1296 1309 1297 1310 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 } 1325 1325 } 1326 1326 … … 2914 2914 } 2915 2915 2916 @Override public String forVarargsExprOnly(VarargsExpr that,2917 String varargs_result) {2918 return varargs_result + "...";2919 }2920 2921 2916 @Override public String forKeywordTypeOnly(KeywordType that, 2922 2917 String name_result,

