From 57ec2e8e2d44f64a1669a47c840a1ccc4c076b4d Mon Sep 17 00:00:00 2001 From: KevinRamharak Date: Wed, 3 Jan 2018 13:26:52 +0100 Subject: [PATCH 1/3] Rewrote parts of the parser to be more modular --- mar/editor.js | 47 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/mar/editor.js b/mar/editor.js index 9c5b0c9..13b3920 100644 --- a/mar/editor.js +++ b/mar/editor.js @@ -12,6 +12,38 @@ editor.session.setOption("useWorker", false); //Remove message editor.$blockScrolling = Infinity; +var MarParserSyntax = { + singleCharRegisters : [ + 'a', 'b', 'c', 'd', 'x', 'y' + ], + doubleCharRegisters : [ + 'bp', 'sp' + ], + doubleOperandInstructions : [ + 'mov', 'add', 'sub', 'and', 'or', 'test', 'cmp', 'shl', 'shr', 'xor', 'rol', 'ror', 'sal', 'sar' + ], + singleOperandInstructions : [ + 'push', 'mul', 'pop', 'div', 'neg', 'call', 'jnz', 'jg', 'jl', 'jge', 'jle', 'hwi', 'hwq', 'jz', + 'js', 'jns', 'ret', 'jmp', 'not', 'jc', 'jnc', 'jo', 'jno' + ], + zeroOperandInstructions : [ + 'ret', 'brk', 'nop' + ] +}; + +var MarParserRegExp = { + allRegisters : new RegExp('^(' + + MarParserSyntax.singleCharRegisters.concat(MarParserSyntax.doubleCharRegisters).join('|') + + ')$'), + singleCharRegisters : new RegExp('^(' + MarParserSyntax.singleCharRegisters.join('|') + ')$'), + doubleCharRegisters : new RegExp('^(' + MarParserSyntax.doubleCharRegisters.join('|') + ')$'), + allInstructions : new RegExp('\\b(?:' + + MarParserSyntax.doubleOperandInstructions.concat(MarParserSyntax.singleOperandInstructions).concat(MarParserSyntax.zeroOperandInstructions).join('|') + + ')\\b'), + doubleOperandInstructions : new RegExp('\\b(?:' + MarParserSyntax.doubleOperandInstructions.join('|') + ')\\b'), + singleOperandInstructions : new RegExp('\\b(?:' + MarParserSyntax.singleOperandInstructions.join('|') + ')\\b'), + zeroOperandInstructions : new RegExp('\\b(?:' + MarParserSyntax.zeroOperandInstructions.join('|') + ')\\b'), +}; function removeComment(line) { if (line.indexOf(";") !== -1) { @@ -177,7 +209,7 @@ function getOperandType(text, result) { } //Check REG - if (new RegExp('^(a|b|c|d|x|y|bp|sp)$').test(text.toLowerCase())) { + if (MarParserRegExp.allRegisters.test(text.toLowerCase())) { return OPERAND_REG; } @@ -205,10 +237,10 @@ function getOperandType(text, result) { //Check for MEM_REG (+ x) var expr = ""; - if (new RegExp('^(bp|sp)$').test(text.toLowerCase().substring(0, 2).toLowerCase())) { + if (MarParserRegExp.doubleCharRegisters.test(text.toLowerCase().substring(0, 2).toLowerCase())) { //Starts with 2-char register expr = text.substring(2); - } else if (new RegExp('^(a|b|c|d|x|y)$').test(text.toLowerCase().substring(0, 1).toLowerCase())) { + } else if (MarParserRegExp.singleCharRegisters.test(text.toLowerCase().substring(0, 1).toLowerCase())) { //Starts with 1-char register expr = text.substring(1); } else { @@ -256,8 +288,7 @@ function parseInstruction(line, result, currentLine) { if (!parseDWInstruction(line, result, currentLine)) { - if (new RegExp('\\b(?:mov|add|sub|and|or|test|cmp|shl|shr|mul|push|pop|div|xor|hwi|hwq|nop|neg|' + - 'call|ret|jmp|jnz|jg|jl|jge|jle|int|jz|js|jns|brk|not|jc|jnc|ror|rol|sal|sar|jo|jno)\\b').test(mnemonic.toLowerCase())) { + if (MarParserRegExp.allInstructions.test(mnemonic.toLowerCase())) { if (line.indexOf(",") !== -1) { @@ -267,7 +298,7 @@ function parseInstruction(line, result, currentLine) { //Validate operand number - if (!new RegExp('\\b(?:mov|add|sub|and|or|test|cmp|shl|shr|xor|rol|ror|sal|sar)\\b').test(mnemonic.toLowerCase())) { + if (!MarParserRegExp.doubleOperandInstructions.test(mnemonic.toLowerCase())) { result.annotations.push({ row: currentLine, column: 0, @@ -315,7 +346,7 @@ function parseInstruction(line, result, currentLine) { strO1 = line.substring(line.indexOf(mnemonic) + mnemonic.length).trim(); //Validate operand number - if (!new RegExp('\\b(?:push|mul|pop|div|neg|call|jnz|jg|jl|jge|jle|hwi|hwq|jz|js|jns|ret|jmp|not|jc|jnc|jo|jno)\\b').test(mnemonic.toLowerCase())) { + if (!MarParserRegExp.singleOperandInstructions.test(mnemonic.toLowerCase())) { result.annotations.push({ row: currentLine, column: 0, @@ -338,7 +369,7 @@ function parseInstruction(line, result, currentLine) { } else { //No operand - if (!new RegExp('\\b(?:ret|brk|nop)\\b').test(mnemonic.toLowerCase())) { + if (!MarParserRegExp.zeroOperandInstructions.test(mnemonic.toLowerCase())) { //Validate operand number result.annotations.push({ From 19177c3e95c326f2e428f416a788e9a8ca5e7a64 Mon Sep 17 00:00:00 2001 From: KevinRamharak Date: Wed, 3 Jan 2018 13:28:35 +0100 Subject: [PATCH 2/3] Added missing instructions fixes #22 --- mar/editor.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mar/editor.js b/mar/editor.js index 13b3920..7d9bd1a 100644 --- a/mar/editor.js +++ b/mar/editor.js @@ -20,7 +20,8 @@ var MarParserSyntax = { 'bp', 'sp' ], doubleOperandInstructions : [ - 'mov', 'add', 'sub', 'and', 'or', 'test', 'cmp', 'shl', 'shr', 'xor', 'rol', 'ror', 'sal', 'sar' + 'mov', 'add', 'sub', 'and', 'or', 'test', 'cmp', 'shl', 'shr', 'xor', 'rol', 'ror', 'sal', 'sar', + 'xchg', 'rcl', 'rcr' ], singleOperandInstructions : [ 'push', 'mul', 'pop', 'div', 'neg', 'call', 'jnz', 'jg', 'jl', 'jge', 'jle', 'hwi', 'hwq', 'jz', From 4c34198fe0acaeb19ed1ecbcb2fbbf4423596e33 Mon Sep 17 00:00:00 2001 From: KevinRamharak Date: Wed, 3 Jan 2018 13:33:34 +0100 Subject: [PATCH 3/3] Added missing instructions to syntax file fixes #22 --- mar/ace/mode-mar.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mar/ace/mode-mar.js b/mar/ace/mode-mar.js index 922b5a6..45a7e96 100755 --- a/mar/ace/mode-mar.js +++ b/mar/ace/mode-mar.js @@ -47,12 +47,12 @@ define("ace/mode/mar_rules", ["require", "exports", "module", "ace/lib/oop", "ac start: [{ token: 'keyword.function.assembly', - regex: '\\b(?:mov|add|sub|and|or|test|cmp|shl|shr|mul|push|pop|div|xor|dw|nop|equ|neg|hwq|not|ror|rol|sal|sar)\\b', + regex: '\\b(?:mov|add|sub|and|or|test|cmp|shl|shr|mul|push|pop|div|xor|dw|nop|equ|neg|hwq|not|ror|rol|sal|sar|rcl|rcr|xchg)\\b', caseInsensitive: true }, { token: 'keyword.operator.assembly', - regex: '\\b(?:call|ret|jmp|jnz|jg|jl|jge|jle|hwi|jz|js|jns|jc|jnc)\\b', + regex: '\\b(?:call|ret|jmp|jnz|jg|jl|jge|jle|hwi|jz|js|jns|jc|jnc|jo|jno)\\b', caseInsensitive: true }, { @@ -114,4 +114,4 @@ define("ace/mode/mar", ["require", "exports", "module", "ace/lib/oop", "ace/mode }).call(Mode.prototype); exports.Mode = Mode; -}); \ No newline at end of file +});