Mercurial Hosting > luan
comparison core/src/luan/impl/LuanParser.java @ 671:82f130eba7b0
improve declarations
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 12 Apr 2016 14:44:10 -0600 |
parents | 58ebfec6178b |
children | d3e5414bdf4c |
comparison
equal
deleted
inserted
replaced
670:58ebfec6178b | 671:82f130eba7b0 |
---|---|
20 private int symCounter = 0; | 20 private int symCounter = 0; |
21 | 21 |
22 private class LocalSym implements Sym { | 22 private class LocalSym implements Sym { |
23 final String name; | 23 final String name; |
24 final String javaName; | 24 final String javaName; |
25 String pointer = null; | 25 boolean isPointer = false; |
26 | 26 |
27 LocalSym(String name) { | 27 LocalSym(String name) { |
28 this.name = name; | 28 this.name = name; |
29 this.javaName = name + "_" + (++symCounter); | 29 this.javaName = name + "_" + (++symCounter); |
30 } | 30 } |
31 | 31 |
32 String declaration() { | 32 StmtString declaration(ExpString value) { |
33 if( pointer==null ) | 33 StmtString stmt = new StmtString(); |
34 return "Object " + javaName + " = null;\n"; | 34 if( value==null ) { |
35 else | 35 stmt.list.add( new Object() { |
36 return "final Pointer " + javaName + " = " + pointer + ";\n"; | 36 @Override public String toString() { |
37 } | 37 if( !isPointer ) |
38 | 38 return "Object " + javaName + ";\n"; |
39 String ref() { | 39 else |
40 if( pointer==null ) | 40 return "final Pointer " + javaName + " = new Pointer();\n"; |
41 return javaName; | 41 } |
42 else | 42 } ); |
43 return javaName + ".o"; | 43 } else { |
44 stmt.list.add( new Object() { | |
45 @Override public String toString() { | |
46 if( !isPointer ) | |
47 return "Object " + javaName + " = "; | |
48 else | |
49 return "final Pointer " + javaName + " = new Pointer("; | |
50 } | |
51 } ); | |
52 stmt.list.addAll(value.list); | |
53 stmt.list.add( new Object() { | |
54 @Override public String toString() { | |
55 if( !isPointer ) | |
56 return ";\n"; | |
57 else | |
58 return ");\n"; | |
59 } | |
60 } ); | |
61 } | |
62 return stmt; | |
44 } | 63 } |
45 | 64 |
46 @Override public ExpString exp() { | 65 @Override public ExpString exp() { |
47 ExpString exp = new ExpString(true,false); | 66 ExpString exp = new ExpString(true,false); |
48 exp.list.add( new Object() { | 67 exp.list.add( new Object() { |
49 @Override public String toString() { | 68 @Override public String toString() { |
50 return ref(); | 69 if( !isPointer ) |
70 return javaName; | |
71 else | |
72 return javaName + ".o"; | |
51 } | 73 } |
52 } ); | 74 } ); |
53 return exp; | 75 return exp; |
54 } | 76 } |
55 } | 77 } |
67 | 89 |
68 String init() { | 90 String init() { |
69 return "upValues[" + i + "] = " + value + ";\n"; | 91 return "upValues[" + i + "] = " + value + ";\n"; |
70 } | 92 } |
71 | 93 |
72 String ref() { | |
73 return "upValues[" + i + "].o"; | |
74 } | |
75 | |
76 @Override public ExpString exp() { | 94 @Override public ExpString exp() { |
77 ExpString exp = new ExpString(true,false); | 95 ExpString exp = new ExpString(true,false); |
78 exp.list.add( new Object() { | 96 exp.list.add( new Object() { |
79 @Override public String toString() { | 97 @Override public String toString() { |
80 return ref(); | 98 return "upValues[" + i + "].o"; |
81 } | 99 } |
82 } ); | 100 } ); |
83 return exp; | 101 return exp; |
84 } | 102 } |
85 } | 103 } |
127 return upSym; | 145 return upSym; |
128 } | 146 } |
129 for( Frame f=parent; f!=null; f=f.parent ) { | 147 for( Frame f=parent; f!=null; f=f.parent ) { |
130 LocalSym sym = f.getLocalSym(name); | 148 LocalSym sym = f.getLocalSym(name); |
131 if( sym != null ) { | 149 if( sym != null ) { |
132 sym.pointer = "new Pointer()"; | 150 sym.isPointer = true; |
133 return addUpSym(name,sym.javaName); | 151 return addUpSym(name,sym.javaName); |
134 } | 152 } |
135 } | 153 } |
136 return null; | 154 return null; |
137 } | 155 } |
176 | 194 |
177 void addVar(String name) { | 195 void addVar(String name) { |
178 UpSym upSym = frame.addUpSym( "-ADDED-" ,"new Pointer()"); | 196 UpSym upSym = frame.addUpSym( "-ADDED-" ,"new Pointer()"); |
179 if( name != null ) { | 197 if( name != null ) { |
180 LocalSym sym = frame.addLocalSym( name ); | 198 LocalSym sym = frame.addLocalSym( name ); |
181 sym.pointer = "upValues[" + upSym.i + "]"; | 199 sym.isPointer = true; |
182 top.list.add( sym.declaration() ); | 200 top.list.add( "final Pointer " + sym.javaName + " = upValues[" + upSym.i + "];\n" ); |
183 } | 201 } |
184 } | 202 } |
185 | 203 |
186 private int symbolsSize() { | 204 private int symbolsSize() { |
187 return frame.symbols.size(); | 205 return frame.symbols.size(); |
188 } | 206 } |
189 | 207 |
190 private void addSymbol(String name,StmtString stmt) { | 208 private StmtString addSymbol(String name,ExpString value) { |
191 final LocalSym sym = frame.addLocalSym(name); | 209 final LocalSym sym = frame.addLocalSym(name); |
192 stmt.list.add( new Object() { | 210 return sym.declaration(value); |
193 @Override public String toString() { | |
194 return sym.declaration(); | |
195 } | |
196 } ); | |
197 } | |
198 | |
199 private void addSymbols(List<String> names,StmtString stmt) { | |
200 for( String name : names ) { | |
201 addSymbol(name,stmt); | |
202 } | |
203 } | 211 } |
204 | 212 |
205 private Sym getSym(String name) { | 213 private Sym getSym(String name) { |
206 return frame.getSym(name); | 214 return frame.getSym(name); |
207 } | 215 } |
444 parser.begin(); | 452 parser.begin(); |
445 if( !(Keyword("local",In.NOTHING) && Keyword("function",In.NOTHING)) ) | 453 if( !(Keyword("local",In.NOTHING) && Keyword("function",In.NOTHING)) ) |
446 return parser.failure(null); | 454 return parser.failure(null); |
447 StmtString stmt = new StmtString(); | 455 StmtString stmt = new StmtString(); |
448 String name = RequiredName(In.NOTHING); | 456 String name = RequiredName(In.NOTHING); |
449 addSymbol( name, stmt ); | 457 stmt.list.addAll( addSymbol(name,null).list ); |
450 ExpString fnDef = RequiredFunction(In.NOTHING); | 458 ExpString fnDef = RequiredFunction(In.NOTHING); |
451 stmt.list.addAll( nameVar(name).set( fnDef ).list ); | 459 stmt.list.addAll( nameVar(name).set(fnDef).list ); |
452 /* | 460 /* |
453 Settable s = new SetLocalVar(symbolsSize()-1); | 461 Settable s = new SetLocalVar(symbolsSize()-1); |
454 StmtString stmt = new StmtString(); | 462 StmtString stmt = new StmtString(); |
455 stmt.list.add( settableToString(s) ); | 463 stmt.list.add( settableToString(s) ); |
456 stmt.list.add( ".set(luan," ); | 464 stmt.list.add( ".set(luan," ); |
492 +"LuanFunction "+fnVar+" = Luan.checkFunction(" | 500 +"LuanFunction "+fnVar+" = Luan.checkFunction(" |
493 ); | 501 ); |
494 stmt.list.addAll( expr.list ); | 502 stmt.list.addAll( expr.list ); |
495 stmt.list.add( ");\n" ); | 503 stmt.list.add( ");\n" ); |
496 stmt.list.add( "while(true) {\n" ); | 504 stmt.list.add( "while(true) {\n" ); |
497 List<Var> vars = new ArrayList<Var>(); | 505 stmt.list.addAll( makeLocalSetStmt(names,fnExp).list ); |
498 for( String name : names ) { | |
499 addSymbol(name, stmt); | |
500 vars.add(nameVar(name)); | |
501 } | |
502 ExpString firstVar = vars.get(0).exp(); | |
503 stmt.list.addAll( makeSetStmt(vars,fnExp).list ); | |
504 stmt.list.add( "if( " ); | 506 stmt.list.add( "if( " ); |
505 stmt.list.addAll( firstVar.list ); | 507 stmt.list.addAll( nameVar(names.get(0)).exp().list ); |
506 stmt.list.add( "==null ) break;\n" ); | 508 stmt.list.add( "==null ) break;\n" ); |
507 StmtString loop = RequiredLoopBlock(); | 509 StmtString loop = RequiredLoopBlock(); |
508 RequiredKeyword("end",In.NOTHING); | 510 RequiredKeyword("end",In.NOTHING); |
509 stmt.list.addAll( loop.list ); | 511 stmt.list.addAll( loop.list ); |
510 stmt.list.add( "}\n" ); | 512 stmt.list.add( "}\n" ); |
530 if( Keyword("function",In.NOTHING) ) | 532 if( Keyword("function",In.NOTHING) ) |
531 return parser.failure(null); // handled later | 533 return parser.failure(null); // handled later |
532 throw parser.exception("Invalid local statement"); | 534 throw parser.exception("Invalid local statement"); |
533 } | 535 } |
534 StmtString stmt = new StmtString(); | 536 StmtString stmt = new StmtString(); |
535 addSymbols(names,stmt); | |
536 if( parser.match( '=' ) ) { | 537 if( parser.match( '=' ) ) { |
537 Spaces(In.NOTHING); | 538 Spaces(In.NOTHING); |
538 ExpString values = ExpStringList(In.NOTHING); | 539 ExpString values = ExpStringList(In.NOTHING); |
539 if( values==null ) | 540 if( values==null ) |
540 throw parser.exception("Expressions expected"); | 541 throw parser.exception("Expressions expected"); |
541 List<Var> vars = new ArrayList<Var>(); | 542 stmt.list.addAll( makeLocalSetStmt(names,values).list ); |
543 } else { | |
544 ExpString value = new ExpString(true,false); | |
545 value.list.add( "null" ); | |
542 for( String name : names ) { | 546 for( String name : names ) { |
543 vars.add(nameVar(name)); | 547 stmt.list.addAll( addSymbol(name,value).list ); |
544 } | 548 } |
545 stmt.list.addAll( makeSetStmt(vars,values).list ); | |
546 } | 549 } |
547 return parser.success(stmt); | 550 return parser.success(stmt); |
548 } | 551 } |
549 | 552 |
550 private List<String> RequiredNameList(In in) throws ParseException { | 553 private List<String> RequiredNameList(In in) throws ParseException { |
691 t.list.add( "LuanImpl.pick(t,"+i+")" ); | 694 t.list.add( "LuanImpl.pick(t,"+i+")" ); |
692 stmt.list.addAll( vars.get(i).set(t).list ); | 695 stmt.list.addAll( vars.get(i).set(t).list ); |
693 } | 696 } |
694 return stmt; | 697 return stmt; |
695 } | 698 } |
696 /* | 699 |
697 private static String varsToString(Settable[] vars) { | 700 private StmtString makeLocalSetStmt(List<String> names,ExpString values) throws ParseException { |
698 StringBuilder sb = new StringBuilder(); | 701 int n = names.size(); |
699 sb.append( "new Settable[]{" ); | 702 if( n == 1 ) |
700 for( Settable v : vars ) { | 703 return addSymbol(names.get(0),values.expr()); |
701 sb.append( settableToString(v) ).append( ',' ); | 704 StmtString stmt = new StmtString(); |
702 } | 705 stmt.list.add( "t = " ); |
703 sb.append( "}" ); | 706 stmt.list.addAll( values.list ); |
704 return sb.toString(); | 707 stmt.list.add( ";\n" ); |
705 } | 708 ExpString t = new ExpString(values.isExpr,false); |
706 */ | 709 t.list.add( "t" ); |
710 stmt.list.addAll( addSymbol(names.get(0),t.expr()).list ); | |
711 for( int i=1; i<n; i++ ) { | |
712 t.list.clear(); | |
713 t.list.add( "LuanImpl.pick(t,"+i+")" ); | |
714 stmt.list.addAll( addSymbol(names.get(i),t).list ); | |
715 } | |
716 return stmt; | |
717 } | |
718 | |
707 private StmtString ExpressionsStmt() throws ParseException { | 719 private StmtString ExpressionsStmt() throws ParseException { |
708 parser.begin(); | 720 parser.begin(); |
709 ExpString exp = ExprZ(In.NOTHING); | 721 ExpString exp = ExprZ(In.NOTHING); |
710 if( exp != null && exp.isStmt ) { | 722 if( exp != null && exp.isStmt ) { |
711 StmtString stmt = new StmtString(); | 723 StmtString stmt = new StmtString(); |
1045 Spaces(inParens); | 1057 Spaces(inParens); |
1046 frame = new Frame(frame); | 1058 frame = new Frame(frame); |
1047 StmtString stmt = new StmtString(); | 1059 StmtString stmt = new StmtString(); |
1048 List<String> names = NameList(in); | 1060 List<String> names = NameList(in); |
1049 if( names != null ) { | 1061 if( names != null ) { |
1050 addSymbols(names,stmt); | |
1051 List<Var> vars = new ArrayList<Var>(); | |
1052 for( String name : names ) { | |
1053 vars.add(nameVar(name)); | |
1054 } | |
1055 ExpString args = new ExpString(false,false); | 1062 ExpString args = new ExpString(false,false); |
1056 args.list.add( "args" ); | 1063 args.list.add( "args" ); |
1057 stmt.list.addAll( makeSetStmt(vars,args).list ); | 1064 stmt.list.addAll( makeLocalSetStmt(names,args).list ); |
1058 if( parser.match(',') ) { | 1065 if( parser.match(',') ) { |
1059 Spaces(inParens); | 1066 Spaces(inParens); |
1060 if( !parser.match("...") ) | 1067 if( !parser.match("...") ) |
1061 throw parser.exception(); | 1068 throw parser.exception(); |
1062 Spaces(inParens); | 1069 Spaces(inParens); |
1063 frame.isVarArg = true; | 1070 frame.isVarArg = true; |
1064 stmt.list.add( "final Object[] varArgs = LuanImpl.varArgs(args," + vars.size() + ");\n" ); | 1071 stmt.list.add( "final Object[] varArgs = LuanImpl.varArgs(args," + names.size() + ");\n" ); |
1065 } | 1072 } |
1066 } else if( parser.match("...") ) { | 1073 } else if( parser.match("...") ) { |
1067 Spaces(inParens); | 1074 Spaces(inParens); |
1068 frame.isVarArg = true; | 1075 frame.isVarArg = true; |
1069 stmt.list.add( "final Object[] varArgs = LuanImpl.varArgs(args,0);\n" ); | 1076 stmt.list.add( "final Object[] varArgs = LuanImpl.varArgs(args,0);\n" ); |
1861 +" " + code | 1868 +" " + code |
1862 +" }\n" | 1869 +" }\n" |
1863 +"}\n" | 1870 +"}\n" |
1864 ; | 1871 ; |
1865 try { | 1872 try { |
1866 System.out.println(parser.sourceName); | 1873 //System.out.println(parser.sourceName); |
1867 System.out.println(classCode); | 1874 //System.out.println(classCode); |
1868 return LuanJavaCompiler.compile("luan.impl."+className,parser.sourceName,classCode); | 1875 return LuanJavaCompiler.compile("luan.impl."+className,parser.sourceName,classCode); |
1869 } catch(ClassNotFoundException e) { | 1876 } catch(ClassNotFoundException e) { |
1870 throw new RuntimeException(e); | 1877 throw new RuntimeException(e); |
1871 } | 1878 } |
1872 } | 1879 } |