Skip to content

Commit

Permalink
Merge branch 'master' of github.com:nodejitsu/kyuri
Browse files Browse the repository at this point in the history
  • Loading branch information
Marak committed Aug 29, 2010
2 parents a671d83 + cebdc64 commit 481b7ac
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 36 deletions.
28 changes: 4 additions & 24 deletions lib/kyuri/core.js
Expand Up @@ -9,11 +9,12 @@
*
*/

var parser = require('./parser').parser,
i18n = require('./i18n').i18n,
Lexer = require('./lexer').Lexer;
var Parser = require('./parser').Parser,
Lexer = require('./lexer').Lexer,
i18n = require('./i18n').i18n;

var core = exports,
parser = new Parser(),
lexer = new Lexer('en', i18n);

exports.compile = function (code, options) {
Expand All @@ -40,24 +41,3 @@ exports.nodes = function (code) {
exports.i18n = i18n;

exports.lexer = lexer;

//
// Monkey slap the Jison parser since we're providing our own lexer.
//
parser.lexer = {
lex: function() {
var token;
token = this.tokens[this.pos] || [""];
this.pos += 1;
this.yylineno = token[2];
this.yytext = token[1];
return token[0];
},
setInput: function(tokens) {
this.tokens = tokens;
return (this.pos = 0);
},
upcomingInput: function() {
return "";
}
};
22 changes: 16 additions & 6 deletions lib/kyuri/lexer.js
Expand Up @@ -10,8 +10,10 @@ var helpers = require('./helpers'),
sys = require('sys'),
eyes = require('eyes');

var MULTI_DENT = /^(\t+)(\.)?/,
SENTENCE = /([\w+\s+]+)/i;
var MULTI_DENT = /^(\t+)(\.)?/,
IS_EXAMPLE_ROW = /^([\|\s+\S+]+\s+\|\s*)$/,
PARSE_EXAMPLE_ROW = /\|\s*(\S+)/gi,
SENTENCE = /([\w+\s+]+)/i;

var Lexer = function (language, i18n) {
// Set the i18n dictionary on the lexer for later use
Expand Down Expand Up @@ -44,13 +46,13 @@ var Lexer = function (language, i18n) {
this.matchers = {};
for (var index in this.headers) {
var key = this.headers[index];
var base = '(' + this.keywords[key].join('|') + ')(\\:\\s*)';
var base = '^(' + this.keywords[key].join('|') + ')(\\:\\s*)';
this.matchers[key] = new RegExp(base, 'i');
}

for (var index in this.operators) {
var key = this.operators[index];
var base = '(' + this.keywords[key].join('|') + ')';
var base = '^(' + this.keywords[key].join('|') + ')';
this.matchers[key] = new RegExp(base, 'i');
}
};
Expand Down Expand Up @@ -112,13 +114,21 @@ Lexer.prototype = {
return this.gherkinToken('background');
},

examplesToken: function () {

examplesToken: function () {
return this.gherkinToken('examples');
},

examplesRowToken: function () {
var match;
if (!(match = this.match(IS_EXAMPLE_ROW, 1))) {
return false;
}

this.i += match.length;
var matches = this.match(PARSE_EXAMPLE_ROW);
this.token('EXAMPLE_ROW', matches.map(function (item) { return item.replace('|','').trim() }));

return true;
},

operatorToken: function () {
Expand Down
101 changes: 97 additions & 4 deletions lib/kyuri/parser.js
@@ -1,4 +1,97 @@
//
// Stub this out until we have jison giving us something...
//
exports.parser = {};
/*
* parser.js: Custom state machine based Parser for Kyuri
*
* (C) 2010 Charlie Robbins
* MIT LICENSE
*
*/

var Parser = function () {

};

var states = {
start: {
transitions: {
'FEATURE': {
value: 'FEATURE',
next: 'feature'
}
}
},

finish: {
transitions: { /* EMPTY */ }
},

fail: {
transitions: { /* EMPTY */ }
},

feature: {
transitions: {
'SENTENCE': {
value: '*',
next: 'featureHeader'
}
}
},

featureHeader: {
transitions: {
'TERMINATOR': {
value: '*',
next: 'featureHeader',
last: ['TERMINATOR', 'SENTENCE']
},
'SENTENCE': {
value: '*',
next: 'featureDescription',
last: 'TERMINATOR'
}
}
},

featureDescription: {
transitions: {
'TERMINATOR': {
value: '*',
next: 'featureDescription',
last: 'SENTENCE'
},
'SENTENCE': {
value: '*',
next: 'featureDescription',
last: 'TERMINATOR'
},
'INDENT': {
value: 1,
next: 'featureDescription',
last: 'TERMINATOR'
}
'SCENARIO': {
value: 'SCENARIO',
next: 'scenario',
last: 'INDENT'
},
}
},
scenario: {
transitions: {
'SENTENCE': {
value: '*',
next: 'scenarioHeader',
last: 'SCENARIO'
}
}
}
};

Parser.prototype = {
parse: function (tokens) {

}
};

exports.Parser = Parser;
4 changes: 2 additions & 2 deletions test/lexer-test.js
Expand Up @@ -29,13 +29,13 @@ vows.describe('kyuri/lexer').addBatch({
assert.isNotNull(data.toString());
eyes.inspect(kyuri.tokens(data.toString()));
}
},/*
},
"lexing complex.feature": {
topic: readAllLines(path.join(__dirname, '..', 'examples', 'complex.feature')),
"should lex correctly": function (err, data) {
assert.isNotNull(data.toString());
eyes.inspect(kyuri.tokens(data.toString()));
}
}*/
}
}
}).export(module);

0 comments on commit 481b7ac

Please sign in to comment.