Browse Source

fixed bugs in defop parsing, both in the tokenizer and parser (was doing something stupid with array comparisons)

pull/1/head
nisstyre56 11 years ago
parent
commit
cb0dbd0948
  1. 8
      parse.js
  2. 12
      tokenize.js

8
parse.js

@ -350,7 +350,7 @@ function parseDefOp(tokens, linenum, charnum) {
} }
tokens.pop(); tokens.pop();
if (false) { if (fst(tokens)[1] !== "Left" && fst(tokens)[1] !== "Right") {
throw error.JSyntaxError(linenum, throw error.JSyntaxError(linenum,
charnum, charnum,
"defop must be followed by precedence and then either Left or Right"); "defop must be followed by precedence and then either Left or Right");
@ -368,7 +368,7 @@ function parseDefOp(tokens, linenum, charnum) {
}))) { }))) {
throw error.JSyntaxError(linenum, throw error.JSyntaxError(linenum,
charnum, charnum,
"defop must be surrounded by exactly 3 identifier"); "defop must be surrounded by exactly 3 identifiers");
} }
var pattern = tokens.slice(tokens.length-3, var pattern = tokens.slice(tokens.length-3,
tokens.length); tokens.length);
@ -576,7 +576,7 @@ function parse(tokens) {
} }
} }
//var istr = fs.readFileSync('/dev/stdin').toString(); var istr = fs.readFileSync('/dev/stdin').toString();
function parseFull(tokenized) { function parseFull(tokenized) {
var ast = []; var ast = [];
try { try {
@ -597,7 +597,7 @@ module.exports = { parse : function(str) {
}; };
//console.log(parseFull(tokenizer.tokenize(istr)).map(pprint.pprint).join("\n")); console.log(parseFull(tokenizer.tokenize(istr)).map(pprint.pprint).join("\n"));
//console.log(tokenizer.tokenize(istr)); //console.log(tokenizer.tokenize(istr));
//console.log(parseFull(tokenizer.tokenize(istr))); //console.log(parseFull(tokenizer.tokenize(istr)));

12
tokenize.js

@ -347,17 +347,21 @@ function tokenizeHelp(input, matchop) {
process.exit(1); process.exit(1);
} }
} }
var defop_pattern = ["defop", "integer", "identifier",
"left_paren", "identifier",
"identifier", "identifier", "right_paren"];
function tokenizeFull(input) { function tokenizeFull(input) {
var matchop = tools.opMatch(operators); var matchop = tools.opMatch(operators);
var initialPass = tokenizeHelp(input, matchop).reverse(); var initialPass = tokenizeHelp(input, matchop).reverse();
for (var i = 0; i < initialPass.length; i++) { for (var i = 0; i < initialPass.length; i++) {
if (initialPass.slice(i, i+7).map(tools.fst) === if (initialPass.slice(i, i+8).map(tools.fst).every(
["defop", "integer", "identifier", "Left", "Right", function(x, i) {
"left_paren", "identifier", "identifier", "identifier", return x === defop_pattern[i];
"right_paren"]) })) {
rep.OPInfo[initialPass[i+5][1]] = [parseInt(initialPass[i+1][1], 10), rep.OPInfo[initialPass[i+5][1]] = [parseInt(initialPass[i+1][1], 10),
initialPass[i+2][1]]; initialPass[i+2][1]];
}
} }
operators = Object.keys(rep.OPInfo); operators = Object.keys(rep.OPInfo);

Loading…
Cancel
Save