|
|
|
|
|
|
|
|
return (pos < input.length) ? input[pos].col : -1; |
|
|
return (pos < input.length) ? input[pos].col : -1; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function eol(){ |
|
|
|
|
|
return (pos < input.length - 1) ? (input[pos].line !== input[pos+1].line) : true; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
function eof(){ |
|
|
function eof(){ |
|
|
return (pos >= input.length); |
|
|
return (pos >= input.length); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function isPunc(ch){ |
|
|
function isPunc(ch){ |
|
|
return isTokenType("punk", ch); |
|
|
|
|
|
|
|
|
return isTokenType("punc", ch); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function isOpCode(ch){ |
|
|
function isOpCode(ch){ |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function skipPunc(ch){ |
|
|
|
|
|
if (isPunc(ch)){ |
|
|
|
|
|
stream.next(); |
|
|
|
|
|
} else { |
|
|
|
|
|
stream.die("Unexpected punctuation '" + ch + "'."); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
parseDelimited(s,e,d,parser){ |
|
|
|
|
|
let toEOL = (s === null || e === null); |
|
|
|
|
|
let a = []; |
|
|
|
|
|
let first = true; |
|
|
|
|
|
if (!toEOL){skipPunc(s);} |
|
|
|
|
|
while (!stream.eof() && ((!toEOL && isPunc(e)) || (toEOL && !stream.eol()))){ |
|
|
|
|
|
if (first){ |
|
|
|
|
|
first = false; |
|
|
|
|
|
} else {skipPunk(d);} |
|
|
|
|
|
a.push(parser()); |
|
|
|
|
|
} |
|
|
|
|
|
if (!toEOL){skipPunc(e);} |
|
|
|
|
|
return a; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
parseOpCode(){ |
|
|
|
|
|
let val = stream.next(); |
|
|
|
|
|
let mode = 0; // Guess between absolute and zero page. |
|
|
|
|
|
let args = []; // TODO: Finish figuring out how to get the argument list! |
|
|
|
|
|
if (isOp("#")){ |
|
|
|
|
|
stream.next(); |
|
|
|
|
|
mode = 1; // Immediate |
|
|
|
|
|
} else if (isPunc("(")){ |
|
|
|
|
|
mode = 2; // Indirect |
|
|
|
|
|
// TODO: Use parseDelimited() |
|
|
|
|
|
} |
|
|
|
|
|
return { |
|
|
|
|
|
type: "opcode", |
|
|
|
|
|
val: val, |
|
|
|
|
|
args: args, |
|
|
|
|
|
mode: mode |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
parseAtom(){ |
|
|
|
|
|
if (isPunc("(")){ |
|
|
|
|
|
stream.next(); |
|
|
|
|
|
let exp = parseExpression(); |
|
|
|
|
|
if (isPunc(")")){ |
|
|
|
|
|
stream.next(); |
|
|
|
|
|
return exp; |
|
|
|
|
|
} |
|
|
|
|
|
} else if (isOpCode()){ |
|
|
|
|
|
return parseOpCode(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
parse(tokens){ |
|
|
parse(tokens){ |
|
|
let p = { |
|
|
let p = { |