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 }