Skip to main content
Module

x/ohm_js/src/MatchResult.js

A library and language for building parsers, interpreters, compilers, etc.
Go to Latest
File
'use strict';
// --------------------------------------------------------------------// Imports// --------------------------------------------------------------------
const common = require('./common');const util = require('./util');const Interval = require('./Interval');
// --------------------------------------------------------------------// Private stuff// --------------------------------------------------------------------
function MatchResult( matcher, input, startExpr, cst, cstOffset, rightmostFailurePosition, optRecordedFailures) { this.matcher = matcher; this.input = input; this.startExpr = startExpr; this._cst = cst; this._cstOffset = cstOffset; this._rightmostFailurePosition = rightmostFailurePosition; this._rightmostFailures = optRecordedFailures;
if (this.failed()) { /* eslint-disable no-invalid-this */ common.defineLazyProperty(this, 'message', function() { const detail = 'Expected ' + this.getExpectedText(); return ( util.getLineAndColumnMessage(this.input, this.getRightmostFailurePosition()) + detail ); }); common.defineLazyProperty(this, 'shortMessage', function() { const detail = 'expected ' + this.getExpectedText(); const errorInfo = util.getLineAndColumn(this.input, this.getRightmostFailurePosition()); return 'Line ' + errorInfo.lineNum + ', col ' + errorInfo.colNum + ': ' + detail; }); /* eslint-enable no-invalid-this */ }}
MatchResult.prototype.succeeded = function() { return !!this._cst;};
MatchResult.prototype.failed = function() { return !this.succeeded();};
MatchResult.prototype.getRightmostFailurePosition = function() { return this._rightmostFailurePosition;};
MatchResult.prototype.getRightmostFailures = function() { if (!this._rightmostFailures) { this.matcher.setInput(this.input); const matchResultWithFailures = this.matcher._match( this.startExpr, false, this.getRightmostFailurePosition() ); this._rightmostFailures = matchResultWithFailures.getRightmostFailures(); } return this._rightmostFailures;};
MatchResult.prototype.toString = function() { return this.succeeded() ? '[match succeeded]' : '[match failed at position ' + this.getRightmostFailurePosition() + ']';};
// Return a string summarizing the expected contents of the input stream when// the match failure occurred.MatchResult.prototype.getExpectedText = function() { if (this.succeeded()) { throw new Error('cannot get expected text of a successful MatchResult'); }
const sb = new common.StringBuffer(); let failures = this.getRightmostFailures();
// Filter out the fluffy failures to make the default error messages more useful failures = failures.filter(failure => !failure.isFluffy());
for (let idx = 0; idx < failures.length; idx++) { if (idx > 0) { if (idx === failures.length - 1) { sb.append(failures.length > 2 ? ', or ' : ' or '); } else { sb.append(', '); } } sb.append(failures[idx].toString()); } return sb.contents();};
MatchResult.prototype.getInterval = function() { const pos = this.getRightmostFailurePosition(); return new Interval(this.input, pos, pos);};
// --------------------------------------------------------------------// Exports// --------------------------------------------------------------------
module.exports = MatchResult;