Skip to content

Commit

Permalink
Issue pegjs#45 (template rules): Add precheck pass for completes crea…
Browse files Browse the repository at this point in the history
…ting AST and default handling for new AST nodes.
  • Loading branch information
Mingun committed Jan 1, 2016
1 parent ae9149a commit 3e32263
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 1 deletion.
3 changes: 3 additions & 0 deletions lib/compiler.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ var compiler = {
* |PEG.GrammarError|.
*/
passes: {
precheck: {
ruleRef2ParamRef: require("./compiler/passes/rule-ref2param-ref")
},
check: {
reportMissingRules: require("./compiler/passes/report-missing-rules"),
reportLeftRecursion: require("./compiler/passes/report-left-recursion"),
Expand Down
21 changes: 21 additions & 0 deletions lib/compiler/passes/rule-ref2param-ref.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
var arrays = require("../../utils/arrays"),
visitor = require("../visitor");

function ruleRef2ParamRef(ast) {
var convert = visitor.build({
rule: function(node) {
convert(node.expression, node);
},

rule_ref: function(node, ownerRule) {
// This is template parameter reference
if (arrays.contains(ownerRule.params, node.name)) {
node.type = 'param_ref';
}
}
});

convert(ast);
}

module.exports = ruleRef2ParamRef;
4 changes: 3 additions & 1 deletion lib/compiler/visitor.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ var visitor = {
one_or_more: visitExpression,
semantic_and: visitNop,
semantic_not: visitNop,
rule_ref: visitNop,
rule_ref: visitChildren("args"),
arg: visitExpression,
param_ref: visitNop,
literal: visitNop,
"class": visitNop,
any: visitNop
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
"lib/compiler/passes/report-left-recursion.js",
"lib/compiler/passes/report-infinite-loops.js",
"lib/compiler/passes/report-missing-rules.js",
"lib/compiler/passes/rule-ref2param-ref.js",
"lib/grammar-error.js",
"lib/parser.js",
"lib/peg.js",
Expand Down
4 changes: 4 additions & 0 deletions spec/unit/compiler/passes/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,12 @@ beforeEach(function() {

toReportError: function(grammar, details) {
var ast = PEG.parser.parse(grammar);
var pass = PEG.compiler.passes.precheck.ruleRef2ParamRef;

try {
// Precheck passes logically parse phase, but cann't be done in parser itself
pass(ast, {});

this.actual(ast);

this.message = function() {
Expand Down

0 comments on commit 3e32263

Please sign in to comment.