annotate core/src/luan/impl/ThemeParser.java @ 670:58ebfec6178b

all luan now compiles
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 12 Apr 2016 01:05:57 -0600
parents 08966099aa6d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1 package luan.impl;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3 import java.util.Map;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
4 import java.util.HashMap;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
5 import java.util.List;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
6 import java.util.ArrayList;
635
c83b8cefd922 better error handling in theme code
Franklin Schmidt <fschmidt@gmail.com>
parents: 634
diff changeset
7 import luan.Luan;
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
8 import luan.LuanTable;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
9 import luan.LuanState;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10 import luan.LuanFunction;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
11 import luan.LuanException;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
12 import luan.modules.PackageLuan;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
13
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
14
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
15 public final class ThemeParser {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
16
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
17 public static LuanFunction compile(LuanState luan,String sourceName,String sourceText) throws LuanException {
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
18 /*
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
19 try {
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
20 FnDef fnDef = new ThemeParser(sourceName,sourceText).parse();
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
21 final LuanStateImpl luanImpl = (LuanStateImpl)luan;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
22 return new Closure(luanImpl,fnDef);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 } catch(ParseException e) {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24 //e.printStackTrace();
646
cdc70de628b5 simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents: 645
diff changeset
25 throw new LuanException( e.getFancyMessage() );
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26 }
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
27 */
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
28 return null;
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29 }
670
58ebfec6178b all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents: 667
diff changeset
30 /*
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
31 private static final class Frame {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
32 final Frame parent;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
33 final List<String> symbols = new ArrayList<String>();
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
34 int stackSize = 0;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
35 final boolean isVarArg;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
36 final List<String> upValueSymbols = new ArrayList<String>();
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
37 final List<UpValue.Getter> upValueGetters = new ArrayList<UpValue.Getter>();
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
38
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
39 Frame() {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
40 this.parent = null;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
41 isVarArg = true;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
42 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
43
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
44 Frame(Frame parent) {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
45 this.parent = parent;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
46 isVarArg = false;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
47 if( upValueIndex(MOD) != 0 )
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
48 throw new RuntimeException();
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
49 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
50
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
51 int stackIndex(String name) {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
52 int i = symbols.size();
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
53 while( --i >= 0 ) {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
54 if( symbols.get(i).equals(name) )
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
55 return i;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
56 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
57 return -1;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
58 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
59
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
60 int upValueIndex(String name) {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
61 int i = upValueSymbols.size();
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
62 while( --i >= 0 ) {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
63 if( upValueSymbols.get(i).equals(name) )
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
64 return i;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
65 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
66 if( parent==null )
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
67 return -1;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
68 i = parent.stackIndex(name);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
69 if( i != -1 ) {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
70 upValueGetters.add(new UpValue.StackGetter(i));
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
71 } else {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
72 i = parent.upValueIndex(name);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
73 if( i == -1 )
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
74 return -1;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
75 upValueGetters.add(new UpValue.NestedGetter(i));
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
76 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
77 upValueSymbols.add(name);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
78 return upValueSymbols.size() - 1;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
79 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
80
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
81 void addUpValueGetter(String name,UpValue.Getter upValueGetter) {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
82 upValueSymbols.add(name);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
83 upValueGetters.add(upValueGetter);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
84 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
85 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
86
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
87 private static final String IO = "-IO-";
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
88 private static final String MOD = "-MOD-";
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
89 private static final String ENV = "-ENV-";
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
90 private static final String INDENT = "-INDENT-";
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
91 private static final UpValue.Getter[] NO_UP_VALUE_GETTERS = new UpValue.Getter[0];
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
92
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
93 // private final LuanSource source;
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
94 private final Parser parser;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
95 private Frame frame = new Frame();
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
96
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
97 private ThemeParser(String sourceName,String sourceText) {
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
98 // this.source = source;
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
99 this.parser = new Parser(sourceName,sourceText);
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
100 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
101
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
102 private int symbolsSize() {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
103 return frame.symbols.size();
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
104 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
105
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
106 private void addSymbol(String name) {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
107 frame.symbols.add(name);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
108 if( frame.stackSize < symbolsSize() )
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
109 frame.stackSize = symbolsSize();
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
110 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
111
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
112 private Class newFnDef(Stmt stmt) {
670
58ebfec6178b all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents: 667
diff changeset
113 // return new FnDef( stmt, frame.stackSize, symbolsSize(), frame.isVarArg, frame.upValueGetters.toArray(NO_UP_VALUE_GETTERS) );
664
71f8f5075df8 compile FnDef
Franklin Schmidt <fschmidt@gmail.com>
parents: 663
diff changeset
114 return null;
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
115 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
116
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
117 private int stackIndex(String name) {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
118 return frame.stackIndex(name);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
119 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
120
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
121 private void popSymbols(int n) {
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
122 List<String> symbols = frame.symbols;
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
123 while( n-- > 0 ) {
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
124 symbols.remove(symbols.size()-1);
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
125 }
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
126 }
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
127
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
128 private int upValueIndex(String name) {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
129 return frame.upValueIndex(name);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
130 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
131
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
132 private ParseException exception(String msg) {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
133 parser.failure();
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
134 return parser.exception(msg);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
135 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
136
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
137 private Expr env() {
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
138 return new GetLocalVar(stackIndex(ENV));
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
139 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
140
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
141 private Class parse() throws ParseException {
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
142 List<Stmt> stmts = new ArrayList<Stmt>();
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
143 int stackStart = symbolsSize();
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
144 {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
145 addSymbol(IO);
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
146 FnCall requireCall = new FnCall( new ConstExpr(PackageLuan.requireFn), new ConstExpr("luan:Io") );
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
147 SetStmt setStmt = new SetStmt( new SetLocalVar(stackIndex(IO)), new ExpressionsExpr(requireCall) );
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
148 stmts.add(setStmt);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
149 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
150 {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
151 addSymbol(MOD);
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
152 TableExpr.Field indent = new TableExpr.Field(new ConstExpr(INDENT),new ConstExpr(""));
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
153 TableExpr tableExpr = new TableExpr( new TableExpr.Field[]{indent}, ExpList.emptyExpList );
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
154 SetStmt setStmt = new SetStmt( new SetLocalVar(stackIndex(MOD)), tableExpr );
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
155 stmts.add(setStmt);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
156 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
157 while( !parser.endOfInput() ) {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
158 Stmt def = parseDef();
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
159 if( def != null ) {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
160 stmts.add(def);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
161 } else {
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
162 parser.anyChar();
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
163 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
164 }
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
165 stmts.add( new ReturnStmt(new GetLocalVar(stackIndex(MOD))) );
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
166 Stmt block = new Block( stmts.toArray(new Stmt[0]), stackStart, symbolsSize() );
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
167 Class fnDef = newFnDef(block);
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
168 return fnDef;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
169 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
170
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
171 private Stmt parseDef() throws ParseException {
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
172 parser.begin();
593
92c9fa5e39e6 remove theme "Get" and "Set", and add "define"
Franklin Schmidt <fschmidt@gmail.com>
parents: 587
diff changeset
173 if( !parser.match("{define:") )
616
56b0b9018319 improve ThemeParser error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 608
diff changeset
174 return parser.failure(null);
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
175 String name = parseName();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
176 if( name==null )
600
b926e53910dd change theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 595
diff changeset
177 throw parser.exception("invalid block name");
616
56b0b9018319 improve ThemeParser error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 608
diff changeset
178 if( !parser.match('}') )
600
b926e53910dd change theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 595
diff changeset
179 throw parser.exception("unclosed define tag");
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
180 String spaces = "";
600
b926e53910dd change theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 595
diff changeset
181 boolean indent = BlankLine();
b926e53910dd change theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 595
diff changeset
182 if( indent ) {
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
183 int startSpaces = parser.currentIndex();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
184 InlineSpaces();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
185 spaces = parser.textFrom(startSpaces);
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
186 }
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
187 Expr table = new GetLocalVar(stackIndex(MOD));
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
188 Settable fnName = new SetTableEntry(table,new ConstExpr(name));
593
92c9fa5e39e6 remove theme "Get" and "Set", and add "define"
Franklin Schmidt <fschmidt@gmail.com>
parents: 587
diff changeset
189 frame = new Frame(frame);
92c9fa5e39e6 remove theme "Get" and "Set", and add "define"
Franklin Schmidt <fschmidt@gmail.com>
parents: 587
diff changeset
190 addSymbol(ENV);
600
b926e53910dd change theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 595
diff changeset
191 Stmt block = parseBody("define:"+name,spaces,indent);
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
192 Class fnDef = newFnDef(block);
593
92c9fa5e39e6 remove theme "Get" and "Set", and add "define"
Franklin Schmidt <fschmidt@gmail.com>
parents: 587
diff changeset
193 frame = frame.parent;
670
58ebfec6178b all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents: 667
diff changeset
194 Stmt rtn = new SetStmt(fnName,fnDef);
616
56b0b9018319 improve ThemeParser error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 608
diff changeset
195 return parser.success(rtn);
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
196 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
197
607
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
198 private Stmt parseBody(String tagName,final String spaces,boolean afterIndent) throws ParseException {
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
199 List<Stmt> stmts = new ArrayList<Stmt>();
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
200 int stackStart = symbolsSize();
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
201 int start = parser.currentIndex();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
202 {
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
203 addSymbol(INDENT);
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
204 final Expr env = env();
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
205 Expr exp = new ExprImpl() {
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
206 @Override public Object eval(LuanStateImpl luan) throws LuanException {
635
c83b8cefd922 better error handling in theme code
Franklin Schmidt <fschmidt@gmail.com>
parents: 634
diff changeset
207 Object obj = env.eval(luan);
c83b8cefd922 better error handling in theme code
Franklin Schmidt <fschmidt@gmail.com>
parents: 634
diff changeset
208 if( !(obj instanceof LuanTable) )
646
cdc70de628b5 simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents: 645
diff changeset
209 throw new LuanException("bad argument (table expected, got "+Luan.type(obj)+")");
635
c83b8cefd922 better error handling in theme code
Franklin Schmidt <fschmidt@gmail.com>
parents: 634
diff changeset
210 LuanTable tbl = (LuanTable)obj;
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
211 String indent = (String)tbl.get(luan,INDENT);
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
212 if( indent==null ) throw new NullPointerException();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
213 return indent;
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
214 }
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
215 };
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
216 // Expr exp = new IndexExpr( se(start,"indent"), env(), new ConstExpr(null,INDENT) );
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
217 SetStmt setStmt = new SetStmt( new SetLocalVar(stackIndex(INDENT)), exp );
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
218 stmts.add(setStmt);
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
219 }
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
220 int end = start;
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
221 while( !matchEndTag(tagName) ) {
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
222 if( parser.endOfInput() )
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
223 throw exception("unclosed block");
607
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
224 Stmt block = parseBlock(spaces,afterIndent);
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
225 if( block != null ) {
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
226 addText(start,end,stmts,false);
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
227 start = parser.currentIndex();
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
228 stmts.add(block);
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
229 afterIndent = false;
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
230 continue;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
231 }
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
232 {
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
233 String extraSpaces = null;
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
234 if( afterIndent ) {
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
235 int startSpaces = parser.currentIndex();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
236 InlineSpaces();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
237 extraSpaces = parser.textFrom(startSpaces);
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
238 end = parser.currentIndex();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
239 }
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
240 Stmt simpleTag = parseSimpleTag(extraSpaces);
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
241 if( simpleTag != null ) {
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
242 addText(start,end,stmts,false);
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
243 start = parser.currentIndex();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
244 stmts.add(simpleTag);
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
245 afterIndent = false;
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
246 continue;
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
247 }
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
248 if( extraSpaces!=null && extraSpaces.length() > 0 )
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
249 continue;
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
250 }
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
251 if( EndOfLine() ) {
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
252 end = parser.currentIndex();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
253 afterIndent = false;
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
254 if( parser.match(spaces) ) {
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
255 addText(start,end,stmts,true);
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
256 start = parser.currentIndex();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
257 afterIndent = true;
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
258 }
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
259 continue;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
260 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
261 parser.anyChar();
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
262 end = parser.currentIndex();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
263 afterIndent = false;
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
264 }
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
265 addText(start,end,stmts,false);
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
266 Stmt block = new Block( stmts.toArray(new Stmt[0]), stackStart, symbolsSize() );
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
267 popSymbols(1);
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
268 return block;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
269 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
270
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
271 private boolean matchEndTag(String tagName) {
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
272 parser.begin();
607
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
273 /*
600
b926e53910dd change theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 595
diff changeset
274 if( tagName.startsWith("define:") )
b926e53910dd change theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 595
diff changeset
275 EndOfLine();
670
58ebfec6178b all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents: 667
diff changeset
276 * /
607
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
277 if( EndOfLine() )
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
278 InlineSpaces();
600
b926e53910dd change theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 595
diff changeset
279 return parser.match("{/") && parser.match(tagName) && parser.match('}') ? parser.success() : parser.failure();
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
280 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
281
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
282 private void addText(int start,int end,List<Stmt> stmts,boolean indent) {
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
283 List<Expressions> args = new ArrayList<Expressions>();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
284 if( start < end ) {
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
285 String text = parser.text.substring(start,end);
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
286 args.add( new ConstExpr(text) );
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
287 }
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
288 if( indent ) {
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
289 args.add( new GetLocalVar(stackIndex(INDENT)) );
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
290 }
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
291 if( !args.isEmpty() ) {
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
292 Expr io = new GetUpVar(upValueIndex(IO));
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
293 Expr stdoutExp = new IndexExpr( io, new ConstExpr("stdout") );
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
294 Expr writeExp = new IndexExpr( stdoutExp, new ConstExpr("write") );
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
295 FnCall writeCall = new FnCall( writeExp, ExpList.build(args) );
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
296 stmts.add( new ExpressionsStmt(writeCall) );
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
297 }
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
298 }
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
299
607
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
300 private Stmt parseBlock(String spaces,boolean afterIndent) throws ParseException {
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
301 parser.begin();
607
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
302 String tagSpaces = null;
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
303 if( afterIndent ) {
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
304 tagSpaces = spaces;
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
305 } else if( EndOfLine() ) {
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
306 int startSpaces = parser.currentIndex();
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
307 InlineSpaces();
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
308 tagSpaces = parser.textFrom(startSpaces);
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
309 }
593
92c9fa5e39e6 remove theme "Get" and "Set", and add "define"
Franklin Schmidt <fschmidt@gmail.com>
parents: 587
diff changeset
310 if( !parser.match("{block:") )
92c9fa5e39e6 remove theme "Get" and "Set", and add "define"
Franklin Schmidt <fschmidt@gmail.com>
parents: 587
diff changeset
311 return parser.failure(null);
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
312 String name = parseName();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
313 if( name==null )
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
314 throw exception("invalid block name");
616
56b0b9018319 improve ThemeParser error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 608
diff changeset
315 if( !parser.match('}') )
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
316 return null;
607
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
317 if( tagSpaces != null ) {
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
318 parser.begin();
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
319 InlineSpaces();
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
320 if( EndOfLine() ) {
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
321 int startSpaces = parser.currentIndex();
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
322 InlineSpaces();
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
323 String line1Spaces = parser.textFrom(startSpaces);
608
Franklin Schmidt <fschmidt@gmail.com>
parents: 607
diff changeset
324 if( line1Spaces.startsWith(tagSpaces) ) {
Franklin Schmidt <fschmidt@gmail.com>
parents: 607
diff changeset
325 String newSpaces = spaces + line1Spaces.substring(tagSpaces.length());
Franklin Schmidt <fschmidt@gmail.com>
parents: 607
diff changeset
326 if( line1Spaces.startsWith(newSpaces) )
Franklin Schmidt <fschmidt@gmail.com>
parents: 607
diff changeset
327 spaces = newSpaces;
Franklin Schmidt <fschmidt@gmail.com>
parents: 607
diff changeset
328 }
607
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
329 }
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
330 parser.failure(); // rollback
c5ad80f869da improve theming indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 600
diff changeset
331 }
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
332 frame = new Frame(frame);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
333 addSymbol(ENV);
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
334 Stmt block = parseBody("block:"+name,spaces,false);
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
335 Class fnDef = newFnDef(block);
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
336 frame = frame.parent;
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
337 // String rtn = "<% env." + tag.name + "(" + (tag.attrs.isEmpty() ? "nil" : table(tag.attrs)) + ",env,function(env) %>" + block + "<% end) %>";
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
338 Expr env = env();
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
339 Expr fn = new IndexExpr( env, new ConstExpr(name) );
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
340 List<Expressions> args = new ArrayList<Expressions>();
593
92c9fa5e39e6 remove theme "Get" and "Set", and add "define"
Franklin Schmidt <fschmidt@gmail.com>
parents: 587
diff changeset
341 args.add( env );
670
58ebfec6178b all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents: 667
diff changeset
342 args.add( fnDef );
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
343 FnCall fnCall = new FnCall( fn, ExpList.build(args) );
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
344 Stmt rtn = new ExpressionsStmt(fnCall);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
345 return parser.success(rtn);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
346 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
347
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
348 private Stmt parseSimpleTag(String spaces) throws ParseException {
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
349 parser.begin();
616
56b0b9018319 improve ThemeParser error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 608
diff changeset
350 if( !parser.match('{') )
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
351 return parser.failure(null);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
352 String name = parseName();
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
353 if( name==null )
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
354 return parser.failure(null);
616
56b0b9018319 improve ThemeParser error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 608
diff changeset
355 if( !parser.match('}') )
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
356 return parser.failure(null);
593
92c9fa5e39e6 remove theme "Get" and "Set", and add "define"
Franklin Schmidt <fschmidt@gmail.com>
parents: 587
diff changeset
357 // rtn = "<% env." + name + (attrs.isEmpty() ? "()" : table(attrs)) + " %>";
92c9fa5e39e6 remove theme "Get" and "Set", and add "define"
Franklin Schmidt <fschmidt@gmail.com>
parents: 587
diff changeset
358 Expr env = env();
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
359 Expr fn = new IndexExpr( env, new ConstExpr(name) );
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
360 if( spaces!=null && spaces.length() > 0 ) {
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
361 final Expr oldEnv = env;
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
362 final Expr oldIndentExpr = new GetLocalVar(stackIndex(INDENT));
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
363 final String addSpaces = spaces;
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
364 env = new ExprImpl() {
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
365 @Override public Object eval(LuanStateImpl luan) throws LuanException {
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
366 LuanTable mt = new LuanTable();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
367 mt.rawPut("__index",oldEnv.eval(luan));
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
368 LuanTable tbl = new LuanTable();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
369 tbl.setMetatable(mt);
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
370 String oldIndent = (String)oldIndentExpr.eval(luan);
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
371 String newIndent = oldIndent + addSpaces;
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
372 tbl.rawPut(INDENT,newIndent);
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
373 return tbl;
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
374 }
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
375 };
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
376 }
645
859c0dedc8b6 remove LuanSource
Franklin Schmidt <fschmidt@gmail.com>
parents: 635
diff changeset
377 FnCall fnCall = new FnCall( fn, env );
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
378 Stmt rtn = new ExpressionsStmt(fnCall);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
379 return parser.success(rtn);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
380 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
381
594
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
382 private void InlineSpaces() {
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
383 while( parser.anyOf(" \t") );
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
384 }
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
385
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
386 private boolean BlankLine() {
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
387 parser.begin();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
388 while( parser.anyOf(" \t") );
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
389 return EndOfLine() ? parser.success() : parser.failure();
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
390 }
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
391
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
392 private boolean EndOfLine() {
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
393 return parser.match( "\r\n" ) || parser.match( '\r' ) || parser.match( '\n' );
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
394 }
e91e476186c7 theme indentation
Franklin Schmidt <fschmidt@gmail.com>
parents: 593
diff changeset
395
616
56b0b9018319 improve ThemeParser error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 608
diff changeset
396 private String parseName() throws ParseException {
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
397 int start = parser.begin();
616
56b0b9018319 improve ThemeParser error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 608
diff changeset
398 if( parser.match('/') )
56b0b9018319 improve ThemeParser error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 608
diff changeset
399 throw exception("bad closing tag");
56b0b9018319 improve ThemeParser error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 608
diff changeset
400 if( parser.match("define:") )
56b0b9018319 improve ThemeParser error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 608
diff changeset
401 throw exception("unexpected definition");
593
92c9fa5e39e6 remove theme "Get" and "Set", and add "define"
Franklin Schmidt <fschmidt@gmail.com>
parents: 587
diff changeset
402 if( !NameChar() )
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
403 return parser.failure(null);
593
92c9fa5e39e6 remove theme "Get" and "Set", and add "define"
Franklin Schmidt <fschmidt@gmail.com>
parents: 587
diff changeset
404 while( NameChar() );
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
405 String match = parser.textFrom(start);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
406 return parser.success(match);
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
407 }
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
408
593
92c9fa5e39e6 remove theme "Get" and "Set", and add "define"
Franklin Schmidt <fschmidt@gmail.com>
parents: 587
diff changeset
409 private boolean NameChar() {
587
Franklin Schmidt <fschmidt@gmail.com>
parents: 586
diff changeset
410 return parser.inCharRange('a', 'z') || parser.inCharRange('A', 'Z')
634
3dde072c3420 allow "." in theme function name
Franklin Schmidt <fschmidt@gmail.com>
parents: 616
diff changeset
411 || parser.inCharRange('0', '9') || parser.anyOf("-_.");
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
412 }
670
58ebfec6178b all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents: 667
diff changeset
413 */
584
0742ac78fa69 add Luan.load_theme
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
414 }