Mercurial Hosting > luan
comparison src/luan/impl/LuanParser.java @ 1561:e1a13e707bf3
start immutable
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 05 Nov 2020 20:24:09 -0700 |
parents | 33a53c43e2f7 |
children | b89212fd04b5 |
comparison
equal
deleted
inserted
replaced
1560:33a53c43e2f7 | 1561:e1a13e707bf3 |
---|---|
15 | 15 |
16 final class LuanParser { | 16 final class LuanParser { |
17 | 17 |
18 private interface Sym { | 18 private interface Sym { |
19 public Expr exp(); | 19 public Expr exp(); |
20 public Stmts set(Expr val); | |
20 } | 21 } |
21 | 22 |
22 private int symCounter = 0; | 23 private int symCounter = 0; |
23 | 24 |
24 private class LocalSym implements Sym { | 25 private class LocalSym implements Sym { |
70 exp.add( new Object() { | 71 exp.add( new Object() { |
71 @Override public String toString() { | 72 @Override public String toString() { |
72 if( !isPointer ) | 73 if( !isPointer ) |
73 return javaName; | 74 return javaName; |
74 else | 75 else |
75 return javaName + ".o"; | 76 return javaName + ".get()"; |
76 } | 77 } |
77 } ); | 78 } ); |
78 return exp; | 79 return exp; |
80 } | |
81 | |
82 @Override public Stmts set(Expr val) { | |
83 Stmts stmt = new Stmts(); | |
84 stmt.add( new Object() { | |
85 @Override public String toString() { | |
86 if( !isPointer ) | |
87 return javaName + " = "; | |
88 else | |
89 return javaName + ".set("; | |
90 } | |
91 } ); | |
92 stmt.addAll( val.single() ); | |
93 stmt.add( new Object() { | |
94 @Override public String toString() { | |
95 if( !isPointer ) | |
96 return "; "; | |
97 else | |
98 return "); "; | |
99 } | |
100 } ); | |
101 return stmt; | |
79 } | 102 } |
80 } | 103 } |
81 | 104 |
82 private class UpSym implements Sym { | 105 private class UpSym implements Sym { |
83 final String name; | 106 final String name; |
87 UpSym(String name,int i,String value) { | 110 UpSym(String name,int i,String value) { |
88 this.name = name; | 111 this.name = name; |
89 this.i = i; | 112 this.i = i; |
90 this.value = value; | 113 this.value = value; |
91 } | 114 } |
92 /* | 115 |
93 String init() { | |
94 return "upValues[" + i + "] = " + value + "; "; | |
95 } | |
96 */ | |
97 @Override public Expr exp() { | 116 @Override public Expr exp() { |
98 Expr exp = new Expr(Val.SINGLE,false); | 117 Expr exp = new Expr(Val.SINGLE,false); |
99 exp.add( new Object() { | 118 exp.add( new Object() { |
100 @Override public String toString() { | 119 @Override public String toString() { |
101 return "upValues[" + i + "].o"; | 120 return "upValues[" + i + "].get()"; |
102 } | 121 } |
103 } ); | 122 } ); |
104 return exp; | 123 return exp; |
124 } | |
125 | |
126 @Override public Stmts set(Expr val) { | |
127 Stmts stmt = new Stmts(); | |
128 stmt.add( new Object() { | |
129 @Override public String toString() { | |
130 return "upValues[" + i + "].set("; | |
131 } | |
132 } ); | |
133 stmt.addAll( val.single() ); | |
134 stmt.add( "); " ); | |
135 return stmt; | |
105 } | 136 } |
106 } | 137 } |
107 | 138 |
108 private final class Frame { | 139 private final class Frame { |
109 final Frame parent; | 140 final Frame parent; |
1310 return true; | 1341 return true; |
1311 } | 1342 } |
1312 | 1343 |
1313 public Stmts set(Expr val) throws ParseException { | 1344 public Stmts set(Expr val) throws ParseException { |
1314 Sym sym = getSym(name); | 1345 Sym sym = getSym(name); |
1315 if( sym != null ) { | 1346 if( sym != null ) |
1316 Stmts stmt = new Stmts(); | 1347 return sym.set(val); |
1317 stmt.addAll( sym.exp() ); | 1348 Expr envExpr = env(); |
1318 stmt.add( " = " ); | |
1319 stmt.addAll( val.single() ); | |
1320 stmt.add( "; " ); | |
1321 return stmt; | |
1322 } | |
1323 Expr envExpr = env(); | |
1324 if( envExpr != null ) | 1349 if( envExpr != null ) |
1325 return indexVar( envExpr, constExpStr(name) ).set(val); | 1350 return indexVar( envExpr, constExpStr(name) ).set(val); |
1326 parser.failure(null); | 1351 parser.failure(null); |
1327 throw parser.exception("name '"+name+"' not defined"); | 1352 throw parser.exception("name '"+name+"' not defined"); |
1328 } | 1353 } |
2085 if( s.charAt(i) == '\n' ) | 2110 if( s.charAt(i) == '\n' ) |
2086 lines++; | 2111 lines++; |
2087 } | 2112 } |
2088 return lines; | 2113 return lines; |
2089 } | 2114 } |
2090 /* | 2115 |
2091 private Expr toFnExp(Stmts stmt,List<UpSym> upValueSymbols,String name) { | |
2092 stmt.addNewLines(); | |
2093 if( !stmt.hasReturn ) | |
2094 stmt.add( "return LuanFunction.NOTHING; " ); | |
2095 Expr exp = new Expr(Val.SINGLE,false); | |
2096 exp.add( "" | |
2097 +"new LuanClosure(luan(),"+upValueSymbols.size()+",javaOk,sourceName) { " | |
2098 +"{ " | |
2099 + init(upValueSymbols) | |
2100 +"} " | |
2101 +"@Override public Object doCall(Luan luan,Object[] args) throws LuanException { " | |
2102 ); | |
2103 if( name != null ) { | |
2104 exp.add( "" | |
2105 +"return _" + name + "(luan,args); " | |
2106 +"} " | |
2107 +"private Object _" + name + "(Luan luan,Object[] args) throws LuanException { " | |
2108 ); | |
2109 } | |
2110 exp.add( "" | |
2111 +"final Pointer[] parentUpValues = upValues; " | |
2112 +"Object t; " | |
2113 +"Object[] a; " | |
2114 ); | |
2115 exp.addAll( stmt ); | |
2116 exp.add( "" | |
2117 +"} " | |
2118 +"} " | |
2119 ); | |
2120 return exp; | |
2121 } | |
2122 | |
2123 private static String init(List<UpSym> upValueSymbols) { | |
2124 StringBuilder sb = new StringBuilder(); | |
2125 for( UpSym upSym : upValueSymbols ) { | |
2126 sb.append( upSym.init() ); | |
2127 } | |
2128 return sb.toString(); | |
2129 } | |
2130 */ | |
2131 private static String toUpValues(List<UpSym> upValueSymbols) { | 2116 private static String toUpValues(List<UpSym> upValueSymbols) { |
2132 StringBuilder sb = new StringBuilder(); | 2117 StringBuilder sb = new StringBuilder(); |
2133 sb.append( "new Pointer[]{ " ); | 2118 sb.append( "new Pointer[]{ " ); |
2134 for( UpSym upSym : upValueSymbols ) { | 2119 for( UpSym upSym : upValueSymbols ) { |
2135 sb.append( upSym.value + ", " ); | 2120 sb.append( upSym.value + ", " ); |