/tryocaml/js_of_ocaml-patched/runtime/parsing.js
http://github.com/cago/tryocaml · JavaScript · 236 lines · 182 code · 16 blank · 38 comment · 38 complexity · 219f3883d33489065c5935fee9ab14eb MD5 · raw file
- /***********************************************************************/
- /* */
- /* Objective Caml */
- /* */
- /* Xavier Leroy, projet Cristal, INRIA Rocquencourt */
- /* */
- /* Copyright 1996 Institut National de Recherche en Informatique et */
- /* en Automatique. All rights reserved. This file is distributed */
- /* under the terms of the GNU Library General Public License, with */
- /* the special exception on linking described in file ../LICENSE. */
- /* */
- /***********************************************************************/
- /* $Id: parsing.c 8983 2008-08-06 09:38:25Z xleroy $ */
- /* The PDA automaton for parsers generated by camlyacc */
- /* The pushdown automata */
- //Provides: caml_parse_engine
- //Requires: caml_lex_array
- function caml_parse_engine(tables, env, cmd, arg)
- {
- var ERRCODE = 256;
- var START = 0;
- var TOKEN_READ = 1;
- var STACKS_GROWN_1 = 2;
- var STACKS_GROWN_2 = 3;
- var SEMANTIC_ACTION_COMPUTED = 4;
- var ERROR_DETECTED = 5;
- var loop = 6;
- var testshift = 7;
- var shift = 8;
- var shift_recover = 9;
- var reduce = 10;
- var READ_TOKEN = 0;
- var RAISE_PARSE_ERROR = 1;
- var GROW_STACKS_1 = 2;
- var GROW_STACKS_2 = 3;
- var COMPUTE_SEMANTIC_ACTION = 4;
- var CALL_ERROR_FUNCTION = 5;
- var env_s_stack = 1;
- var env_v_stack = 2;
- var env_symb_start_stack = 3;
- var env_symb_end_stack = 4;
- var env_stacksize = 5;
- var env_stackbase = 6;
- var env_curr_char = 7;
- var env_lval = 8;
- var env_symb_start = 9;
- var env_symb_end = 10;
- var env_asp = 11;
- var env_rule_len = 12;
- var env_rule_number = 13;
- var env_sp = 14;
- var env_state = 15;
- var env_errflag = 16;
- var tbl_actions = 1;
- var tbl_transl_const = 2;
- var tbl_transl_block = 3;
- var tbl_lhs = 4;
- var tbl_len = 5;
- var tbl_defred = 6;
- var tbl_dgoto = 7;
- var tbl_sindex = 8;
- var tbl_rindex = 9;
- var tbl_gindex = 10;
- var tbl_tablesize = 11;
- var tbl_table = 12;
- var tbl_check = 13;
- var tbl_error_function = 14;
- var tbl_names_const = 15;
- var tbl_names_block = 16;
- if (!tables.dgoto) {
- tables.defred = caml_lex_array (tables[tbl_defred]);
- tables.sindex = caml_lex_array (tables[tbl_sindex]);
- tables.check = caml_lex_array (tables[tbl_check]);
- tables.rindex = caml_lex_array (tables[tbl_rindex]);
- tables.table = caml_lex_array (tables[tbl_table]);
- tables.len = caml_lex_array (tables[tbl_len]);
- tables.lhs = caml_lex_array (tables[tbl_lhs]);
- tables.gindex = caml_lex_array (tables[tbl_gindex]);
- tables.dgoto = caml_lex_array (tables[tbl_dgoto]);
- }
- var res = 0, n, n1, n2, state1;
- // RESTORE
- var sp = env[env_sp];
- var state = env[env_state];
- var errflag = env[env_errflag];
- exit:for (;;) {
- switch(cmd) {
- case START:
- state = 0;
- errflag = 0;
- // Fall through
- case loop:
- n = tables.defred[state];
- if (n != 0) { cmd = reduce; break; }
- if (env[env_curr_char] >= 0) { cmd = testshift; break; }
- res = READ_TOKEN;
- break exit;
- /* The ML code calls the lexer and updates */
- /* symb_start and symb_end */
- case TOKEN_READ:
- if (arg instanceof Array) {
- env[env_curr_char] = tables[tbl_transl_block][arg[0] + 1];
- env[env_lval] = arg[1];
- } else {
- env[env_curr_char] = tables[tbl_transl_const][arg + 1];
- env[env_lval] = 0;
- }
- // Fall through
- case testshift:
- n1 = tables.sindex[state];
- n2 = n1 + env[env_curr_char];
- if (n1 != 0 && n2 >= 0 && n2 <= tables[tbl_tablesize] &&
- tables.check[n2] == env[env_curr_char]) {
- cmd = shift; break;
- }
- n1 = tables.rindex[state];
- n2 = n1 + env[env_curr_char];
- if (n1 != 0 && n2 >= 0 && n2 <= tables[tbl_tablesize] &&
- tables.check[n2] == env[env_curr_char]) {
- n = tables.table[n2];
- cmd = reduce; break;
- }
- if (errflag <= 0) {
- res = CALL_ERROR_FUNCTION;
- break exit;
- }
- // Fall through
- /* The ML code calls the error function */
- case ERROR_DETECTED:
- if (errflag < 3) {
- errflag = 3;
- for (;;) {
- state1 = env[env_s_stack][sp + 1];
- n1 = tables.sindex[state1];
- n2 = n1 + ERRCODE;
- if (n1 != 0 && n2 >= 0 && n2 <= tables[tbl_tablesize] &&
- tables.check[n2] == ERRCODE) {
- cmd = shift_recover; break;
- } else {
- if (sp <= env[env_stackbase]) return RAISE_PARSE_ERROR;
- /* The ML code raises Parse_error */
- sp--;
- }
- }
- } else {
- if (env[env_curr_char] == 0) return RAISE_PARSE_ERROR;
- /* The ML code raises Parse_error */
- env[env_curr_char] = -1;
- cmd = loop; break;
- }
- // Fall through
- case shift:
- env[env_curr_char] = -1;
- if (errflag > 0) errflag--;
- // Fall through
- case shift_recover:
- state = tables.table[n2];
- sp++;
- if (sp >= env[env_stacksize]) {
- res = GROW_STACKS_1;
- break exit;
- }
- // Fall through
- /* The ML code resizes the stacks */
- case STACKS_GROWN_1:
- env[env_s_stack][sp + 1] = state;
- env[env_v_stack][sp + 1] = env[env_lval];
- env[env_symb_start_stack][sp + 1] = env[env_symb_start];
- env[env_symb_end_stack][sp + 1] = env[env_symb_end];
- cmd = loop;
- break;
- case reduce:
- var m = tables.len[n];
- env[env_asp] = sp;
- env[env_rule_number] = n;
- env[env_rule_len] = m;
- sp = sp - m + 1;
- m = tables.lhs[n];
- state1 = env[env_s_stack][sp];
- n1 = tables.gindex[m];
- n2 = n1 + state1;
- if (n1 != 0 && n2 >= 0 && n2 <= tables[tbl_tablesize] &&
- tables.check[n2] == state1)
- state = tables.table[n2];
- else
- state = tables.dgoto[m];
- if (sp >= env[env_stacksize]) {
- res = GROW_STACKS_2;
- break exit;
- }
- // Fall through
- /* The ML code resizes the stacks */
- case STACKS_GROWN_2:
- res = COMPUTE_SEMANTIC_ACTION;
- break exit;
- /* The ML code calls the semantic action */
- case SEMANTIC_ACTION_COMPUTED:
- env[env_s_stack][sp + 1] = state;
- env[env_v_stack][sp + 1] = arg;
- var asp = env[env_asp];
- env[env_symb_end_stack][sp + 1] = env[env_symb_end_stack][asp + 1];
- if (sp > asp) {
- /* This is an epsilon production. Take symb_start equal to symb_end. */
- env[env_symb_start_stack][sp + 1] = env[env_symb_end_stack][asp + 1];
- }
- cmd = loop; break;
- /* Should not happen */
- default:
- return RAISE_PARSE_ERROR;
- }
- }
- // SAVE
- env[env_sp] = sp;
- env[env_state] = state;
- env[env_errflag] = errflag;
- return res;
- }
- //Provides: caml_set_parser_trace const
- //Dummy function!
- function caml_set_parser_trace() { return 0; }