Kaynağa Gözat

Add functionality for referencing arguments with {}

Matt Coles 9 yıl önce
ebeveyn
işleme
f880afa0c2
3 değiştirilmiş dosya ile 55 ekleme ve 1 silme
  1. 46 0
      compiler.js
  2. 2 1
      examples/fizzbuzz.mc
  3. 7 0
      libjs/stdlib.js

+ 46 - 0
compiler.js

113
       })
113
       })
114
       continue
114
       continue
115
     }
115
     }
116
+    let argv = /[{}]/
117
+    if (argv.test(char)) {
118
+      tokens.push({
119
+        type: 'argv',
120
+        value: char
121
+      })
122
+      pos++
123
+      continue
124
+    }
116
     throw new TypeError("I'm not sure what you are telling me :( Ask my creator to teach me what a: " + char + " is.")
125
     throw new TypeError("I'm not sure what you are telling me :( Ask my creator to teach me what a: " + char + " is.")
117
   }
126
   }
118
   return tokens
127
   return tokens
186
       return node
195
       return node
187
     }
196
     }
188
 
197
 
198
+    if (token.type === 'argv' && token.value == '{') {
199
+      token = input[++pos]
200
+      if (token.type !== 'number') {
201
+        throw {
202
+          name: 'Compiler Error',
203
+          message: 'argv may only take integer values.'
204
+        }
205
+      }
206
+      let node = {
207
+        type: 'ArgvLiteral',
208
+        value: token.value
209
+      }
210
+      token = input[++pos]
211
+      if (token.type !== 'argv' || token.value !== '}') {
212
+        throw {
213
+          name: 'Compiler Error',
214
+          message: 'argv literals take one integer value and nothing else.'
215
+        }
216
+      }
217
+      pos++
218
+      return node
219
+    }
189
     throw new TypeError(token.type)
220
     throw new TypeError(token.type)
190
   }
221
   }
191
 
222
 
231
         break
262
         break
232
       case 'BarLiteral':
263
       case 'BarLiteral':
233
         break
264
         break
265
+      case 'ArgvLiteral':
266
+        break
234
       default:
267
       default:
235
         throw {
268
         throw {
236
           name: 'Compiler Error',
269
           name: 'Compiler Error',
282
         value: node.value
315
         value: node.value
283
       })
316
       })
284
     },
317
     },
318
+    ArgvLiteral: function (node, parent) {
319
+      parent._context.push({
320
+        type: 'ArgvLiteral',
321
+        value: node.value
322
+      })
323
+    },
285
     FunctionCall: function (node, parent) {
324
     FunctionCall: function (node, parent) {
286
       let expression = {
325
       let expression = {
287
         type: 'FunctionCall',
326
         type: 'FunctionCall',
366
     case 'StringLiteral':
405
     case 'StringLiteral':
367
       return '{ value: \'' + node.value + '\' }'
406
       return '{ value: \'' + node.value + '\' }'
368
       break
407
       break
408
+    case 'ArgvLiteral':
409
+      if (node.value === 0) {
410
+        return '{ value: process.argv.slice(2).join(\' \') }'
411
+      } else {
412
+        return '_.__get_arg(' + (+node.value+1) + ')'
413
+      }
414
+      break
369
     default:
415
     default:
370
       throw {
416
       throw {
371
         name: 'Compiler Error',
417
         name: 'Compiler Error',

+ 2 - 1
examples/fizzbuzz.mc

11
   )
11
   )
12
 1)
12
 1)
13
 
13
 
14
-(fizzbuzz 100)
14
+(if (eq {1} "")
15
+  (fizzbuzz 25) | (fizzbuzz {1}))

+ 7 - 0
libjs/stdlib.js

58
   neg: function (pred) {
58
   neg: function (pred) {
59
     return !pred
59
     return !pred
60
   },
60
   },
61
+  __get_arg: function (arg) {
62
+    if (process.argv.length > arg) {
63
+      return { value: process.argv[arg] }
64
+    } else {
65
+      return { value: "" }
66
+    }
67
+  }
61
 }
68
 }
62
 
69
 
63
 
70