Skip to main content
Module

x/ohm_js/src/pexprs-toString.js

A library and language for building parsers, interpreters, compilers, etc.
Go to Latest
File
'use strict';
// --------------------------------------------------------------------// Imports// --------------------------------------------------------------------
const common = require('./common');const pexprs = require('./pexprs-main');
// --------------------------------------------------------------------// Operations// --------------------------------------------------------------------
/* e1.toString() === e2.toString() ==> e1 and e2 are semantically equivalent. Note that this is not an iff (<==>): e.g., (~"b" "a").toString() !== ("a").toString(), even though ~"b" "a" and "a" are interchangeable in any grammar, both in terms of the languages they accept and their arities.*/pexprs.PExpr.prototype.toString = common.abstract('toString');
pexprs.any.toString = function() { return 'any';};
pexprs.end.toString = function() { return 'end';};
pexprs.Terminal.prototype.toString = function() { return JSON.stringify(this.obj);};
pexprs.Range.prototype.toString = function() { return JSON.stringify(this.from) + '..' + JSON.stringify(this.to);};
pexprs.Param.prototype.toString = function() { return '$' + this.index;};
pexprs.Lex.prototype.toString = function() { return '#(' + this.expr.toString() + ')';};
pexprs.Alt.prototype.toString = function() { return this.terms.length === 1 ? this.terms[0].toString() : '(' + this.terms.map(term => term.toString()).join(' | ') + ')';};
pexprs.Seq.prototype.toString = function() { return this.factors.length === 1 ? this.factors[0].toString() : '(' + this.factors.map(factor => factor.toString()).join(' ') + ')';};
pexprs.Iter.prototype.toString = function() { return this.expr + this.operator;};
pexprs.Not.prototype.toString = function() { return '~' + this.expr;};
pexprs.Lookahead.prototype.toString = function() { return '&' + this.expr;};
pexprs.Apply.prototype.toString = function() { if (this.args.length > 0) { const ps = this.args.map(arg => arg.toString()); return this.ruleName + '<' + ps.join(',') + '>'; } else { return this.ruleName; }};
pexprs.UnicodeChar.prototype.toString = function() { return '\\p{' + this.category + '}';};