Improve semantics of the TEXT bytecode instruction

The TEXT instruction now replaces position at the top of the stack with
the input from that position until the current position. This is simpler
and cleaner semantics than the previous one, where TEXT also popped an
additional value from the stack and kept the position there.
This commit is contained in:
David Majda 2014-05-15 19:12:38 +02:00
parent a815a8b902
commit dad1207c46
3 changed files with 12 additions and 11 deletions

View file

@ -68,8 +68,7 @@ var arrays = require("../../utils/arrays"),
*
* [8] TEXT
*
* stack.pop();
* stack.push(input.substring(stack.top(), currPos));
* stack.push(input.substring(stack.pop(), currPos));
*
* Conditions and Loops
* --------------------
@ -443,8 +442,11 @@ function generateBytecode(ast) {
env: { },
action: null
}),
buildCondition([op.IF_NOT_ERROR], [op.TEXT], []),
[op.NIP]
buildCondition(
[op.IF_NOT_ERROR],
buildSequence([op.POP], [op.TEXT]),
[op.NIP]
)
);
},

View file

@ -219,8 +219,7 @@ function generateJavascript(ast, options) {
' break;',
'',
' case ' + op.TEXT + ':', // TEXT
' stack.pop();',
' stack.push(input.substring(stack[stack.length - 1], peg$currPos));',
' stack.push(input.substring(stack.pop(), peg$currPos));',
' ip++;',
' break;',
'',
@ -522,9 +521,8 @@ function generateJavascript(ast, options) {
break;
case op.TEXT: // TEXT
stack.pop();
parts.push(
stack.push('input.substring(' + stack.top() + ', peg$currPos)')
stack.push('input.substring(' + stack.pop() + ', peg$currPos)')
);
ip++;
break;

View file

@ -221,9 +221,10 @@ describe("compiler pass |generateBytecode|", function() {
expect(pass).toChangeAST('start = $"a"', bytecodeDetails([
1, // PUSH_CURR_POS
14, 0, 2, 2, 18, 0, 19, 1, // <expression>
11, 1, 0, // IF_NOT_ERROR
8, // * TEXT
5 // NIP
11, 2, 1, // IF_NOT_ERROR
2, // * POP
8, // TEXT
5 // * NIP
]));
});
});