You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.6 KiB
50 lines
1.6 KiB
var Token = require("../lib/Token");
|
|
var StringSource = require("../lib/StringSource");
|
|
|
|
var Tokeniser = module.exports = function(options) {
|
|
var keywords = options.keywords;
|
|
var tokenise = function(input) {
|
|
var source = new StringSource(input);
|
|
|
|
var createToken = function(startIndex, endIndex) {
|
|
var value = input.substring(startIndex, endIndex);
|
|
var tokenType = keywords.indexOf(value) === -1 ? "identifier" : "keyword";
|
|
return new Token(
|
|
tokenType,
|
|
value,
|
|
source.range(startIndex, endIndex)
|
|
);
|
|
};
|
|
|
|
var position = 0;
|
|
var tokens = [];
|
|
var done = input === "";
|
|
|
|
while (!done) {
|
|
var nextWhitespace = indexOfRegex(input, /\s/, position);
|
|
if (nextWhitespace === -1) {
|
|
done = true;
|
|
tokens.push(createToken(position, input.length));
|
|
} else {
|
|
tokens.push(createToken(position, nextWhitespace));
|
|
position = indexOfRegex(input, /\S/, nextWhitespace);
|
|
}
|
|
}
|
|
tokens.push(new Token("end", null, source.range(input.length, input.length)));
|
|
return tokens;
|
|
};
|
|
|
|
var indexOfRegex = function(string, regex, startIndex) {
|
|
startIndex = startIndex || 0;
|
|
var index = string.substring(startIndex).search(regex);
|
|
if (index === -1) {
|
|
return -1;
|
|
} else {
|
|
return index + startIndex;
|
|
}
|
|
};
|
|
|
|
return {
|
|
tokenise: tokenise
|
|
};
|
|
};
|
|
|