//"use strict";
// LLVM assembly => internal intermediate representation, which is ready
// to be processed by the later stages.
var fastPaths = 0, slowPaths = 0;
// Line tokenizer
function tokenizer(item, inner) {
//assert(item.lineNum != 40000);
//if (item.lineNum) print(item.lineNum);
var tokens = [];
var quotes = 0;
var lastToken = null;
var CHUNKSIZE = 64; // How much forward to peek forward. Too much means too many string segments copied
// Note: '{' is not an encloser, as its use in functions is split over many lines
var enclosers = {
'[': 0,
']': '[',
'(': 0,
')': '(',
'<': 0,
'>': '<'
};
var totalEnclosing = 0;
function makeToken(text) {
if (text.length == 0) return;
// merge certain tokens
if (lastToken && ( (lastToken.text == '%' && text[0] == '"') || /^\**$/.test(text) ) ) {
lastToken.text += text;
return;
}
var token = {
text: text
};
if (text[0] in enclosers) {
token.item = tokenizer({
lineText: text.substr(1, text.length-2)
}, true);
token.type = text[0];
}
// merge certain tokens
if (lastToken && isType(lastToken.text) && isFunctionDef(token)) {
lastToken.text += ' ' + text;
} else if (lastToken && text[0] == '}') { // }, }*, etc.
var openBrace = tokens.length-1;
while (tokens[openBrace].text.substr(-1) != '{') openBrace --;
token = combineTokens(tokens.slice(openBrace+1));
tokens.splice(openBrace, tokens.length-openBrace+1);
tokens.push(token);
token.type = '{';
token.text = '{ ' + token.text + ' }';
var pointingLevelsToAdd = pointingLevels(text) - pointingLevels(token.text);
while (pointingLevelsToAdd > 0) {
token.text += '*';
pointingLevelsToAdd--;
}
lastToken = token;
} else {
tokens.push(token);
lastToken = token;
}
}
// Split using meaningful characters
var lineText = item.lineText + ' ';
var re = /[\[\]\(\)<>, "]/g;
var segments = lineText.split(re);
segments.pop();
var len = segments.length;
var i = -1;
var curr = '';
var segment, letter;
for (var s = 0; s < len; s++) {
segment = segments[s];
i += segment.length + 1;