ソースを参照

Number of parser fixes. OpCode parser now properly parses Indirect op codes.

master
Bryan Miller 5年前
コミット
b3262793c0
2個のファイルの変更23行の追加7行の削除
  1. +15
    -1
      src/MOS/6502/tpl.js
  2. +8
    -6
      src/compiler/parser.js

+ 15
- 1
src/MOS/6502/tpl.js ファイルの表示

@@ -63,6 +63,18 @@ const CODES = {
var NAMES = Object.keys(CODES);


function ParseIndirectOpCode(parser){
let t = parser.stream.peek(2);
if (t.type === "punc"){
if (t.val === ")"){
return parser.parseDelimited(null, null, ",", parser.parseExpression.bind(parser))
} else if (t.val === ","){
return parser.parseDelimited("(", ")", ",", parser.parseExpression.bind(parser));
}
}
}



module.exports = Object.freeze({
OPInfo:{
@@ -106,7 +118,9 @@ module.exports = Object.freeze({
return {
type: "opcode",
op: val,
args: this.parseDelimited(null, null, ",", this.parseExpression.bind(this)),
args: ((mode === 2) ?
ParseIndirectOpCode(parser) :
this.parseDelimited(null, null, ",", this.parseExpression.bind(this))),
mode: mode,
line: line,
col: col

+ 8
- 6
src/compiler/parser.js ファイルの表示

@@ -1,4 +1,4 @@
//const OP = require('./op.js');

const PRECEDENCE = {
"#": 0, // Precedence 0 should be ignored!
@@ -11,8 +11,9 @@ const PRECEDENCE = {
function TokenStream(input){
var pos = 0;

function peek(){
return (pos < input.length) ? input[pos] : null;
function peek(off){
off = off || 0;
return (pos+off < input.length) ? input[pos+off] : null;
}

function next(){
@@ -125,13 +126,13 @@ class Parser{
let a = [];
let first = true;
if (!toEOL){this.skipPunc(s);}
while (!this.stream.eof() && ((!toEOL && this.isPunc(e)) || (toEOL && !this.stream.eol()))){
while (!this.stream.eof() && ((!toEOL && !this.isPunc(e)) || (toEOL && !this.stream.eol()))){
if (first){
first = false;
} else {this.skipPunc(d);}
a.push(parser());
}
if (!toEOL){skipPunc(e);}
if (!toEOL){this.skipPunc(e);}
return a;
}

@@ -198,7 +199,8 @@ class Parser{

parseLabel(t){
if (!this.stream.eof()){
if (this.stream.peek().type === "opcode"){
let ct = this.stream.peek();
if (ct.type === "opcode" && t.col === t.val.length){
this.__SKIPEOL = true;
return {
type: "assign",

読み込み中…
キャンセル
保存