=================================================================== RCS file: /home/cvs/OpenXM/src/ox_toolkit/parse.c,v retrieving revision 1.12 retrieving revision 1.16 diff -u -p -r1.12 -r1.16 --- OpenXM/src/ox_toolkit/parse.c 2003/03/23 22:09:57 1.12 +++ OpenXM/src/ox_toolkit/parse.c 2005/07/20 17:48:03 1.16 @@ -1,5 +1,5 @@ /* -*- mode: C; coding: euc-japan -*- */ -/* $OpenXM: OpenXM/src/ox_toolkit/parse.c,v 1.11 2003/03/23 20:17:35 ohara Exp $ */ +/* $OpenXM: OpenXM/src/ox_toolkit/parse.c,v 1.15 2004/12/01 17:32:26 ohara Exp $ */ /* This module is a parser for OX/CMO expressions. @@ -48,13 +48,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 +63,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 +78,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 +108,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 +220,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 +278,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,17 +312,13 @@ 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 int sign = 1; @@ -347,9 +335,6 @@ static int parse_integer() parse_error("no integer."); } val = sign*atoi(yylval.sym); -#ifdef DEBUG - free(yylval.sym); -#endif token = lex(); return val; #endif @@ -474,7 +459,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() { @@ -503,7 +487,6 @@ static cmo *parse_cmo_zz() parse_right_parenthesis(); return (cmo *)m; } -#endif /* WITH_GMP */ static cmo *parse_cmo_zero() { @@ -622,14 +605,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 */ @@ -643,12 +623,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 } @@ -740,7 +720,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(); @@ -807,6 +787,7 @@ static int lex() yylval.sym = lex_quoted_string(); return T_STRING; default: + ; } if (isalpha(c)) {