forked from kevin.shehu/GGD
56 lines
2.2 KiB
JavaScript
56 lines
2.2 KiB
JavaScript
var __extends = (this && this.__extends) || (function () {
|
|
var extendStatics = function (d, b) {
|
|
extendStatics = Object.setPrototypeOf ||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
|
return extendStatics(d, b);
|
|
};
|
|
return function (d, b) {
|
|
extendStatics(d, b);
|
|
function __() { this.constructor = d; }
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
};
|
|
})();
|
|
import { ParserDefinitionErrorType } from "../parser/parser";
|
|
import { forEach, values } from "../../utils/utils";
|
|
import { GAstVisitor } from "./gast/gast_visitor_public";
|
|
export function resolveGrammar(topLevels, errMsgProvider) {
|
|
var refResolver = new GastRefResolverVisitor(topLevels, errMsgProvider);
|
|
refResolver.resolveRefs();
|
|
return refResolver.errors;
|
|
}
|
|
var GastRefResolverVisitor = /** @class */ (function (_super) {
|
|
__extends(GastRefResolverVisitor, _super);
|
|
function GastRefResolverVisitor(nameToTopRule, errMsgProvider) {
|
|
var _this = _super.call(this) || this;
|
|
_this.nameToTopRule = nameToTopRule;
|
|
_this.errMsgProvider = errMsgProvider;
|
|
_this.errors = [];
|
|
return _this;
|
|
}
|
|
GastRefResolverVisitor.prototype.resolveRefs = function () {
|
|
var _this = this;
|
|
forEach(values(this.nameToTopRule), function (prod) {
|
|
_this.currTopLevel = prod;
|
|
prod.accept(_this);
|
|
});
|
|
};
|
|
GastRefResolverVisitor.prototype.visitNonTerminal = function (node) {
|
|
var ref = this.nameToTopRule[node.nonTerminalName];
|
|
if (!ref) {
|
|
var msg = this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel, node);
|
|
this.errors.push({
|
|
message: msg,
|
|
type: ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,
|
|
ruleName: this.currTopLevel.name,
|
|
unresolvedRefName: node.nonTerminalName
|
|
});
|
|
}
|
|
else {
|
|
node.referencedRule = ref;
|
|
}
|
|
};
|
|
return GastRefResolverVisitor;
|
|
}(GAstVisitor));
|
|
export { GastRefResolverVisitor };
|
|
//# sourceMappingURL=resolver.js.map
|