/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 Hatvigsson
  • Date: 2013-05-31 06:15:46 UTC
  • mfrom: (90.1.20 lenasys2)
  • Revision ID: gustav.hartvigsson@gmail.com-20130531061546-vj8z28sq375kvghq
Merged Jonsson:s changes:
Fixed the layout on cms index so the arrows and dots marks expanded objects.
Fixed so the course content is sorted by course occasion and not by name

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* 
2
 
 * Token class and storage definition                                                                   
3
 
 */
4
 
 
5
 
function token(kind, val, fromchar, tochar, row) {
6
 
    this.kind = kind;
7
 
    this.val = val;
8
 
    this.from = fromchar;
9
 
    this.to = tochar;
10
 
    this.row = row;
11
 
}
12
 
 
13
 
// Array to hold the tokens                             
14
 
var tokens = [];            
15
 
/*
16
 
 * Store token in tokens array
17
 
 * Creates a new token object using the constructor
18
 
 */
19
 
 
20
 
function makeToken(kind, val, from, to, rowno) {
21
 
        newtoken = new token(kind, val, from, to, rowno);
22
 
        tokens.push(newtoken);
23
 
}
24
 
 
25
 
/*
26
 
 * Writes error from tokenizer
27
 
 */             
28
 
 
29
 
function error(str, val, row) {
30
 
        alert("Tokenizer Error: " + str + val + " at row " + row);
31
 
}
32
 
 
33
 
/*
34
 
 * Tokenize function 
35
 
 * Tokenizer partly based on ideas from the very clever tokenizer written by Douglas Cockford
36
 
 * The tokenizer is passed a string, and a string of prefix and suffix terminators
37
 
 */
38
 
                
39
 
function tokenize(instring, inprefix, insuffix) {           
40
 
        // index of the start of the token.
41
 
        var from;                       
42
 
        // index of the current character.
43
 
        var i = 0;                      
44
 
        // length of the string
45
 
        var length = instring.length;           
46
 
    // current character.
47
 
        var c;                          
48
 
    // current numerical value
49
 
        var n;                          
50
 
    // current quote character
51
 
        var q;                          
52
 
    // current string value.
53
 
        var str;                        
54
 
        // current row value            
55
 
        var row=1;                                                                              
56
 
        c = instring.charAt(i);
57
 
        while(c) {                      
58
 
        from = i;
59
 
                // White space
60
 
        if(c <= ' ') {
61
 
                        // Add row if this white space is a row terminator              
62
 
                if((c == '\n') || (c == '\r') || (c == '')) {
63
 
                                row++;
64
 
                        }                                                                                                                                                                                                                                                               
65
 
                    i++;
66
 
                c = instring.charAt(i);
67
 
                        // Names i.e. Text
68
 
        } else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {                                  
69
 
                        str = c;
70
 
            i++;
71
 
            for(;;) {
72
 
                c = instring.charAt(i);
73
 
                if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')|| (c == '_')) {
74
 
                    str += c;
75
 
                    i++;
76
 
                } else {
77
 
                    break;
78
 
                }
79
 
            }
80
 
            maketoken('name', str, from, i, row);
81
 
                        // Number token
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);
133
 
                        }
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
 
                            }
208
 
                                // Block comment of /* type
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
 
                }