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();
if (false) {
if (fst(tokens)[1] !== "Left" && fst(tokens)[1] !== "Right") {
throw error.JSyntaxError(linenum,
charnum,
"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,
charnum,
"defop must be surrounded by exactly 3 identifier");
"defop must be surrounded by exactly 3 identifiers");
}
var pattern = tokens.slice(tokens.length-3,
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) {
var ast = [];
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(parseFull(tokenizer.tokenize(istr)));

12
tokenize.js

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

Loading…
Cancel
Save