=================================================================== RCS file: /home/cvs/OpenXM/src/ox_math/Attic/parse.c,v retrieving revision 1.4 retrieving revision 1.7 diff -u -p -r1.4 -r1.7 --- OpenXM/src/ox_math/Attic/parse.c 1999/11/02 19:51:18 1.4 +++ OpenXM/src/ox_math/Attic/parse.c 1999/11/06 21:39:37 1.7 @@ -1,6 +1,6 @@ /* -*- mode: C; coding: euc-japan -*- */ -/* $OpenXM: OpenXM/src/ox_math/parse.c,v 1.3 1999/11/02 18:58:25 ohara Exp $ */ -/* $Id: parse.c,v 1.4 1999/11/02 19:51:18 ohara Exp $ */ +/* $OpenXM: OpenXM/src/ox_math/parse.c,v 1.6 1999/11/04 18:15:20 ohara Exp $ */ + /* OX expression, CMO expression パーサ */ #include @@ -18,10 +18,9 @@ CMO_MONOMIAL32 は無視しない. (つまりおかしいときは構文エラーになる) */ - /* parse.c, lex.c では, Lisp 表現された CMO 文字列を読み込み, - バイト列を出力する. 中間表現として、cmo *を利用する. - parse() はトークンの列から cmo *(の指す構造体)を生成する. + バイト列を出力する. 中間表現として、cmo 構造体を利用する. + parse() はトークンの列から cmo 構造体を生成し、そのポインタを返す. */ /* 重要なことはパーサ(の各サブルーチン)は @@ -33,8 +32,8 @@ static int token = 0; /* トークンの属性値. yylval は lex() によってセットされる. */ static union{ - int d; - char* sym; + int d; + char *sym; } yylval; /* pflag_cmo_addrev がセットされていれば、厳密には CMO expression では @@ -43,28 +42,31 @@ static union{ static int pflag_cmo_addrev = 1; /* CMO の省略記法を許すか否かのフラグ */ /* 関数の宣言 */ -static int parse_error(char *s); -static int parse_lf(); -static int parse_right_parenthesis(); -static int parse_left_parenthesis(); -static int parse_comma(); -static int parse_integer(); -static cmo *parse_cmo_null(); -static cmo *parse_cmo_int32(); -static cmo *parse_cmo_string(); -static cmo *parse_cmo_mathcap(); -static cmo *parse_cmo_dms_generic(); -static cmo *parse_cmo_ring_by_name(); -static cmo *parse_cmo_error2(); -static cmo *parse_cmo_zero(); -static cmo *parse_cmo_zz(); -static cmo *parse_cmo_list(); -static cmo *parse_cmo(); +static int parse_error(char *s); +static int parse_lf(); +static int parse_right_parenthesis(); +static int parse_left_parenthesis(); +static int parse_comma(); +static int parse_integer(); static char *parse_string(); -static int parse_sm(); -static ox* parse_ox(); -static ox* parse_ox_command(); -static ox* parse_ox_data(); +static cmo *parse_cmo_null(); +static cmo *parse_cmo_int32(); +static cmo *parse_cmo_string(); +static cmo *parse_cmo_mathcap(); +static cmo *parse_cmo_list(); +static cmo *parse_cmo_monomial32(); +static cmo *parse_cmo_zz(); +static cmo *parse_cmo_zero(); +static cmo *parse_cmo_dms_generic(); +static cmo *parse_cmo_ring_by_name(); +static cmo *parse_cmo_distributed_polynomial(); +static cmo *parse_cmo_indeterminate(); +static cmo *parse_cmo_error2(); +static cmo *parse_cmo(); +static int parse_sm(); +static ox *parse_ox(); +static ox *parse_ox_command(); +static ox *parse_ox_data(); static int is_token_cmo(int token) { @@ -128,7 +130,7 @@ static int parse_lf() } -static ox* parse_ox() +static ox *parse_ox() { ox *m = NULL; @@ -147,9 +149,9 @@ static ox* parse_ox() return m; } -static ox* parse_ox_data() +static ox *parse_ox_data() { - ox* m; + ox *m; parse_comma(); parse_left_parenthesis(); @@ -158,9 +160,9 @@ static ox* parse_ox_data() return m; } -static ox* parse_ox_command() +static ox *parse_ox_command() { - ox* m; + ox *m; parse_comma(); parse_left_parenthesis(); @@ -233,6 +235,10 @@ static cmo *parse_cmo() token = lex(); m = parse_cmo_distributed_polynomial(); break; + case TOKEN(CMO_INDETERMINATE): + token = lex(); + m = parse_cmo_indeterminate(); + break; case TOKEN(CMO_ERROR2): token = lex(); m = parse_cmo_error2(); @@ -489,7 +495,7 @@ static cmo *parse_cmo_distributed_polynomial() if (ob->tag != CMO_MONOMIAL32 && ob->tag != CMO_ZERO) { parse_error("invalid cmo."); } - append_cmo_list(m, ob); + append_cmo_list((cmo_list *)m, ob); if (token != ',') { break; } @@ -502,7 +508,17 @@ static cmo *parse_cmo_distributed_polynomial() return (cmo *)m; } +static cmo *parse_cmo_indeterminate() +{ + cmo *ob; + parse_comma(); + parse_left_parenthesis(); + ob = parse_cmo(); + parse_right_parenthesis(); + return (cmo *)new_cmo_indeterminate(ob); +} + static cmo *parse_cmo_error2() { cmo *ob; @@ -546,6 +562,77 @@ static int lex_digit() return d; } +#define MK_KEY_CMO(x) { #x , x , TOKEN(x) , IS_CMO } +#define MK_KEY_SM(x) { #x , x , TOKEN(SM) , IS_SM } +#define MK_KEY_OX(x) { #x , x , TOKEN(x) , IS_OX } + +static symbol symbol_list[] = { + MK_KEY_CMO(CMO_NULL), + MK_KEY_CMO(CMO_INT32), + MK_KEY_CMO(CMO_DATUM), + MK_KEY_CMO(CMO_STRING), + MK_KEY_CMO(CMO_MATHCAP), + MK_KEY_CMO(CMO_LIST), + MK_KEY_CMO(CMO_MONOMIAL32), + MK_KEY_CMO(CMO_ZZ), + MK_KEY_CMO(CMO_ZERO), + MK_KEY_CMO(CMO_DMS_GENERIC), + MK_KEY_CMO(CMO_RING_BY_NAME), + MK_KEY_CMO(CMO_INDETERMINATE), + MK_KEY_CMO(CMO_DISTRIBUTED_POLYNOMIAL), + MK_KEY_CMO(CMO_ERROR2), + MK_KEY_SM(SM_popCMO), + MK_KEY_SM(SM_popString), + MK_KEY_SM(SM_mathcap), + MK_KEY_SM(SM_pops), + MK_KEY_SM(SM_executeStringByLocalParser), + MK_KEY_SM(SM_executeFunction), + MK_KEY_SM(SM_setMathCap), + MK_KEY_SM(SM_control_kill), + MK_KEY_SM(SM_control_reset_connection), + MK_KEY_OX(OX_COMMAND), + MK_KEY_OX(OX_DATA), + {NULL, 0, 0, 0} /* a gate keeper */ +}; + +symbol* lookup_by_symbol(char *key) +{ + symbol *symp; + for(symp = symbol_list; symp->key != NULL; symp++) { + if (strcmp(key, symp->key)==0) { + return symp; + } + } + return NULL; +} + +symbol* lookup_by_token(int tok) +{ + symbol *symp; + for(symp = symbol_list; symp->key != NULL; symp++) { + if (tok == symp->token) { + return symp; + } + } + return NULL; +} + +symbol* lookup_by_tag(int tag) +{ + symbol *symp; + for(symp = symbol_list; symp->key != NULL; symp++) { + if (tag == symp->tag) { + return symp; + } + } + return NULL; +} + +symbol* lookup(int i) +{ + return &symbol_list[i]; +} + /* バッファあふれした場合の対策をちゃんと考えるべき */ static char *lex_quoted_string() { @@ -575,56 +662,15 @@ static char *lex_quoted_string() /* return NULL; */ } -typedef struct { - char *key; - int token; - int op; -} symbol; - -#define MK_KEY_CMO(x) { #x , TOKEN(x) , 0} -#define MK_KEY_SM(x) { #x , TOKEN(SM) , x} -#define MK_KEY(x) { #x , TOKEN(x) , 0} - -static symbol symbol_list[] = { - MK_KEY_CMO(CMO_NULL), - MK_KEY_CMO(CMO_INT32), - MK_KEY_CMO(CMO_DATUM), - MK_KEY_CMO(CMO_STRING), - MK_KEY_CMO(CMO_MATHCAP), - MK_KEY_CMO(CMO_LIST), - MK_KEY_CMO(CMO_MONOMIAL32), - MK_KEY_CMO(CMO_ZZ), - MK_KEY_CMO(CMO_ZERO), - MK_KEY_CMO(CMO_DMS_GENERIC), - MK_KEY_CMO(CMO_RING_BY_NAME), - MK_KEY_CMO(CMO_INDETERMINATE), - MK_KEY_CMO(CMO_DISTRIBUTED_POLYNOMIAL), - MK_KEY_CMO(CMO_ERROR2), - MK_KEY_SM(SM_popCMO), - MK_KEY_SM(SM_popString), - MK_KEY_SM(SM_mathcap), - MK_KEY_SM(SM_pops), - MK_KEY_SM(SM_executeStringByLocalParser), - MK_KEY_SM(SM_executeFunction), - MK_KEY_SM(SM_setMathCap), - MK_KEY_SM(SM_control_kill), - MK_KEY_SM(SM_control_reset_connection), - MK_KEY(OX_COMMAND), - MK_KEY(OX_DATA), - {NULL, 0} /* a gate keeper */ -}; - static int token_of_symbol(char *key) { - symbol *kp; - for(kp = symbol_list; kp->key != NULL; kp++) { - if (strcmp(key, kp->key)==0) { - yylval.d = kp->op; - return kp->token; - } + symbol *symp = lookup_by_symbol(key); + if (symp != NULL) { + yylval.d = symp->tag; + return symp->token; } #if DEBUG - fprintf(stderr, "lex error\n"); + fprintf(stderr, "lex error:: \"%s\" is unknown symbol.\n", key); #endif return 0; } @@ -644,7 +690,7 @@ static int lex_symbol() return 0; } -/* return する前に一文字先読みしておく。 */ +/* return する前に一文字先読みしておく. */ int lex() { int c_dash = 0; @@ -696,20 +742,29 @@ int lex() return 0; } +/* 一文字読み込む関数 */ static char *mygetc_line; static int mygetc_counter; static int mygetc_counter_max; +static int mygetc_nonlf_flag; int mygetc() { - if (mygetc_counter <= mygetc_counter_max) { - return mygetc_line[mygetc_counter++]; + int c = '\0'; + + if (mygetc_nonlf_flag && mygetc_counter <= mygetc_counter_max) { + c = mygetc_line[mygetc_counter++]; + if (c == '\0') { + c = '\n'; + mygetc_nonlf_flag = 0; + } } - return 0; + return c; } int setmode_mygetc(char *s, int len) { + mygetc_nonlf_flag=1; mygetc_counter=0; mygetc_counter_max=len; mygetc_line=s;