/lenasys/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/lenasys/trunk

« back to all changes in this revision

Viewing changes to Code Tokenizer and Parser/Parser_Test.js

  • Committer: Gustav Hartvigsson
  • Date: 2013-04-04 18:24:21 UTC
  • Revision ID: gustav.hartvigsson@gmail.com-20130404182421-e8l692tsqroc1u05
Readded the file that Adam Ringhede removed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// Array to hold the tokens                             
2
 
var tokens = [];  
3
1
/* 
4
2
 * Token class and storage definition                                                                   
5
3
 */
 
4
 
6
5
function token(kind, val, fromchar, tochar, row) {
7
6
    this.kind = kind;
8
7
    this.val = val;
9
8
    this.from = fromchar;
10
9
    this.to = tochar;
11
10
    this.row = row;
12
 
}          
 
11
}
 
12
 
 
13
// Array to hold the tokens                             
 
14
var tokens = [];            
13
15
/*
14
16
 * Store token in tokens array
15
17
 * Creates a new token object using the constructor
16
18
 */
 
19
 
17
20
function makeToken(kind, val, from, to, rowno) {
18
21
        newtoken = new token(kind, val, from, to, rowno);
19
22
        tokens.push(newtoken);
20
23
}
 
24
 
21
25
/*
22
26
 * Writes error from tokenizer
23
27
 */             
 
28
 
24
29
function error(str, val, row) {
25
30
        alert("Tokenizer Error: " + str + val + " at row " + row);
26
31
}
 
32
 
27
33
/*
28
34
 * Tokenize function 
29
35
 * Tokenizer partly based on ideas from the very clever tokenizer written by Douglas Cockford
30
36
 * The tokenizer is passed a string, and a string of prefix and suffix terminators
31
 
 */             
 
37
 */
 
38
                
32
39
function tokenize(instring, inprefix, insuffix) {           
33
40
        // index of the start of the token.
34
41
        var from;                       
70
77
                    break;
71
78
                }
72
79
            }
73
 
            makeToken('name', str, from, i, row);
 
80
            maketoken('name', str, from, i, row);
74
81
                        // Number token
