@masala/parser
Version:
289 lines (211 loc) • 10.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _parsec = require("../../lib/parsec");
var _genlex = require("../../lib/genlex/genlex");
var _stream = require("../../lib/stream");
var _stream2 = _interopRequireDefault(_stream);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = {
setUp: function setUp(done) {
done();
},
'genlex find offsets when success': function genlexFindOffsetsWhenSuccess(test) {
var genlex = new _genlex.GenLex();
var plus = genlex.tokenize('+');
var minus = genlex.tokenize('-');
var grammar = plus.or(minus).rep().thenEos();
var parser = genlex.use(grammar);
var text = '+ + - --';
var parsing = parser.parse(_stream2.default.ofString(text));
test.ok(parsing.isEos(), 'input is consumed');
test.equal(5, parsing.offset, 'there are 5 keywords');
test.equal(8, parsing.input.location(parsing.offset), 'there are 8 chars');
test.done();
},
'genlex find offsets when fail': function genlexFindOffsetsWhenFail(test) {
var genlex = new _genlex.GenLex();
var plus = genlex.tokenize('+');
var minus = genlex.tokenize('-');
var grammar = plus.or(minus).rep().thenEos();
var parser = genlex.use(grammar);
var text = '+ + +* --';
// 0 1 23
var parsing = parser.parse(_stream2.default.ofString(text));
test.ok(!parsing.isEos(), 'an error should have occurred');
test.equal(3, parsing.getOffset(), 'Failed at the third token');
test.equal(7, parsing.location(), 'fail is not 3: it must be the char offset before the error');
test.done();
},
'expect Genlex to be constructed with spaces ': function expectGenlexToBeConstructedWithSpaces(test) {
var genlex = new _genlex.GenLex();
test.ok(genlex.spaces !== undefined);
test.ok(genlex.definitions.length === 0);
test.done();
},
'expect tokenize() to add on definition': function expectTokenizeToAddOnDefinition(test) {
var genlex = new _genlex.GenLex();
genlex.tokenize(_parsec.N.number(), 'number', 500);
test.ok(genlex.definitions.length === 1);
test.done();
},
'expect use() to sort definitions by revert precedence': function expectUseToSortDefinitionsByRevertPrecedence(test) {
var genlex = new _genlex.GenLex();
var tkNumber = genlex.tokenize(_parsec.N.number(), 'number');
var tkDate = genlex.tokenize(date(), 'date', 800);
var tkChar = genlex.tokenize(_parsec.C.charLiteral(), 'char', 1200);
var grammar = tkDate.then(tkNumber.rep().or(tkChar));
test.notEqual(genlex.definitions[0].name, 'date');
genlex.use(grammar);
test.equal(genlex.definitions[2].name, 'date');
test.equal(genlex.definitions[0].name, 'char');
test.done();
},
'expect use() to create an easy tokenizer': function expectUseToCreateAnEasyTokenizer(test) {
var genlex = new _genlex.GenLex();
var tkNumber = genlex.tokenize(_parsec.N.number(), 'number');
var grammar = tkNumber.rep();
var parser = genlex.use(grammar);
var parsing = parser.parse(_stream2.default.ofString('34 23'));
test.ok(parsing.isAccepted());
test.done();
},
'a Genlex can update its precedence': function aGenlexCanUpdateItsPrecedence(test) {
var genlex = new _genlex.GenLex();
var tkNumber = genlex.tokenize(_parsec.N.number(), 'number');
var tkDate = genlex.tokenize(date(), 'date', 800);
var content = '10/05/2014 34 23';
genlex.setSeparators(' /');
genlex.updatePrecedence('number', 10);
var grammar = tkDate.or(tkNumber).rep();
var parser = genlex.use(grammar);
var parsing = parser.parse(_stream2.default.ofString(content));
test.deepEqual(parsing.value.array(), [10, 5, 2014, 34, 23]);
test.done();
},
'GenLex can tokenize keywords': function GenLexCanTokenizeKeywords(test) {
var genlex = new _genlex.GenLex();
var plus = genlex.tokenize('+');
var grammar = plus.rep().then(_parsec.F.eos().drop());
var parser = genlex.use(grammar);
var text = '+++++';
var parsing = parser.parse(_stream2.default.ofString(text));
test.ok(parsing.isAccepted(), 'GenLex can tokenize keywords');
test.done();
},
'tokenize mixes with keywords': function tokenizeMixesWithKeywords(test) {
var genlex = new _genlex.GenLex();
var number = genlex.tokenize(_parsec.N.number(), 'number');
var plus = genlex.tokenize('+');
var grammar = plus.or(number).rep().then(_parsec.F.eos().drop());
var parser = genlex.use(grammar);
var text = '++77++4+';
var parsing = parser.parse(_stream2.default.ofString(text));
test.ok(parsing.isEos(), 'tokenize mixes with keywords');
test.done();
},
'getMathGenLex() gives a simple genlex': function getMathGenLexGivesASimpleGenlex(test) {
var genlex = (0, _genlex.getMathGenLex)();
var number = genlex.get('number');
var grammar = number.rep();
var text = '15 14';
var parser = genlex.use(grammar);
var parsing = parser.parse(_stream2.default.ofString(text));
test.deepEqual(parsing.value.array(), ['15', '14'], 'getMathGenLex() gives a simple genlex');
test.done();
}, 'getMathGenLex can be enhanced with a parser': function getMathGenLexCanBeEnhancedWithAParser(test) {
var genlex = (0, _genlex.getMathGenLex)();
genlex.remove('-');
var number = genlex.get('number');
//const digits = genlex.get('digits');
var tkDate = genlex.tokenize(date(), 'date', 800);
var grammar = tkDate.rep().then(number).then(_parsec.F.eos());
var text = '15-12-2018 12-02-2020 12 ';
var parser = genlex.use(grammar);
var parsing = parser.parse(_stream2.default.ofString(text));
test.ok(parsing.isAccepted());
test.done();
}, 'getMathGenLex can be enhanced with a string': function getMathGenLexCanBeEnhancedWithAString(test) {
var genlex = (0, _genlex.getMathGenLex)();
var number = genlex.get('number');
var dol = genlex.tokenize('$', 'dol');
var grammar = number.then(dol).rep().then(_parsec.F.eos());
var text = '15 $ ';
var parser = genlex.use(grammar);
var parsing = parser.parse(_stream2.default.ofString(text));
test.ok(parsing.isEos());
test.done();
}, 'getMathGenLex can be enhanced with a string and no name': function getMathGenLexCanBeEnhancedWithAStringAndNoName(test) {
var genlex = (0, _genlex.getMathGenLex)();
var number = genlex.get('number');
genlex.tokenize('$');
var dol = genlex.get('$');
var grammar = number.then(dol).rep().then(_parsec.F.eos());
var text = '15 $ ';
var parsing = genlex.use(grammar).parse(_stream2.default.ofString(text));
test.ok(parsing.isEos());
test.done();
},
'genlex can change separators with a given string': function genlexCanChangeSeparatorsWithAGivenString(test) {
var genlex = (0, _genlex.getMathGenLex)();
var number = genlex.get('number');
var grammar = number.rep().then(_parsec.F.eos().drop());
genlex.setSeparators('-');
var text = '15-12-35--';
var parser = genlex.use(grammar);
var parsing = parser.parse(_stream2.default.ofString(text));
test.ok(parsing.isAccepted());
test.deepEqual(parsing.value.array(), [15, 12, 35]);
test.done();
},
'genlex separators must be a string': function genlexSeparatorsMustBeAString(test) {
var genlex = (0, _genlex.getMathGenLex)();
var found = false;
try {
genlex.setSeparators(_parsec.C.char('-'));
} catch (e) {
found = true;
}
test.ok(found);
test.done();
},
'genlex can change separators with a full Parser': function genlexCanChangeSeparatorsWithAFullParser(test) {
var genlex = (0, _genlex.getMathGenLex)();
var number = genlex.get('number');
var grammar = number.rep().then(_parsec.F.eos().drop());
var separatorParser = _parsec.C.char('-').then(_parsec.C.char('/').opt());
genlex.setSeparatorsParser(separatorParser);
var text = '15-12-/35--10';
var parser = genlex.use(grammar);
var parsing = parser.parse(_stream2.default.ofString(text));
test.ok(parsing.isAccepted());
test.deepEqual(parsing.value.array(), [15, 12, 35, 10]);
test.done();
},
'genlex provide all named tokens': function genlexProvideAllNamedTokens(test) {
var genlex = (0, _genlex.getMathGenLex)();
var _genlex$tokens = genlex.tokens(),
number = _genlex$tokens.number,
plus = _genlex$tokens.plus,
mult = _genlex$tokens.mult,
open = _genlex$tokens.open,
close = _genlex$tokens.close;
//const number = genlex.get('number');
var grammar = number.or(plus).or(open).or(close).or(mult).rep().then(_parsec.F.eos().drop());
var text = '12+ 35';
var parser = genlex.use(grammar);
var parsing = parser.parse(_stream2.default.ofString(text));
test.ok(parsing.isAccepted());
test.deepEqual(parsing.value.array(), [12, '+', 35]);
test.done();
}
};
function date() {
return _parsec.N.digits().then(_parsec.C.charIn('-/').returns('-')).then(_parsec.N.digits()).then(_parsec.C.charIn('-/').returns('-')).then(_parsec.N.digits()).map(function (dateValues) {
return dateValues[4] > 2000 ? dateValues.reverse() : dateValues;
}).map(function (dateArray) {
return dateArray.join('');
});
}
//# sourceMappingURL=genlex-test.js.map