=================================================================== RCS file: /home/cvs/OpenXM/src/ox_math/Attic/parse.c,v retrieving revision 1.2 retrieving revision 1.5 diff -u -p -r1.2 -r1.5 --- OpenXM/src/ox_math/Attic/parse.c 1999/11/02 06:11:58 1.2 +++ OpenXM/src/ox_math/Attic/parse.c 1999/11/03 10:56:40 1.5 @@ -1,6 +1,6 @@ /* -*- mode: C; coding: euc-japan -*- */ -/* $OpenXM$ */ -/* $Id: parse.c,v 1.2 1999/11/02 06:11:58 ohara Exp $ */ +/* $OpenXM: OpenXM/src/ox_math/parse.c,v 1.4 1999/11/02 19:51:18 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,40 +42,42 @@ 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_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_t_cmo(int token) +static int is_token_cmo(int token) { return (token >= MIN_T_CMO && token < MAX_T_CMO) || token == TOKEN(CMO_ERROR2); } -static int is_t_sm(int token) +static int is_token_sm(int token) { - return token >= MIN_T_SM && token < MAX_T_SM; + return token == TOKEN(SM); } -static int is_t_ox(int token) +static int is_token_ox(int token) { return token >= MIN_T_OX && token < MAX_T_OX; } @@ -86,7 +87,7 @@ static jmp_buf env_parse; /* 構文解析に失敗したことを意味する. */ static int parse_error(char *s) { - fprintf(stderr, "%s\n", s); + fprintf(stderr, "syntax error: %s\n", s); longjmp(env_parse, 1); } @@ -105,12 +106,12 @@ cmo *parse() if (token == '(') { token = lex(); - if (is_t_cmo(token)) { + if (is_token_cmo(token)) { m = parse_cmo(); - }else if(is_t_ox(token)) { + }else if(is_token_ox(token)) { m = parse_ox(); }else { - parse_error("syntax error: unknown symbol."); + parse_error("invalid symbol."); } parse_lf(); return m; @@ -122,13 +123,13 @@ cmo *parse() static int parse_lf() { if (token != '\n') { - parse_error("syntax error: not new line."); + parse_error("no new line."); } return 0; } -static ox* parse_ox() +static ox *parse_ox() { ox *m = NULL; @@ -142,14 +143,14 @@ static ox* parse_ox() m = parse_ox_data(); break; default: - parse_error("syntax error: invalid ox_tag."); + parse_error("invalid ox."); } return m; } -static ox* parse_ox_data() +static ox *parse_ox_data() { - ox* m; + ox *m; parse_comma(); parse_left_parenthesis(); @@ -158,28 +159,30 @@ static ox* parse_ox_data() return m; } +static ox *parse_ox_command() +{ + ox *m; + + parse_comma(); + parse_left_parenthesis(); + m = (ox *)new_ox_command(parse_sm()); + parse_right_parenthesis(); + return m; +} + static int parse_sm() { int sm_code; - if (!is_t_sm(token)) { - parse_error("syntax error: invalid sm code."); + if (token != TOKEN(SM)) { + parse_error("no opecode."); } - sm_code = token - T_MAGIC; + sm_code = yylval.d; token = lex(); + parse_right_parenthesis(); return sm_code; } -static ox* parse_ox_command() -{ - ox* m; - - parse_comma(); - m = (ox *)new_ox_command(parse_sm()); - parse_right_parenthesis(); - return m; -} - /* 正しい入力ならば, parse_cmo を呼ぶ時点で, token には TOKEN(CMO_xxx), TOKEN(OX_xxx) のいずれかがセットされている. */ static cmo *parse_cmo() @@ -227,12 +230,16 @@ static cmo *parse_cmo() token = lex(); m = parse_cmo_ring_by_name(); break; + case TOKEN(CMO_DISTRIBUTED_POLYNOMIAL): + token = lex(); + m = parse_cmo_distributed_polynomial(); + break; case TOKEN(CMO_ERROR2): token = lex(); m = parse_cmo_error2(); break; default: - parse_error("syntax error: invalid cmo_tag."); + parse_error("invalid cmo."); } return m; } @@ -240,7 +247,7 @@ static cmo *parse_cmo() static int parse_left_parenthesis() { if (token != '(') { - parse_error("syntax error: no left parenthesis."); + parse_error("no left parenthesis."); } token = lex(); } @@ -248,7 +255,7 @@ static int parse_left_parenthesis() static int parse_right_parenthesis() { if (token != ')') { - parse_error("syntax error: no right parenthesis."); + parse_error("no right parenthesis."); } token = lex(); } @@ -256,7 +263,7 @@ static int parse_right_parenthesis() static int parse_comma() { if (token != ',') { - parse_error("syntax error: no comma."); + parse_error("no comma."); } token = lex(); } @@ -265,7 +272,7 @@ static int parse_integer() { int val; if (token != T_INTEGER) { - parse_error("syntax error: no integer."); + parse_error("no integer."); } val = yylval.d; token = lex(); @@ -276,7 +283,7 @@ static char *parse_string() { char *s; if (token != T_STRING) { - parse_error("syntax error: no string."); + parse_error("no string."); } s = yylval.sym; token = lex(); @@ -309,7 +316,7 @@ static cmo *parse_cmo_string() parse_integer(); parse_comma(); }else if (!pflag_cmo_addrev) { - parse_error("syntax error: not a cmo string."); + parse_error("invalid cmo string."); } s = parse_string(); m = new_cmo_string(s); @@ -342,7 +349,7 @@ static cmo *parse_cmo_list() parse_integer(); parse_comma(); }else if (!pflag_cmo_addrev) { - parse_error("syntax error: not a list."); + parse_error("invalid cmo_list."); } while(token == '(') { @@ -355,7 +362,7 @@ static cmo *parse_cmo_list() parse_comma(); } }else if (!pflag_cmo_addrev) { - parse_error("syntax error: not a list."); + parse_error("invalid cmo_list."); } parse_right_parenthesis(); return (cmo *)m; @@ -367,11 +374,12 @@ static cmo *parse_cmo_monomial32() int *exps; int i; cmo_monomial32 *m; + int tag; parse_comma(); size = parse_integer(); - if (size <= 0) { - parse_error("syntax error: invalid value."); + if (size < 0) { + parse_error("invalid value."); } m = new_cmo_monomial32_size(size); @@ -382,7 +390,12 @@ static cmo *parse_cmo_monomial32() parse_comma(); parse_left_parenthesis(); m->coef = parse_cmo(); - /* 意味的チェックの必要あり */ + tag = m->coef->tag; + + /* m->coef は CMO_ZZ 型か CMO_INT32 型でなければならない */ + if (tag != CMO_ZZ && tag != CMO_INT32) { + parse_error("invalid cmo."); + } parse_right_parenthesis(); return (cmo *)m; } @@ -407,7 +420,7 @@ static cmo *parse_cmo_zz() }else if (pflag_cmo_addrev) { m = new_cmo_zz_set_si(length); }else { - parse_error("syntax error: invalid symbol."); + parse_error("no comma."); } parse_right_parenthesis(); @@ -433,11 +446,64 @@ static cmo *parse_cmo_ring_by_name() parse_comma(); parse_left_parenthesis(); ob = parse_cmo(); - /* 意味的チェックが必要(ob->tag == CMO_STRINGでなければいけない) */ + + /* ob は CMO_STRING 型でなければならない */ + if (ob->tag != CMO_STRING) { + parse_error("invalid cmo."); + } parse_right_parenthesis(); return (cmo *)new_cmo_ring_by_name(ob); } +static cmo *parse_cmo_distributed_polynomial() +{ + int length=0; + int i=0; + cmo_distributed_polynomial *m = new_cmo_distributed_polynomial(); + cmo *ob; + int tag; + + if (token == ',') { + parse_comma(); + + if (token == T_INTEGER) { + parse_integer(); + parse_comma(); + }else if (!pflag_cmo_addrev) { + parse_error("invalid d-polynomial."); + } + + parse_left_parenthesis(); + m->ringdef = parse_cmo(); + tag = m->ringdef->tag; + /* m->ringdef は DringDefinition でなければならない */ + if (tag != CMO_RING_BY_NAME && tag != CMO_DMS_GENERIC + && tag != CMO_DMS_OF_N_VARIABLES) { + parse_error("invalid cmo."); + } + + parse_comma(); + + while(token == '(') { + parse_left_parenthesis(); + ob = parse_cmo(); + if (ob->tag != CMO_MONOMIAL32 && ob->tag != CMO_ZERO) { + parse_error("invalid cmo."); + } + append_cmo_list(m, ob); + if (token != ',') { + break; + } + parse_comma(); + } + }else if (!pflag_cmo_addrev) { + parse_error("invalid d-polynomial."); + } + parse_right_parenthesis(); + return (cmo *)m; +} + + static cmo *parse_cmo_error2() { cmo *ob; @@ -513,34 +579,39 @@ static char *lex_quoted_string() typedef struct { char *key; int token; + int op; } symbol; -#define MK_KEY(x) { #x , TOKEN(x) } +#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_NULL), - MK_KEY(CMO_INT32), - MK_KEY(CMO_DATUM), - MK_KEY(CMO_STRING), - MK_KEY(CMO_MATHCAP), - MK_KEY(CMO_LIST), - MK_KEY(CMO_MONOMIAL32), - MK_KEY(CMO_ZZ), - MK_KEY(CMO_ZERO), - MK_KEY(CMO_DMS_GENERIC), - MK_KEY(CMO_RING_BY_NAME), - MK_KEY(CMO_INDETERMINATE), - MK_KEY(CMO_ERROR2), - MK_KEY(SM_popCMO), - MK_KEY(SM_popString), - MK_KEY(SM_mathcap), - MK_KEY(SM_pops), - MK_KEY(SM_executeStringByLocalParser), - MK_KEY(SM_executeFunction), - MK_KEY(SM_setMathCap), - MK_KEY(SM_control_kill), - MK_KEY(SM_control_reset_connection), - MK_KEY(OX_COMMAND), MK_KEY(OX_DATA), + 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 */ }; @@ -549,6 +620,7 @@ 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; } } @@ -573,7 +645,7 @@ static int lex_symbol() return 0; } -/* return する前に一文字先読みしておく。 */ +/* return する前に一文字先読みしておく. */ int lex() { int c_dash = 0;