75
 
                } else if (c >= '0' && c <= '9') {                                                                                              
76
 
                    str = c;
77
 
                    i++;
78
 
                    for(;;) {
79
 
                                c = instring.charAt(i);
80
 
                        if(c < '0' || c > '9') {
81
 
                                break;
82
 
                                }
83
 
                        i++;
84
 
                        str += c;
85
 
                    }
86
 
                    if(c == '.') {
87
 
                        i++;
88
 
                        str += c;
89
 
                        for(;;){
90
 
                                c=instring.charAt(i);
91
 
                            if(c < '0' || c > '9'){ 
92
 
                                        break;
93
 
                                        }
94
 
                            i++;
95
 
                            str += c;
96
 
                            }
97
 
                    }
98
 
                    if(c == 'e' || c =='E') {
99
 
                        i++;
100
 
                        str += c;
101
 
                                c=instring.charAt(i);
102
 
                        if(c == '-' || c == '+') {
103
 
                            i++;
104
 
                            str += c;
105
 
                                        c=instring.charAt(i);
 
82
                    } else if (c >= '0' && c <= '9') {                                                                                          
 
83
                        str = c;
 
84
                        i++;
 
85
                        for(;;) {
 
86
                                c = instring.charAt(i);
 
87
                            if(c < '0' || c > '9') {
 
88
                                                break;
 
89
                                        }
 
90
                            i++;
 
91
                            str += c;
 
92
                            }
 
93
                        if(c == '.') {
 
94
                            i++;
 
95
                            str += c;
 
96
                            for(;;){
 
97
                                        c=instring.charAt(i);
 
98
                                if(c < '0' || c > '9'){ 
 
99
                                                        break;
 
100
                                                }
 
101
                                i++;
 
102
                                str += c;
 
103
                                }
 
104
                            }
 
105
                        if(c == 'e' || c =='E') {
 
106
                            i++;
 
107
                            str += c;
 
108
                                c=instring.charAt(i);
 
109
                            if(c == '-' || c == '+') {
 
110
                                i++;
 
111
                                str += c;
 
112
                                        c=instring.charAt(i);
 
113
                            }
 
114
                            if(c < '0' || c > '9') {
 
115
                                                error('Bad Exponent in Number: ',str,row);
 
116
                                        }
 
117
                            do {
 
118
                                i++;
 
119
                                str += c;
 
120
                                        c = instring.charAt(i);
 
121
                                } while(c >= '0' && c <= '9');
 
122
                            }
 
123
                        if(c >= 'a' && c <= 'z') {
 
124
                                str += c;
 
125
                                i++;
 
126
                                error('Bad Number: ',str,row);
 
127
                            }
 
128
                        n =+ str;
 
129
                        if(isFinite(n)) {
 
130
                                        maketoken('number', n, from, i, row);                                   
 
131
                        } else {
 
132
                            error('Bad Number: ', str, row);
106
133
                        }
107
 
                        if(c < '0' || c > '9') {
108
 
                                        error('Bad Exponent in Number: ',str,row);
109
 
                                }
110
 
                        do {
111
 
                            i++;
112
 
                            str += c;
113
 
                                        c = instring.charAt(i);
114
 
                        } while(c >= '0' && c <= '9');
115
 
                    }
116
 
                    if(c >= 'a' && c <= 'z') {
117
 
                        str += c;
118
 
                        i++;
119
 
                        error('Bad Number: ',str,row);
120
 
                    }
121
 
                    n =+ str;
122
 
                    if(isFinite(n)) {
123
 
                                makeToken('number', n, from, i, row);                                   
124
 
                    } else {
125
 
                        error('Bad Number: ', str, row);
126
 
                    }
127
 
                        // String .. handles c style breaking codes
128
 
                } else if (c == '\'' || c == '"') {                                                                                                                                                             
129
 
                    str = '';
130
 
                    q = c;
131
 
                    i++;
132
 
                    for(;;) {
133
 
                                c = instring.charAt(i);
134
 
                                if(c < ' ') {
135
 
                                        if((c == '\n') || (c == '\r') || (c == '')) {
136
 
                                                // Add row if this white space is a row terminator
137
 
                                                row++;
138
 
                                        } else {
139
 
                                                error('Unterminated String: ', str, row);                                               
140
 
                                        }
141
 
                                }
142
 
                                if (c == q) {
143
 
                                        break;
144
 
                                }
145
 
                                if(c == '\\') {
146
 
                                        i++;
147
 
                                        if(i >= length) {
148
 
                                                error('Unterminated String: ', str, row);                                               
149
 
                                        }
150
 
                                        c = instring.charAt(i);
151
 
                                        if(c == 'b') { 
152
 
                                                c = '\b'; 
153
 
                                                break; 
154
 
                                        }
155
 
                                        if(c == 'f') { 
156
 
                                                c = '\f'; 
157
 
                                                break; 
158
 
                                        }
159
 
                                        if(c == 'n') { 
160
 
                                                c = '\n'; 
161
 
                                                break; 
162
 
                                        }
163
 
                                        if(c == 'r') { 
164
 
                                                c = '\r'; 
165
 
                                                break; 
166
 
                                        }
167
 
                                        if(c == 't') { 
168
 
                                                c = '\t'; 
169
 
                                                break; 
170
 
                                        }
171
 
                                        if(c == 'u') {
172
 
                                                if(i >= length) {
173
 
                                                        error('Unterminated String: ', str, row);                                               
174
 
                                                }
175
 
                                                c = parseInt(this.substr(i + 1, 4), 16);
176
 
                                                if(!isFinite(c) || c < 0) {
177
 
                                                        error('Unterminated String: ', str, row);                                               
178
 
                                                }
179
 
                                                c = String.fromCharCode(c);
180
 
                                                i+=4;
181
 
                                                break;                              
182
 
                                        }
183
 
                                }
184
 
                                str += c;
185
 
                                i++;
186
 
                    }
187
 
                    i++;
188
 
                    makeToken('string', str, from, i, row);
189
 
                c = instring.charAt(i);
190
 
                        // Comment of // type ... does not cover block comments
191
 
                } else if (c == '/' && instring.charAt(i+1) == '/') {                                                           
192
 
                    i++;
193
 
                    for(;;) {
194
 
                                c=instring.charAt(i);
195
 
                        if(c == '\n' || c == '\r' || c == '') {
196
 
                            row++;
197
 
                            break;
198
 
                                }
199
 
                        i++;
200
 
                    }
 
134
                                // String .. handles c style breaking codes
 
135
                        } else if (c == '\'' || c == '"') {                                                                                                                                                             
 
136
                            str = '';
 
137
                            q = c;
 
138
                            i++;
 
139
                            for(;;) {
 
140
                                    c = instring.charAt(i);
 
141
                                if(c < ' ') {
 
142
                                                        if((c == '\n') || (c == '\r') || (c == '')) {
 
143
                                                                // Add row if this white space is a row terminator
 
144
                                                                row++;
 
145
                                                        } else {
 
146
                                                                error('Unterminated String: ', str, row);                                               
 
147
                                                        }
 
148
                                }
 
149
                                if (c == q) {
 
150
                                                        break;
 
151
                                                }
 
152
                                if(c == '\\') {
 
153
                                    i++;
 
154
                                    if(i >= length) {
 
155
                                                error('Unterminated String: ', str, row);                                               
 
156
                                    }
 
157
                                                c = instring.charAt(i);
 
158
                                    if(c == 'b') { 
 
159
                                                                c = '\b'; 
 
160
                                                                break; 
 
161
                                                        }
 
162
                                    if(c == 'f') { 
 
163
                                                                c = '\f'; 
 
164
                                                                break; 
 
165
                                                        }
 
166
                                    if(c == 'n') { 
 
167
                                                                c = '\n'; 
 
168
                                                                break; 
 
169
                                                        }
 
170
                                    if(c == 'r') { 
 
171
                                                                c = '\r'; 
 
172
                                                                break; 
 
173
                                                        }
 
174
                                    if(c == 't') { 
 
175
                                                                c = '\t'; 
 
176
                                                                break; 
 
177
                                                        }
 
178
                                    if(c == 'u') {
 
179
                                        if(i >= length) {
 
180
                                                                error('Unterminated String: ', str, row);                                               
 
181
                                        }
 
182
                                        c = parseInt(this.substr(i + 1, 4), 16);
 
183
                                        if(!isFinite(c) || c < 0) {
 
184
                                                                error('Unterminated String: ', str, row);                                               
 
185
                                        }
 
186
                                        c = String.fromCharCode(c);
 
187
                                        i+=4;
 
188
                                        break;                              
 
189
                                    }
 
190
                                }
 
191
                                str += c;
 
192
                                i++;
 
193
                            }
 
194
                            i++;
 
195
                            maketoken('string', str, from, i, row);
 
196
                        c = instring.charAt(i);
 
197
                                // Comment of // type ... does not cover block comments
 
198
                        } else if (c == '/' && instring.charAt(i+1) == '/') {                                                           
 
199
                            i++;
 
200
                            for(;;) {
 
201
                                    c=instring.charAt(i);
 
202
                                if(c == '\n' || c == '\r' || c == '') {
 
203
                                    row++;
 
204
                                    break;
 
205
                                }
 
206
                                i++;
 
207
                            }
201
208
                                // Block comment of /* type
202
 
                } else if (c == '/' && instring.charAt(i+1) == '*') {                                                           
203
 
                    i++;
204
 
                    for(;;) {
205
 
                                c=instring.charAt(i);
206
 
                        if((c == '*' && instring.charAt(i+1) == '/') || (i == length)) {
207
 
                            i+=2;
208
 
                                        c=instring.charAt(i);
209
 
                            break;
210
 
                                }
211
 
                        if(c == '\n' || c == '\r' || c == '') {
212
 
                            row++;
213
 
                                }
214
 
                        i++;
215
 
                    }
216
 
                        // Multi-character Operators
217
 
                } else if (inprefix.indexOf(c) >= 0) {                                                                                  
218
 
                        str = c;
219
 
            i++;
220
 
            while(true) {
221
 
                        c=instring.charAt(i);
222
 
                if(i >= length || insuffix.indexOf(c) < 0) {
223
 
                        break;
224
 
                }
225
 
                str += c;
226
 
                i++;
227
 
            }
228
 
                        // Single-character Operators
229
 
                makeToken('operator', str, from, i, row);
230
 
        } else {                                                                                                                                                                                                        
231
 
                i++;
232
 
                makeToken('operator', c, from, i, row);
233
 
                c = instring.charAt(i);
234
 
        }
235
 
        }
