=================================================================== RCS file: /home/cvs/OpenXM/src/ox_toolkit/parse.c,v retrieving revision 1.11 retrieving revision 1.18 diff -u -p -r1.11 -r1.18 --- OpenXM/src/ox_toolkit/parse.c 2003/03/23 20:17:35 1.11 +++ OpenXM/src/ox_toolkit/parse.c 2018/04/05 06:05:44 1.18 @@ -1,5 +1,5 @@ /* -*- mode: C; coding: euc-japan -*- */ -/* $OpenXM: OpenXM/src/ox_toolkit/parse.c,v 1.10 2003/02/03 23:13:23 ohara Exp $ */ +/* $OpenXM: OpenXM/src/ox_toolkit/parse.c,v 1.17 2015/08/27 03:03:34 ohara Exp $ */ /* This module is a parser for OX/CMO expressions. @@ -10,9 +10,11 @@ #include #include #include -#include #include #include +#if !defined(_MSC_VER) +#include +#endif #include "ox_toolkit.h" #include "parse.h" @@ -48,13 +50,13 @@ static union{ static int pflag_cmo_addrev = 1; /* definitions of local functions */ +static void init_parser(char *s); +static cmo *parse(); static void parse_error(char *s); static void parse_right_parenthesis(); static void parse_left_parenthesis(); static void parse_comma(); -#if defined(WITH_GMP) static mpz_ptr parse_mpz_integer(); -#endif /* WITH_GMP */ static int parse_integer(); static char *parse_string(); static cmo *parse_cmo_null(); @@ -63,9 +65,7 @@ static cmo *parse_cmo_string(); static cmo *parse_cmo_mathcap(); static cmo *parse_cmo_list(); static cmo *parse_cmo_monomial32(); -#if defined(WITH_GMP) static cmo *parse_cmo_zz(); -#endif /* WITH_GMP */ static cmo *parse_cmo_zero(); static cmo *parse_cmo_dms_generic(); static cmo *parse_cmo_ring_by_name(); @@ -80,6 +80,11 @@ static ox *parse_ox_data(); static void init_lex(char *s); static int lex(); +/* Parsing a Lisp-style expression of CMO. */ +cmo *ox_parse_lisp(char *s) +{ + return (s != NULL && strlen(s) > 0)? init_parser(s), parse(): NULL; +} static int is_token_cmo(int token) { @@ -105,39 +110,34 @@ static void parse_error(char *s) longjmp(env_parse, 1); } -void setflag_parse(int flag) +static void setflag_parse(int flag) { pflag_cmo_addrev = flag; } -void init_parser(char *s) +static void init_parser(char *s) { setflag_parse(PFLAG_ADDREV); init_lex(s); } -cmo *parse() +static cmo *parse() { - cmo *m; - - if (setjmp(env_parse) != 0) { - return NULL; - /* This is an error. */ - } - - token = lex(); - if (token == '(') { + cmo *m = NULL; + if (setjmp(env_parse) == 0) { token = lex(); - if (is_token_cmo(token)) { - m = parse_cmo(); - }else if(is_token_ox(token)) { - m = parse_ox(); - }else { - parse_error("invalid symbol."); + if (token == '(') { + token = lex(); + if (is_token_cmo(token)) { + m = parse_cmo(); + }else if(is_token_ox(token)) { + m = parse_ox(); + }else { + parse_error("invalid symbol."); + } } - return m; } - return NULL; + return m; } static ox *parse_ox() @@ -222,12 +222,10 @@ static cmo *parse_cmo() token = lex(); m = parse_cmo_monomial32(); break; -#if defined(WITH_GMP) case TOKEN(CMO_ZZ): token = lex(); m = parse_cmo_zz(); break; -#endif /* WITH_GMP */ case TOKEN(CMO_ZERO): token = lex(); m = parse_cmo_zero(); @@ -282,22 +280,18 @@ static void parse_comma() token = lex(); } -#if defined(WITH_GMP) static mpz_ptr new_mpz_set_str(char *s) { - mpz_ptr z = malloc(sizeof(mpz_t)); + mpz_ptr z = MALLOC(sizeof(mpz_t)); mpz_init_set_str(z, s, 10); return z; } static mpz_ptr my_mpz_neg(mpz_ptr src) { - mpz_ptr z = malloc(sizeof(mpz_t)); + mpz_ptr z = MALLOC(sizeof(mpz_t)); mpz_init(z); mpz_neg(z, src); -#ifdef DEBUG - free(src); -#endif return z; } @@ -320,20 +314,31 @@ static mpz_ptr parse_mpz_integer() if (sign == -1) { val = my_mpz_neg(val); } -#ifdef DEBUG - free(yylval.sym); -#endif token = lex(); return val; } -#endif /* WITH_GMP */ static int parse_integer() { -#if defined(WITH_GMP) +#if 0 return mpz_get_si(parse_mpz_integer()); #else - abort(); /* not implemented */ + int sign = 1; + int val; + + if (token == '+') { + token = lex(); + }else if (token == '-') { + sign = -1; + token = lex(); + } + + if (token != T_DIGIT) { + parse_error("no integer."); + } + val = sign*atoi(yylval.sym); + token = lex(); + return val; #endif } @@ -456,7 +461,6 @@ static cmo *parse_cmo_monomial32() return (cmo *)m; } -#if defined(WITH_GMP) /* the following function rewrite internal data of mpz/cmo_zz. */ static cmo *parse_cmo_zz() { @@ -485,7 +489,6 @@ static cmo *parse_cmo_zz() parse_right_parenthesis(); return (cmo *)m; } -#endif /* WITH_GMP */ static cmo *parse_cmo_zero() { @@ -604,14 +607,11 @@ static void init_lex(char *s) #define SIZE_BUFFER 8192 static char buffer[SIZE_BUFFER]; -static char *mkstr(char *src) +static char *new_string(char *s) { - int len; - char *s; - len = strlen(src); - s = malloc(len+1); - strcpy(s, src); - return s; + char *t = MALLOC(strlen(s)+1); + strcpy(t, s); + return t; } /* no measure for buffer overflow */ @@ -625,12 +625,12 @@ static char *lex_digit() buff[i] = c; }else { buff[i] = '\0'; - return mkstr(buff); + return new_string(buff); } c = mygetc(); } buff[SIZE_BUFFER-1] = '\0'; - return mkstr(buff); + return new_string(buff); } #define MK_KEY_CMO(x) { #x , x , TOKEN(x) , IS_CMO } @@ -647,10 +647,13 @@ static struct symbol symbol_list[] = { MK_KEY_CMO(CMO_MONOMIAL32), MK_KEY_CMO(CMO_ZZ), MK_KEY_CMO(CMO_ZERO), + MK_KEY_CMO(CMO_TREE), 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_POLYNOMIAL_IN_ONE_VARIABLE), + MK_KEY_CMO(CMO_RECURSIVE_POLYNOMIAL), MK_KEY_CMO(CMO_ERROR2), MK_KEY_SM(SM_popCMO), MK_KEY_SM(SM_popString), @@ -722,7 +725,7 @@ static char *lex_quoted_string() if(c == '"') { c = mygetc(); buffer[i]='\0'; - return mkstr(buffer); + return new_string(buffer); }else if (c == '\\') { c0 = c; c = mygetc(); @@ -789,6 +792,7 @@ static int lex() yylval.sym = lex_quoted_string(); return T_STRING; default: + ; } if (isalpha(c)) {