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 + ", " );