1 //<script type="text/javscript">
7 // valac gitlive/app.Builder.js/JsRender/Lang.vala --pkg gee-1.0 -o /tmp/Lang ;/tmp/Lang
11 new JsRender.Lang_Class();
12 print(JsRender.Lang.keyword("delete") + "\n");
19 public errordomain LangError {
23 public Lang_Class Lang = null;
25 public class Lang_Class : Object {
27 GLib.List<string> coreObjects;
28 Gee.HashMap<string,string> whitespaceNames;
29 Gee.HashMap<string,string> newlineNames;
36 //print("lang not null\n");
48 public bool isBuiltin(string name) {
49 return (this.coreObjects.index(name) > -1);
52 public string whitespace (string ch) {
53 return this.whitespaceNames.get(ch);
55 public string newline (string ch) {
56 return this.newlineNames.get(ch);
58 public TokenName keyword(string word) throws LangError {
61 case "break": return TokenName.BREAK;
62 case "case": return TokenName.CASE;
63 case "catch": return TokenName.CATCH;
64 case "const": return TokenName.VAR;
65 case "continue": return TokenName.CONTINUE;
66 case "default": return TokenName.DEFAULT;
67 case "delete": return TokenName.DELETE;
68 case "do": return TokenName.DO;
69 case "else": return TokenName.ELSE;
70 case "eval": return TokenName.EVAL;
71 case "false": return TokenName.FALSE;
72 case "finally": return TokenName.FINALLY;
73 case "for": return TokenName.FOR;
74 case "function": return TokenName.FUNCTION;
75 case "if": return TokenName.IF;
76 case "in": return TokenName.IN;
77 case "instanceof": return TokenName.INSTANCEOF;
78 case "new": return TokenName.NEW;
79 case "null": return TokenName.NULL;
80 case "return": return TokenName.RETURN;
81 case "switch": return TokenName.SWITCH;
82 case "this": return TokenName.THIS;
83 case "throw": return TokenName.THROW;
84 case "true": return TokenName.TRUE;
85 case "try": return TokenName.TRY;
86 case "typeof": return TokenName.TYPEOF;
87 case "void": return TokenName.VOID;
88 case "while": return TokenName.WHILE;
89 case "with": return TokenName.WITH;
90 case "var": return TokenName.VAR;
94 throw new LangError.ArgumentError("invalid keyword : %s", word);
99 public TokenName? matching(TokenName name) throws LangError
104 case TokenName.LEFT_PAREN: return TokenName.RIGHT_PAREN;
105 case TokenName.RIGHT_PAREN: return TokenName.LEFT_PAREN;
106 case TokenName.LEFT_CURLY: return TokenName.RIGHT_CURLY;
107 case TokenName.RIGHT_CURLY: return TokenName.LEFT_CURLY;
108 case TokenName.LEFT_BRACE: return TokenName.RIGHT_BRACE;
109 case TokenName.RIGHT_BRACE: return TokenName.LEFT_BRACE;
111 throw new LangError.ArgumentError("invalid matching character : %s", name.to_string());
116 //return this.matchingNames.get(name);
119 public bool isKeyword(string word) {
121 var x = this.keyword(word);
123 } catch (LangError e) {
128 public TokenName punc (string ch) throws LangError
130 var x = this.puncNull(ch);
132 throw new LangError.ArgumentError("invalid punctuation character : %s",ch);
137 public bool isPunc(string ch) {
138 return this.puncNull(ch) != null;
141 public TokenName puncFirstString (char ch)
145 case ';': return TokenName.SEMICOLON;
146 case ',': return TokenName.COMMA;
147 case '?': return TokenName.HOOK;
148 case ':': return TokenName.COLON;
149 case '|': return TokenName.BITWISE_OR;
150 case '^': return TokenName.BITWISE_XOR;
151 case '&': return TokenName.BITWISE_AND;
152 case '=': return TokenName.ASSIGN;
153 case '<': return TokenName.LT;
154 case '>': return TokenName.GT;
155 case '+': return TokenName.PLUS;
156 case '-': return TokenName.MINUS;
157 case '*': return TokenName.MUL;
158 case '/': return TokenName.DIV;
159 case '%': return TokenName.MOD;
160 case '!': return TokenName.NOT;
161 case '~': return TokenName.BITWISE_NOT;
162 case '0': return TokenName.DOT;
163 case '[': return TokenName.LEFT_BRACE;
164 case ']': return TokenName.RIGHT_BRACE;
165 case '{': return TokenName.LEFT_CURLY;
166 case '}': return TokenName.RIGHT_CURLY;
167 case '(': return TokenName.LEFT_PAREN;
168 case ')': return TokenName.RIGHT_PAREN;
170 return TokenName.UNKNOWN;
172 public TokenName puncString (string ch)
177 case "||": return TokenName.OR;
178 case "&&": return TokenName.AND;
179 case "==": return TokenName.EQ;
180 case "!=": return TokenName.NE;
181 case "<<": return TokenName.LSH;
182 case "<=": return TokenName.LE;
183 case ">>": return TokenName.RSH;
184 case ">=": return TokenName.GE;
185 case "++": return TokenName.INCREMENT;
186 case "--": return TokenName.DECREMENT;
189 case "===": return TokenName.STRICT_EQ;
190 case "!==": return TokenName.STRICT_NE;
191 case ">>>": return TokenName.URSH;
195 return TokenName.UNKNOWN;
204 public bool isNumber (string str) {
205 return Regex.match_simple("^(\\.[0-9]|[0-9]+\\.|[0-9])[0-9]*([eE][+-]?[0-9]+)?$",str);
208 public bool isHexDec (string str) {
209 return Regex.match_simple("^0x[0-9A-Fa-f]+$",str);
212 public bool isWordString (string str) {
213 return Regex.match_simple("^[a-zA-Z0-9$_.]+$", str);
215 public bool isWordChar (char c) {
217 (c >= 'a' && c <= 'z')
219 (c >= 'A' && c <= 'Z')
221 (c >= '0' && c <= '9')
223 c == '$' || c == '.' || c == '_' ;
226 public bool isSpace (string str) {
227 return this.whitespaceNames.get(str) != null;
229 public bool isSpaceC (char str) {
230 var s = str.to_string();
231 return this.whitespaceNames.get(s) != null;
234 public bool isNewline (string str) {
235 return this.newlineNames.get(str) != null;
237 public bool isNewlineC (char str) {
238 var s =str.to_string();
239 return this.newlineNames.get(s) != null;
241 public bool isBoolean (string str) {
243 return ss == "false" || ss == "true";
250 this.coreObjects = new GLib.List<string>();
252 this.whitespaceNames = new Gee.HashMap<string,string>();
253 this.newlineNames = new Gee.HashMap<string,string>();
260 string[] co = { "_global_", "Array", "Boolean", "Date", "Error",
261 "Function", "Math", "Number", "Object", "RegExp", "String" };
262 for(var i =0; i< co.length;i++ ) {
263 this.coreObjects.append(co[i]);
264 //this.match_strings.add(co[i]);
270 // "\u0009:UNICODE_TAB",
271 // "\u000A:UNICODE_NBR",
272 // "\u0008:VERTICAL_TAB"
274 for(var i =0; i< ws.length;i++ ) {
275 var x = ws[i].split(":");
276 this.whitespaceNames.set(x[0],x[1]);
282 // "\u000A:UNICODE_LF",
283 // "\u000D:UNICODE_CR",
284 // "\u2029:UNICODE_PS",
285 // "\u2028:UNICODE_LS"
287 for(var i =0; i< ws.length;i++ ) {
288 var x = ws[i].split(":");
289 this.newlineNames.set(x[0],x[1]);
293 // << was keywords here...
294 //this.match_strings.add(x[0].substring(1));