236
 
}
237
 
 
238
 
function newButton() {
239
 
        var funclist;
240
 
        var oplist;
241
 
        oplist = document.getElementById('infobox');
242
 
        string_tokenize = "foo // Lederhosen\nsin'foo'(200.0*r)+(-21.4/1.51e-6)+/*Plodder*/(Feeeb+400)*ln(3000);\ncos(200.1-atan2(41.0,51.0));\nHello+85-4*2.6-1.51e-6;";
243
 
        tokenize(string_tokenize, "<>+-&","=>&:");                              
244
 
        // Iterate over token objects and print kind of each token and token type in window 
245
 
        printout = document.getElementById('infobox');
246
 
        for(i = 0;i < tokens.length;i++) {
247
 
                printout.innerHTML += tokens[i].kind + " " + tokens[i].val + " (" + tokens[i].from + "-" + tokens[i].to + ") at: " + tokens[i].row + "<br>";
248
 
        }       
249
 
}               
 
209
                        } else if (c == '/' && instring.charAt(i+1) == '*') {                                                           
 
210
                            i++;
 
211
                            for(;;) {
 
212
                                    c=instring.charAt(i);
 
213
                                if((c == '*' && instring.charAt(i+1) == '/') || (i == length)) {
 
214
                                    i+=2;
 
215
                                                c=instring.charAt(i);
 
216
                                    break;
 
217
                                }
 
218
                                if(c == '\n' || c == '\r' || c == '') {
 
219
                                    row++;
 
220
                                }
 
221
                                i++;
 
222
                            }
 
223
                                // Multi-character Operators
 
224
                        } else if (inprefix.indexOf(c) >= 0) {                                                                                  
 
225
                        str = c;
 
226
                        i++;
 
227
                        while(true) {
 
228
                                    c=instring.charAt(i);
 
229
                                if(i >= length || insuffix.indexOf(c) < 0) {
 
230
                                break;
 
231
                                }
 
232
                                str += c;
 
233
                                i++;
 
234
                        }
 
235
                                        // Single-character Operators
 
236
                        maketoken('operator', str, from, i, row);
 
237
                        } else {                                                                                                                                                                                                        
 
238
                        i++;
 
239
                        maketoken('operator', c, from, i, row);
 
240
                        c = instring.charAt(i);
 
241
                        }
 
242
                        }
 
243
                }
 
244
                function newButton()
 
245
                {
 
246
                        var funclist;
 
247
                        var oplist;
 
248
                        oplist = document.getElementById('infobox');
 
249
                        string_tokenize = "foo // Lederhosen\nsin'foo'(200.0*r)+(-21.4/1.51e-6)+/*Plodder*/(Feeeb+400)*ln(3000);\ncos(200.1-atan2(41.0,51.0));\nHello+85-4*2.6-1.51e-6;";
 
250
                        tokenize(string_tokenize, "<>+-&","=>&:");                              
 
251
                        // Iterate over token objects and print kind of each token and token type in window 
 
252
                        printout = document.getElementById('infobox');
 
253
                        for(i = 0;i < tokens.length;i++) {
 
254
                                printout.innerHTML += tokens[i].kind + " " + tokens[i].val + " (" + tokens[i].from + "-" + tokens[i].to + ") at: " + tokens[i].row + "<br>";
 
255
                        }       
 
256
                }