|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function isOp(c){ |
|
|
function isOp(c){ |
|
|
return ("=+-/*#".indexOf(c) >= 0); |
|
|
|
|
|
|
|
|
return ("=+-/*#<>!".indexOf(c) >= 0); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.__stream = GetTextStream(input); |
|
|
this.__stream = GetTextStream(input); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
genTokenObject(type, val){ |
|
|
|
|
|
|
|
|
genTokenObject(type, val, line, col){ |
|
|
return { |
|
|
return { |
|
|
type: type, |
|
|
type: type, |
|
|
val: val, |
|
|
val: val, |
|
|
line: this.__stream.line(), |
|
|
|
|
|
col: this.__stream.col() |
|
|
|
|
|
|
|
|
line: (typeof(line) === 'number') ? line : this.__stream.line(), |
|
|
|
|
|
col: (typeof(col) === 'number') ? col : this.__stream.col() |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
readString(end){ |
|
|
readString(end){ |
|
|
var str = ""; |
|
|
var str = ""; |
|
|
var escaped = false; |
|
|
var escaped = false; |
|
|
|
|
|
var line = this.__stream.line(); |
|
|
|
|
|
var col = this.__stream.col(); |
|
|
|
|
|
console.log(line); |
|
|
this.__stream.next(); |
|
|
this.__stream.next(); |
|
|
while (!this.__stream.eof()){ |
|
|
while (!this.__stream.eof()){ |
|
|
let c = this.__stream.next(); |
|
|
let c = this.__stream.next(); |
|
|
|
|
|
|
|
|
escaped = false; |
|
|
escaped = false; |
|
|
} else if (c === "\\"){ |
|
|
} else if (c === "\\"){ |
|
|
escaped = true; |
|
|
escaped = true; |
|
|
|
|
|
} else if (c === "\n"){ |
|
|
|
|
|
this.__stream.die("String terminated early."); |
|
|
} else if (c === end){ |
|
|
} else if (c === end){ |
|
|
break; |
|
|
break; |
|
|
} else { |
|
|
} else { |
|
|
str += c; |
|
|
str += c; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
return this.genTokenObject('string', str); |
|
|
|
|
|
|
|
|
return this.genTokenObject('string', str, line, col); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
readDirective(){ |
|
|
readDirective(){ |
|
|
|
|
|
|
|
|
} else if (isPunctuation(c)){ |
|
|
} else if (isPunctuation(c)){ |
|
|
return this.genTokenObject('punc', this.__stream.next()); |
|
|
return this.genTokenObject('punc', this.__stream.next()); |
|
|
} else if (isOp(c)){ |
|
|
} else if (isOp(c)){ |
|
|
return this.genTokenObject('op', this.__stream.next()); |
|
|
|
|
|
|
|
|
return this.genTokenObject('op', this.readWhile(isOp)); |
|
|
} |
|
|
} |
|
|
this.__stream.die("Unable to process character '" + c + "'."); |
|
|
this.__stream.die("Unable to process character '" + c + "'."); |
|
|
} |
|
|
} |