Reordering in visitors and their specs

Reorder visiting functions and their specs to more closely match
ordering used in the PEG.js grammar.
redux
David Majda 10 years ago
parent 850ddf5889
commit 0977dd37a3

@ -458,14 +458,6 @@ function generateBytecode(ast) {
return buildSimplePredicate(node.expression, true, context); return buildSimplePredicate(node.expression, true, context);
}, },
semantic_and: function(node, context) {
return buildSemanticPredicate(node.code, false, context);
},
semantic_not: function(node, context) {
return buildSemanticPredicate(node.code, true, context);
},
optional: function(node, context) { optional: function(node, context) {
return buildSequence( return buildSequence(
generate(node.expression, { generate(node.expression, {
@ -514,6 +506,14 @@ function generateBytecode(ast) {
); );
}, },
semantic_and: function(node, context) {
return buildSemanticPredicate(node.code, false, context);
},
semantic_not: function(node, context) {
return buildSemanticPredicate(node.code, true, context);
},
rule_ref: function(node) { rule_ref: function(node) {
return [op.RULE, asts.indexOfRule(ast, node.name)]; return [op.RULE, asts.indexOfRule(ast, node.name)];
}, },

@ -49,11 +49,11 @@ var visitor = {
text: visitExpression, text: visitExpression,
simple_and: visitExpression, simple_and: visitExpression,
simple_not: visitExpression, simple_not: visitExpression,
semantic_and: visitNop,
semantic_not: visitNop,
optional: visitExpression, optional: visitExpression,
zero_or_more: visitExpression, zero_or_more: visitExpression,
one_or_more: visitExpression, one_or_more: visitExpression,
semantic_and: visitNop,
semantic_not: visitNop,
rule_ref: visitNop, rule_ref: visitNop,
literal: visitNop, literal: visitNop,
"class": visitNop, "class": visitNop,

@ -283,6 +283,74 @@ describe("compiler pass |generateBytecode|", function() {
}); });
}); });
describe("for optional", function() {
var grammar = 'start = "a"?';
it("generates correct bytecode", function() {
expect(pass).toChangeAST(grammar, bytecodeDetails([
14, 0, 2, 2, 18, 0, 19, 1, // <expression>
10, 2, 0, // IF_ERROR
2, // * POP
27 // PUSH_NULL
]));
});
it("defines correct constants", function() {
expect(pass).toChangeAST(grammar, constsDetails([
'"a"',
'{ type: "literal", value: "a", description: "\\"a\\"" }'
]));
});
});
describe("for zero or more", function() {
var grammar = 'start = "a"*';
it("generates correct bytecode", function() {
expect(pass).toChangeAST(grammar, bytecodeDetails([
29, // PUSH_EMPTY_ARRAY
14, 0, 2, 2, 18, 0, 19, 1, // <expression>
12, 9, // WHILE_NOT_ERROR
6, // * APPEND
14, 0, 2, 2, 18, 0, 19, 1, // <expression>
2 // POP
]));
});
it("defines correct constants", function() {
expect(pass).toChangeAST(grammar, constsDetails([
'"a"',
'{ type: "literal", value: "a", description: "\\"a\\"" }'
]));
});
});
describe("for one or more", function() {
var grammar = 'start = "a"+';
it("generates correct bytecode", function() {
expect(pass).toChangeAST(grammar, bytecodeDetails([
29, // PUSH_EMPTY_ARRAY
14, 0, 2, 2, 18, 0, 19, 1, // <expression>
11, 12, 3, // IF_NOT_ERROR
12, 9, // * WHILE_NOT_ERROR
6, // * APPEND
14, 0, 2, 2, 18, 0, 19, 1, // <expression>
2, // POP
2, // * POP
2, // POP
28 // PUSH_FAILED
]));
});
it("defines correct constants", function() {
expect(pass).toChangeAST(grammar, constsDetails([
'"a"',
'{ type: "literal", value: "a", description: "\\"a\\"" }'
]));
});
});
describe("for semantic and", function() { describe("for semantic and", function() {
describe("without labels", function() { describe("without labels", function() {
var grammar = 'start = &{ code }'; var grammar = 'start = &{ code }';
@ -433,74 +501,6 @@ describe("compiler pass |generateBytecode|", function() {
}); });
}); });
describe("for optional", function() {
var grammar = 'start = "a"?';
it("generates correct bytecode", function() {
expect(pass).toChangeAST(grammar, bytecodeDetails([
14, 0, 2, 2, 18, 0, 19, 1, // <expression>
10, 2, 0, // IF_ERROR
2, // * POP
27 // PUSH_NULL
]));
});
it("defines correct constants", function() {
expect(pass).toChangeAST(grammar, constsDetails([
'"a"',
'{ type: "literal", value: "a", description: "\\"a\\"" }'
]));
});
});
describe("for zero or more", function() {
var grammar = 'start = "a"*';
it("generates correct bytecode", function() {
expect(pass).toChangeAST(grammar, bytecodeDetails([
29, // PUSH_EMPTY_ARRAY
14, 0, 2, 2, 18, 0, 19, 1, // <expression>
12, 9, // WHILE_NOT_ERROR
6, // * APPEND
14, 0, 2, 2, 18, 0, 19, 1, // <expression>
2 // POP
]));
});
it("defines correct constants", function() {
expect(pass).toChangeAST(grammar, constsDetails([
'"a"',
'{ type: "literal", value: "a", description: "\\"a\\"" }'
]));
});
});
describe("for one or more", function() {
var grammar = 'start = "a"+';
it("generates correct bytecode", function() {
expect(pass).toChangeAST(grammar, bytecodeDetails([
29, // PUSH_EMPTY_ARRAY
14, 0, 2, 2, 18, 0, 19, 1, // <expression>
11, 12, 3, // IF_NOT_ERROR
12, 9, // * WHILE_NOT_ERROR
6, // * APPEND
14, 0, 2, 2, 18, 0, 19, 1, // <expression>
2, // POP
2, // * POP
2, // POP
28 // PUSH_FAILED
]));
});
it("defines correct constants", function() {
expect(pass).toChangeAST(grammar, constsDetails([
'"a"',
'{ type: "literal", value: "a", description: "\\"a\\"" }'
]));
});
});
describe("for rule reference", function() { describe("for rule reference", function() {
it("generates correct bytecode", function() { it("generates correct bytecode", function() {
expect(pass).toChangeAST([ expect(pass).toChangeAST([

Loading…
Cancel
Save