216 lines
6.1 KiB
JavaScript
216 lines
6.1 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
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 */
|