rev 595 - in trunk: . pr/test src
SVN User <[email protected]> Thu, 10 Jun 2004 15:29:06 -0400
| Newsgroups | gmane.comp.lang.prothon.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: mark
Date: 2004-06-10 15:29:04 -0400 (Thu, 10 Jun 2004)
New Revision: 595
Modified:
trunk/STATUS.txt
trunk/pr/test/test.pr
trunk/src/builtins-bytes.c
trunk/src/builtins-int.c
trunk/src/object.h
trunk/src/prothon.y
Log:
added list of ints constructor to Bytes object
Modified: trunk/STATUS.txt
===================================================================
--- trunk/STATUS.txt 2004-06-10 07:23:26 UTC (rev 594)
+++ trunk/STATUS.txt 2004-06-10 19:29:04 UTC (rev 595)
@@ -3,6 +3,7 @@
--- allow lists of ints in Bytes constructor
--- allow Bytes object in String constructor with encoding param
+--- allow lists of ints in Bytes constructor
--- allow tracebacks in the constructors to exception objects or raise command
Modified: trunk/pr/test/test.pr
===================================================================
--- trunk/pr/test/test.pr 2004-06-10 07:23:26 UTC (rev 594)
+++ trunk/pr/test/test.pr 2004-06-10 19:29:04 UTC (rev 595)
@@ -1,109 +1,3 @@
#!/usr/bin/env prothon
-# strmod.pr
-
-# TODO:
-# *) More comprehensive tests, especially replace() and split().
-# *) Test binary string handling (when parser is fixed).
-
-failures = 0
-
-s = "test %4d..%4.2e..%s" % (-12, 100/3, 'jhgdjhg')
-
-if s != 'test -12..3.33e+01..jhgdjhg':
- print 'error 1'
- print s
- failures = failures+1
-
-if "abCDefG".lower() != "abcdefg":
- print "lower() failed!"
- failures = failures+1
-
-if "abCDefG345%^&".lower() != "abcdefg345%^&":
- print "lower() failed!"
- failures = failures+1
-
-if "abCDefG".upper() != "ABCDEFG":
- print "upper() failed!"
- failures = failures+1
-
-if "+_098abCDefG".upper() != "+_098ABCDEFG":
- print "upper() failed!"
- failures = failures+1
-
-if "abCDefG".replace("CDe","456") != "ab456fG":
- print "replace() failed!"
- failures = failures+1
-
-if "abcdefg".capitalize() != "Abcdefg":
- print "capitalize() failed!"
- failures = failures+1
-
-if "a\tb\tcde".expandTabs() != "a b cde":
- print "expandtabs() failed!"
- failures = failures+1
-
-if " \t \r\n abc".lStrip() != "abc":
- print "lstrip() failed!"
- failures = failures+1
-
-if "abc \t \r\n ".rStrip() != "abc":
- print "rstrip() failed!"
- failures = failures+1
-
-if " \t \r\n abc \t \r\n ".strip() != "abc":
- print "strip() failed!"
- failures = failures+1
-
-if ".a.bc.def.ghij.".split('.') != ['', 'a', 'bc', 'def', 'ghij', '']:
- print "split() failed!"
- failures = failures+1
-
-if "a.bc.def.ghij".split('.') != ['a', 'bc', 'def', 'ghij']:
- print "split() failed!"
- failures = failures+1
-
-if "a.bc.def.ghij.".split('.') != ['a', 'bc', 'def', 'ghij', '']:
- print "split() failed!"
- failures = failures+1
-
-if "..a.bc.def.ghij.".split('.') != ['', '', 'a', 'bc', 'def', 'ghij', '']:
- print "split() failed!"
- failures = failures+1
-
-if "a.bc.def.ghij".split('a') != ['', '.bc.def.ghij']:
- print "split() failed!"
- failures = failures+1
-
-if "a.ab.abc.abcd".split('a') != ['', '.', 'b.', 'bc.', 'bcd']:
- print "split() failed!"
- failures = failures+1
-
-if ".a.ab.abc.abcd".split('a') != ['.', '.', 'b.', 'bc.', 'bcd']:
- print "split() failed!"
- failures = failures+1
-
-if ".a.ab.abc.abcd.".split('a') != ['.', '.', 'b.', 'bc.', 'bcd.']:
- print "split() failed!"
- failures = failures+1
-
-if "aaaaabaacaadaaaaabaacaad".split("aab") != ["aaa","aacaadaaa","aacaad"]:
- print "split() failed!"
- failures = failures+1
-
-if "aaaaabaacaadaaaaabaacaad".find("aab",0) != 3:
- print "split() failed!"
- failures = failures+1
-
-s = "%d" % 3333
-
-if s != '3333':
- print 'error 2'
- print s
- failures = failures+1
-
-if failures==0:
- print '\nall tests passed\n'
-else:
- print "%d failure(s) occurred!\n"%failures
- Sys.exit(1)
+Bytes([9999999999999999999999999999999999999999999])
\ No newline at end of file
Modified: trunk/src/builtins-bytes.c
===================================================================
--- trunk/src/builtins-bytes.c 2004-06-10 07:23:26 UTC (rev 594)
+++ trunk/src/builtins-bytes.c 2004-06-10 19:29:04 UTC (rev 595)
@@ -138,7 +138,6 @@
char* encoding_str;
int latin = FALSE;
u8_t* buf;
-
STRING_PARAM(2, encoding_str);
if (!strcmp(encoding_str, "latin-1"))
latin = TRUE;
@@ -159,6 +158,35 @@
pr_str2bytes(ist, buf, parms[1], latin);
self->immutable = TRUE;
return OBJ(NONE);
+ } else if (has_proto(ist, parms[1], OBJ(LIST_PROTO))) {
+ obj_p list = parms[1];
+ size_t i, len = list_len(ist, list);
+ u8_t* bufp;
+ if (len <= IMM_DATA_LEN) {
+ SET_TYPE_IF_EXC(OBJ(BYTES_PROTO), self, DATA_TYPE_IMMDATA) return NULL;
+ self->imm_data_len = (int) len;
+ bufp = self->data.bytes;
+ } else {
+ obj_byt = obj_malloc(ist, OBJ(BYTES_PROTO), self, sizeof(byt_t)+len); if_exc_return NULL;
+ obj_byt->len = (data_size_t) len;
+ bufp = &(obj_byt->byt[0]);
+ }
+ for(i=0; i < len; i++) {
+ i32_t val;
+ obj_p item = list_item(ist, list, (int) i);
+ if (!has_proto(ist, item, OBJ(INT_PROTO))) {
+ raise_exception(ist, OBJ(VALUE_EXC), "list item must be an integer");
+ return NULL;
+ }
+ val = int2i32t(ist, item); if_exc_return NULL;
+ if (val < 0 || val > 255) {
+ raise_exception(ist, OBJ(VALUE_EXC), "invalid byte value(%d)", val);
+ return NULL;
+ }
+ *(bufp++) = (u8_t) val;
+ }
+ self->immutable = TRUE;
+ return OBJ(NONE);
} else if (has_proto(ist, parms[1], OBJ(BYTES_PROTO))) {
return copy_object(ist, parms[1]);
} else {
Modified: trunk/src/builtins-int.c
===================================================================
--- trunk/src/builtins-int.c 2004-06-10 07:23:26 UTC (rev 594)
+++ trunk/src/builtins-int.c 2004-06-10 19:29:04 UTC (rev 595)
@@ -246,7 +246,7 @@
}
/* Create a new long int object from a C double */
-long_p double2longp(double dval) {
+long_p double2longp(isp ist, double dval) {
long_p v;
double frac;
int i, ndig, expo, neg;
@@ -282,7 +282,7 @@
/* Get a C long int from a long int object.
Returns -1 and sets an error condition if overflow occurs. */
-i64_t longp2int64(long_p vv) {
+i64_t longp2int64(isp ist, long_p vv) {
/* This version by Tim Peters */
register long_p v;
u64_t x, prev;
@@ -317,7 +317,42 @@
return -1;
}
-size_t _PyLong_NumBits(long_p vv)
+i32_t longp2int32(isp ist, long_p vv) {
+ /* This version by Tim Peters */
+ register long_p v;
+ u64_t x, prev;
+ int i, sign;
+
+ v = (long_p) vv;
+ i = v->dsize;
+ sign = 1;
+ x = 0;
+ if (i < 0) {
+ sign = -1;
+ i = -(i);
+ }
+ while (--i >= 0) {
+ prev = x;
+ x = (x << SHIFT) + v->digit[i];
+ if ((x >> SHIFT) != prev)
+ goto overflow;
+ }
+ /* Haven't lost any bits, but if the sign bit is set we're in
+ * trouble *unless* this is the min negative number. So,
+ * trouble iff sign bit set && (positive || some bit set other
+ * than the sign bit).
+ */
+ if ((i32_t) x < 0 && (sign > 0 || (x << 1) != 0))
+ goto overflow;
+ return (i32_t) x * sign;
+
+ overflow:
+ raise_exception(ist, OBJ(OVERFLOW_EXC),
+ "long int too large to convert to int");
+ return -1;
+}
+
+size_t _PyLong_NumBits(isp ist, long_p vv)
{
long_p v = (long_p)vv;
size_t result = 0;
@@ -397,7 +432,7 @@
/* Get a C double from a long int object. */
-double PyLong_AsDouble(long_p vv)
+double PyLong_AsDouble(isp ist, long_p vv)
{
int e;
double x;
@@ -684,7 +719,7 @@
* The point to this routine is that it takes time linear in the number of
* string characters.
*/
-static long_p long_from_binary_base(char **str, int base) {
+static long_p long_from_binary_base(isp ist, char **str, int base) {
char *p = *str;
char *start = p;
int bits_per_char;
@@ -765,7 +800,7 @@
return long_normalize(z);
}
-long_p PyLong_FromString(char *str, char **pend, int base)
+long_p cstr2longp(isp ist, char *str, char **pend, int base)
{
int sign = 1;
char *start, *orig_str = str;
@@ -798,7 +833,7 @@
str += 2;
start = str;
if ((base & (base - 1)) == 0)
- z = long_from_binary_base(&str, base);
+ z = long_from_binary_base(ist, &str, base);
else {
z = new_longp_non_init(0);
for ( ; z != NULL; ++str) {
@@ -842,7 +877,7 @@
}
#ifdef Py_USING_UNICODE
-long_p PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
+long_p PyLong_FromUnicode(isp ist, Py_UNICODE *u, int length, int base)
{
long_p result;
char *buffer = PyMem_MALLOC(length+1);
@@ -854,21 +889,18 @@
PyMem_FREE(buffer);
return NULL;
}
- result = PyLong_FromString(buffer, NULL, base);
+ result = cstr2longp(ist, buffer, NULL, base);
PyMem_FREE(buffer);
return result;
}
#endif
/* forward */
-static long_p x_divrem
- (long_p, long_p, long_p *);
-static int long_divrem(long_p, long_p,
- long_p *, long_p *);
+static long_p x_divrem(long_p, long_p, long_p *);
/* Long division with remainder, top-level routine */
-static int long_divrem(long_p a, long_p b, long_p *pdiv, long_p *prem) {
+static int long_divrem(isp ist, long_p a, long_p b, long_p *pdiv, long_p *prem) {
int size_a = abs(a->dsize), size_b = abs(b->dsize);
long_p z;
@@ -1533,11 +1565,11 @@
have different signs. We then subtract one from the 'div'
part of the outcome to keep the invariant intact. */
-static int l_divmod(long_p v, long_p w, long_p *pdiv, long_p *pmod)
+static int l_divmod(isp ist, long_p v, long_p w, long_p *pdiv, long_p *pmod)
{
long_p div, mod;
- if (long_divrem(v, w, &div, &mod) < 0)
+ if (long_divrem(ist, v, w, &div, &mod) < 0)
return -1;
if ((mod->dsize < 0 && w->dsize > 0) ||
(mod->dsize > 0 && w->dsize < 0)) {
@@ -1573,7 +1605,7 @@
CONVERT_BINOP(v, w, &a, &b);
- if (l_divmod(a, b, &div, &mod) < 0) {
+ if (l_divmod(ist, a, b, &div, &mod) < 0) {
pr_free(a);
pr_free(b);
return NULL;
@@ -1584,13 +1616,13 @@
return (long_p) div;
}
-static long_p long_mod(long_p v, long_p w)
+static long_p long_mod(isp ist, long_p v, long_p w)
{
long_p a, b, div, mod;
CONVERT_BINOP(v, w, &a, &b);
- if (l_divmod(a, b, &div, &mod) < 0) {
+ if (l_divmod(ist, a, b, &div, &mod) < 0) {
pr_free(a);
pr_free(b);
return NULL;
@@ -1603,7 +1635,7 @@
// w must be positive
// handle negative using floats without calling this
-static long_p long_pow(long_p v, long_p w, long_p x)
+static long_p long_pow(isp ist, long_p v, long_p w, long_p x)
{
long_p a, b;
long_p c;
@@ -1630,7 +1662,7 @@
if (bi & 1) {
temp = (long_p)long_mul(z, a);
if (c && temp!=NULL) {
- if (l_divmod(temp,(long_p)c,
+ if (l_divmod(ist, temp,(long_p)c,
&div,&mod) < 0) {
pr_free(temp);
pr_free(z);
@@ -1651,7 +1683,7 @@
break;
temp = (long_p)long_mul(a, a);
if (c && temp!=NULL) {
- if (l_divmod(temp, (long_p)c, &div,
+ if (l_divmod(ist, temp, (long_p)c, &div,
&mod) < 0) {
pr_free(temp);
pr_free(z);
@@ -1674,7 +1706,7 @@
break;
}
if (c && z!=NULL) {
- if (l_divmod(z, (long_p)c, &div, &mod) < 0) {
+ if (l_divmod(ist, z, (long_p)c, &div, &mod) < 0) {
// pr_free(z);
z = NULL;
}
@@ -1691,7 +1723,7 @@
return (long_p) z;
}
-static long_p long_invert(long_p v)
+static long_p long_invert(isp ist, long_p v)
{
/* Implement ~x as -(x+1) */
long_p x;
@@ -1707,7 +1739,7 @@
return (long_p)x;
}
-static long_p long_rshift(long_p v, long_p w) {
+static long_p long_rshift(isp ist, long_p v, long_p w) {
long_p a, b;
long_p z = NULL;
i64_t shiftby, newsize, wordshift, loshift, hishift;
@@ -1719,19 +1751,19 @@
if (a->dsize < 0) {
/* Right shifting negative numbers is harder */
long_p a1, a2;
- a1 = (long_p) long_invert(a);
+ a1 = (long_p) long_invert(ist, a);
if (a1 == NULL)
goto rshift_error;
- a2 = (long_p) long_rshift(a1, b);
+ a2 = (long_p) long_rshift(ist, a1, b);
pr_free(a1);
if (a2 == NULL)
goto rshift_error;
- z = (long_p) long_invert(a2);
+ z = (long_p) long_invert(ist, a2);
pr_free(a2);
}
else {
- shiftby = longp2int64((long_p)b);
+ shiftby = longp2int64(ist, (long_p)b);
if (shiftby < 0) {
raise_exception(ist, OBJ(VALUE_EXC),
"negative shift count");
@@ -1769,7 +1801,7 @@
}
-static long_p long_lshift(long_p v, long_p w)
+static long_p long_lshift(isp ist, long_p v, long_p w)
{
/* This version due to Tim Peters */
long_p a, b;
@@ -1780,7 +1812,7 @@
CONVERT_BINOP(v, w, &a, &b);
- shiftby = longp2int64((long_p)b);
+ shiftby = longp2int64(ist, (long_p)b);
if (shiftby < 0) {
raise_exception(ist, OBJ(VALUE_EXC), "negative shift count");
goto lshift_error;
@@ -1825,7 +1857,7 @@
/* Bitwise and/xor/or operations */
-static long_p long_bitwise(long_p a, int op, /* '&', '|', '^' */ long_p b)
+static long_p long_bitwise(isp ist, long_p a, int op, /* '&', '|', '^' */ long_p b)
{
digit maska, maskb; /* 0 or MASK */
int negz;
@@ -1836,7 +1868,7 @@
long_p v;
if (a->dsize < 0) {
- a = (long_p) long_invert(a);
+ a = (long_p) long_invert(ist, a);
maska = MASK;
}
else {
@@ -1844,7 +1876,7 @@
maska = 0;
}
if (b->dsize < 0) {
- b = (long_p) long_invert(b);
+ b = (long_p) long_invert(ist, b);
maskb = MASK;
}
else {
@@ -1915,38 +1947,38 @@
z = long_normalize(z);
if (negz == 0)
return (long_p) z;
- v = long_invert(z);
+ v = long_invert(ist, z);
pr_free(z);
return v;
}
-static long_p long_and(long_p v, long_p w) {
+static long_p long_and(isp ist, long_p v, long_p w) {
long_p a, b;
long_p c;
CONVERT_BINOP(v, w, &a, &b);
- c = long_bitwise(a, '&', b);
+ c = long_bitwise(ist, a, '&', b);
pr_free(a);
pr_free(b);
return c;
}
-static long_p long_xor(long_p v, long_p w)
+static long_p long_xor(isp ist, long_p v, long_p w)
{
long_p a, b;
long_p c;
CONVERT_BINOP(v, w, &a, &b);
- c = long_bitwise(a, '^', b);
+ c = long_bitwise(ist, a, '^', b);
pr_free(a);
pr_free(b);
return c;
}
-static long_p long_or(long_p v, long_p w)
+static long_p long_or(isp ist, long_p v, long_p w)
{
long_p a, b;
long_p c;
CONVERT_BINOP(v, w, &a, &b);
- c = long_bitwise(a, '|', b);
+ c = long_bitwise(ist, a, '|', b);
pr_free(a);
pr_free(b);
return c;
@@ -1989,10 +2021,16 @@
raise_exception(ist, OBJ(INTERNAL_EXC),
"object has wrong binary data, expected Integer");
return 0; }
- if (self->data_type == DATA_TYPE_IMMDATA)
+ if (self->data_type == DATA_TYPE_IMMDATA) {
+ if ( self->data.i64 > ((i64_t) 0x7fffffff) ||
+ self->data.i64 < -((i64_t) 0x80000000) ) {
+ raise_exception(ist, OBJ(OVERFLOW_EXC),
+ "integer too large to convert");
+ return 0;
+ }
return (i32_t) self->data.i64;
- else
- return (i32_t) longp2int64(self->data.ptr);
+ } else
+ return longp2int32(ist, self->data.ptr);
}
i64_t int2i64t(isp ist, obj_p self) {
@@ -2005,9 +2043,9 @@
"object has wrong binary data, expected Integer");
return 0; }
if (self->data_type == DATA_TYPE_IMMDATA)
- return (i32_t) self->data.i64;
+ return self->data.i64;
else
- return longp2int64(self->data.ptr);
+ return longp2int64(ist, self->data.ptr);
}
// ***************************** INT MODULE ***********************************
@@ -2227,7 +2265,7 @@
b = new_longp(other->data.i64);
else
b = other->data.ptr;
- return new_int_long_obj(ist, long_mod(a,b));
+ return new_int_long_obj(ist, long_mod(ist, a,b));
}
}
@@ -2318,7 +2356,7 @@
b = new_longp(other->data.i64);
else
b = other->data.ptr;
- return new_int_long_obj(ist, long_pow(a, b, NULL));
+ return new_int_long_obj(ist, long_pow(ist, a, b, NULL));
}
DEF(Int, cmp, FORM_RPARAM){
@@ -2385,7 +2423,7 @@
if ( self->data_type == DATA_TYPE_IMMDATA)
return NEW_INT( ~ int_imm_value(self) );
else
- return new_int_long_obj(ist, long_invert(self->data.ptr));
+ return new_int_long_obj(ist, long_invert(ist, self->data.ptr));
}
DEF(Int, xor_, FORM_RPARAM) {
@@ -2408,7 +2446,7 @@
b = new_longp(other->data.i64);
else
b = other->data.ptr;
- return new_int_long_obj(ist, long_xor(a, b));
+ return new_int_long_obj(ist, long_xor(ist, a, b));
}
}
@@ -2432,7 +2470,7 @@
b = new_longp(other->data.i64);
else
b = other->data.ptr;
- return new_int_long_obj(ist, long_and(a, b));
+ return new_int_long_obj(ist, long_and(ist, a, b));
}
}
@@ -2456,7 +2494,7 @@
b = new_longp(other->data.i64);
else
b = other->data.ptr;
- return new_int_long_obj(ist, long_or(a, b));
+ return new_int_long_obj(ist, long_or(ist, a, b));
}
}
@@ -2484,7 +2522,7 @@
b = new_longp(other->data.i64);
else
b = other->data.ptr;
- return new_int_long_obj(ist, long_rshift(a, b));
+ return new_int_long_obj(ist, long_rshift(ist, a, b));
}
}
@@ -2512,7 +2550,7 @@
b = new_longp(other->data.i64);
else
b = other->data.ptr;
- return new_int_long_obj(ist, long_lshift(a, b));
+ return new_int_long_obj(ist, long_lshift(ist, a, b));
}
}
Modified: trunk/src/object.h
===================================================================
--- trunk/src/object.h 2004-06-10 07:23:26 UTC (rev 594)
+++ trunk/src/object.h 2004-06-10 19:29:04 UTC (rev 595)
@@ -144,7 +144,7 @@
obj_p new_hash_obj(isp ist, i32_t num);
obj_p new_int_obj(isp ist, i64_t num);
obj_p new_int_long_obj(isp ist, long_p longp);
-long_p PyLong_FromString(char *str, char **pend, int base);
+long_p cstr2longp(isp ist, char *str, char **pend, int base);
obj_p long_format(long_p aa, int base, int addL);\
long_p new_longp(i64_t ival);
int int_is_zero(obj_p obj);
Modified: trunk/src/prothon.y
===================================================================
--- trunk/src/prothon.y 2004-06-10 07:23:26 UTC (rev 594)
+++ trunk/src/prothon.y 2004-06-10 19:29:04 UTC (rev 595)
@@ -73,6 +73,7 @@
#include <apr_strings.h>
#define state ((parse_state*) yylex_param)
+#define IST (((parse_state*) yylex_param)->ist)
#define TD new_string_obj(state->ist, "~")
@@ -992,9 +993,9 @@
str_ptr[str_index++]=0;
str_ptr = pr_realloc(str_ptr, str_index);
if (x_flag)
- lvalp->str_type = new_bytes_obj((((parse_state*) yylex_param)->ist), str_ptr, str_index-1);
+ lvalp->str_type = new_bytes_obj(IST, str_ptr, str_index-1);
else
- lvalp->str_type = new_string_n_obj((((parse_state*) yylex_param)->ist), str_ptr, str_index-1);
+ lvalp->str_type = new_string_n_obj(IST, str_ptr, str_index-1);
#ifdef TRACE_PARSER
if (trace_parser){
fprintf(((parse_state*) yylex_param)->debug_stream, "\"%s\"\n",str_ptr);
@@ -1160,7 +1161,7 @@
if (!strcmp(str_ptr,"yield")) return YIELD;
str_ptr = pr_realloc(str_ptr, str_index);
- lvalp->str_type = new_string_n_obj((((parse_state*) yylex_param)->ist), str_ptr, str_index-1);
+ lvalp->str_type = new_string_n_obj(IST, str_ptr, str_index-1);
#ifdef TRACE_PARSER
if (trace_parser){
fprintf(((parse_state*) yylex_param)->debug_stream, "\"%s\"\n",str_ptr);
@@ -1217,17 +1218,14 @@
ungetch(c, state);
str_ptr[str_index++] = 0;
if (hex_flag) {
- lvalp->int_type = new_int_long_obj( (((parse_state*) yylex_param)->ist),
- PyLong_FromString(str_ptr+2, NULL, 16) );
+ lvalp->int_type = new_int_long_obj( IST, cstr2longp(IST, str_ptr+2, NULL, 16) );
} else if (str_ptr[0] == '0' && strlen(str_ptr) > 2) {
- lvalp->int_type = new_int_long_obj( (((parse_state*) yylex_param)->ist),
- PyLong_FromString(str_ptr+1, NULL, 8) );
+ lvalp->int_type = new_int_long_obj( IST, cstr2longp(IST, str_ptr+1, NULL, 8) );
} else {
if (strlen(str_ptr) < 16)
- lvalp->int_type = new_int_obj((((parse_state*) yylex_param)->ist), apr_atoi64(str_ptr));
+ lvalp->int_type = new_int_obj(IST, apr_atoi64(str_ptr));
else
- lvalp->int_type = new_int_long_obj( (((parse_state*) yylex_param)->ist),
- PyLong_FromString(str_ptr, NULL, 10) );
+ lvalp->int_type = new_int_long_obj( IST, cstr2longp(IST, str_ptr, NULL, 10) );
}
if (nonzero_flag && int_is_zero(lvalp->int_type)){
printf("Lexical error: invalid integer number format\n");