@rescript/std
Version:
The motiviation of this repo is that when ReScript users want to share their library with JS users, the JS users don't need have ReScript toolchain installed, this makes sharing code with JS users easier (more details on that topic can be found in our [Ex
216 lines (193 loc) • 6.22 kB
JavaScript
;
var Bytes = require("./bytes.js");
var Curry = require("./curry.js");
var Caml_array = require("./caml_array.js");
var Caml_bytes = require("./caml_bytes.js");
var Caml_lexer = require("./caml_lexer.js");
function engine(tbl, state, buf) {
var result = Caml_lexer.lex_engine(tbl, state, buf);
if (result >= 0) {
buf.lex_start_p = buf.lex_curr_p;
var init = buf.lex_curr_p;
buf.lex_curr_p = {
pos_fname: init.pos_fname,
pos_lnum: init.pos_lnum,
pos_bol: init.pos_bol,
pos_cnum: buf.lex_abs_pos + buf.lex_curr_pos | 0
};
}
return result;
}
function new_engine(tbl, state, buf) {
var result = Caml_lexer.new_lex_engine(tbl, state, buf);
if (result >= 0) {
buf.lex_start_p = buf.lex_curr_p;
var init = buf.lex_curr_p;
buf.lex_curr_p = {
pos_fname: init.pos_fname,
pos_lnum: init.pos_lnum,
pos_bol: init.pos_bol,
pos_cnum: buf.lex_abs_pos + buf.lex_curr_pos | 0
};
}
return result;
}
var zero_pos = {
pos_fname: "",
pos_lnum: 1,
pos_bol: 0,
pos_cnum: 0
};
function from_function(f) {
var partial_arg = Caml_bytes.create(512);
return {
refill_buff: (function (param) {
var read = Curry._2(f, partial_arg, partial_arg.length);
var n = read > 0 ? read : (param.lex_eof_reached = true, 0);
if ((param.lex_buffer_len + n | 0) > param.lex_buffer.length) {
if (((param.lex_buffer_len - param.lex_start_pos | 0) + n | 0) <= param.lex_buffer.length) {
Bytes.blit(param.lex_buffer, param.lex_start_pos, param.lex_buffer, 0, param.lex_buffer_len - param.lex_start_pos | 0);
} else {
var newlen = (param.lex_buffer.length << 1);
if (((param.lex_buffer_len - param.lex_start_pos | 0) + n | 0) > newlen) {
throw {
RE_EXN_ID: "Failure",
_1: "Lexing.lex_refill: cannot grow buffer",
Error: new Error()
};
}
var newbuf = Caml_bytes.create(newlen);
Bytes.blit(param.lex_buffer, param.lex_start_pos, newbuf, 0, param.lex_buffer_len - param.lex_start_pos | 0);
param.lex_buffer = newbuf;
}
var s = param.lex_start_pos;
param.lex_abs_pos = param.lex_abs_pos + s | 0;
param.lex_curr_pos = param.lex_curr_pos - s | 0;
param.lex_start_pos = 0;
param.lex_last_pos = param.lex_last_pos - s | 0;
param.lex_buffer_len = param.lex_buffer_len - s | 0;
var t = param.lex_mem;
for(var i = 0 ,i_finish = t.length; i < i_finish; ++i){
var v = Caml_array.get(t, i);
if (v >= 0) {
Caml_array.set(t, i, v - s | 0);
}
}
}
Bytes.blit(partial_arg, 0, param.lex_buffer, param.lex_buffer_len, n);
param.lex_buffer_len = param.lex_buffer_len + n | 0;
}),
lex_buffer: Caml_bytes.create(1024),
lex_buffer_len: 0,
lex_abs_pos: 0,
lex_start_pos: 0,
lex_curr_pos: 0,
lex_last_pos: 0,
lex_last_action: 0,
lex_eof_reached: false,
lex_mem: [],
lex_start_p: zero_pos,
lex_curr_p: zero_pos
};
}
function from_string(s) {
return {
refill_buff: (function (lexbuf) {
lexbuf.lex_eof_reached = true;
}),
lex_buffer: Bytes.of_string(s),
lex_buffer_len: s.length,
lex_abs_pos: 0,
lex_start_pos: 0,
lex_curr_pos: 0,
lex_last_pos: 0,
lex_last_action: 0,
lex_eof_reached: true,
lex_mem: [],
lex_start_p: zero_pos,
lex_curr_p: zero_pos
};
}
function lexeme(lexbuf) {
var len = lexbuf.lex_curr_pos - lexbuf.lex_start_pos | 0;
return Bytes.sub_string(lexbuf.lex_buffer, lexbuf.lex_start_pos, len);
}
function sub_lexeme(lexbuf, i1, i2) {
var len = i2 - i1 | 0;
return Bytes.sub_string(lexbuf.lex_buffer, i1, len);
}
function sub_lexeme_opt(lexbuf, i1, i2) {
if (i1 < 0) {
return ;
}
var len = i2 - i1 | 0;
return Bytes.sub_string(lexbuf.lex_buffer, i1, len);
}
function sub_lexeme_char(lexbuf, i) {
return Caml_bytes.get(lexbuf.lex_buffer, i);
}
function sub_lexeme_char_opt(lexbuf, i) {
if (i >= 0) {
return Caml_bytes.get(lexbuf.lex_buffer, i);
}
}
function lexeme_char(lexbuf, i) {
return Caml_bytes.get(lexbuf.lex_buffer, lexbuf.lex_start_pos + i | 0);
}
function lexeme_start(lexbuf) {
return lexbuf.lex_start_p.pos_cnum;
}
function lexeme_end(lexbuf) {
return lexbuf.lex_curr_p.pos_cnum;
}
function lexeme_start_p(lexbuf) {
return lexbuf.lex_start_p;
}
function lexeme_end_p(lexbuf) {
return lexbuf.lex_curr_p;
}
function new_line(lexbuf) {
var lcp = lexbuf.lex_curr_p;
lexbuf.lex_curr_p = {
pos_fname: lcp.pos_fname,
pos_lnum: lcp.pos_lnum + 1 | 0,
pos_bol: lcp.pos_cnum,
pos_cnum: lcp.pos_cnum
};
}
function flush_input(lb) {
lb.lex_curr_pos = 0;
lb.lex_abs_pos = 0;
var init = lb.lex_curr_p;
lb.lex_curr_p = {
pos_fname: init.pos_fname,
pos_lnum: init.pos_lnum,
pos_bol: init.pos_bol,
pos_cnum: 0
};
lb.lex_buffer_len = 0;
}
var dummy_pos = {
pos_fname: "",
pos_lnum: 0,
pos_bol: 0,
pos_cnum: -1
};
exports.dummy_pos = dummy_pos;
exports.from_string = from_string;
exports.from_function = from_function;
exports.lexeme = lexeme;
exports.lexeme_char = lexeme_char;
exports.lexeme_start = lexeme_start;
exports.lexeme_end = lexeme_end;
exports.lexeme_start_p = lexeme_start_p;
exports.lexeme_end_p = lexeme_end_p;
exports.new_line = new_line;
exports.flush_input = flush_input;
exports.sub_lexeme = sub_lexeme;
exports.sub_lexeme_opt = sub_lexeme_opt;
exports.sub_lexeme_char = sub_lexeme_char;
exports.sub_lexeme_char_opt = sub_lexeme_char_opt;
exports.engine = engine;
exports.new_engine = new_engine;
/* No side effect */