Browse Source

introduce ulong token type to better support hex numbers appearing in egg files

David Rose 23 years ago
parent
commit
212bd64d9d
3 changed files with 33 additions and 10 deletions
  1. 4 5
      panda/src/egg/lexer.lxx
  2. 28 5
      panda/src/egg/parser.yxx
  3. 1 0
      panda/src/egg/parserDefs.h

+ 4 - 5
panda/src/egg/lexer.lxx

@@ -275,7 +275,6 @@ eat_c_comment() {
 }
 }
 
 
 
 
-
 // accept() is called below as each piece is pulled off and
 // accept() is called below as each piece is pulled off and
 // accepted by the lexer; it increments the current column number.
 // accepted by the lexer; it increments the current column number.
 INLINE void accept() {
 INLINE void accept() {
@@ -658,17 +657,17 @@ NUMERIC         ([+-]?(([0-9]+[.]?)|([0-9]*[.][0-9]+))([eE][+-]?[0-9]+)?)
 {HEX} {
 {HEX} {
   // A hexadecimal integer number.
   // A hexadecimal integer number.
   accept(); 
   accept(); 
-  eggyylval._number = strtoul(yytext+2, NULL, 16);
+  eggyylval._ulong = strtoul(yytext+2, NULL, 16);
   eggyylval._string = yytext;
   eggyylval._string = yytext;
-  return NUMBER; 
+  return ULONG; 
 }
 }
 
 
 {BINARY} {
 {BINARY} {
   // A binary integer number.
   // A binary integer number.
   accept(); 
   accept(); 
-  eggyylval._number = strtoul(yytext+2, NULL, 2);
+  eggyylval._ulong = strtoul(yytext+2, NULL, 2);
   eggyylval._string = yytext;
   eggyylval._string = yytext;
-  return NUMBER; 
+  return ULONG; 
 }
 }
 
 
 "nan"{HEX} {
 "nan"{HEX} {

+ 28 - 5
panda/src/egg/parser.yxx

@@ -111,6 +111,7 @@ egg_cleanup_parser() {
 %}
 %}
 
 
 %token <_number> NUMBER
 %token <_number> NUMBER
+%token <_ulong> ULONG
 %token <_string> STRING
 %token <_string> STRING
 
 
 %token BEZIERCURVE BFACE BILLBOARD BILLBOARDCENTER BUNDLE CLOSED
 %token BEZIERCURVE BFACE BILLBOARD BILLBOARDCENTER BUNDLE CLOSED
@@ -862,6 +863,7 @@ group_body:
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
   string name = $3;
   string name = $3;
   double value = $<_number>5;
   double value = $<_number>5;
+  unsigned long ulong_value = $<_ulong>5;
   string strval = $<_string>5;
   string strval = $<_string>5;
 
 
   if (cmp_nocase_uh(name, "fps") == 0) {
   if (cmp_nocase_uh(name, "fps") == 0) {
@@ -897,15 +899,15 @@ group_body:
       group->set_depth_test_mode(m);
       group->set_depth_test_mode(m);
     }
     }
   } else if (cmp_nocase_uh(name, "draw_order") == 0) {
   } else if (cmp_nocase_uh(name, "draw_order") == 0) {
-    group->set_draw_order((int)value);
+    group->set_draw_order(ulong_value);
   } else if (cmp_nocase_uh(name, "bin") == 0) {
   } else if (cmp_nocase_uh(name, "bin") == 0) {
     group->set_bin(strval);
     group->set_bin(strval);
   } else if (cmp_nocase_uh(name, "collide_mask") == 0) {
   } else if (cmp_nocase_uh(name, "collide_mask") == 0) {
-    group->set_collide_mask((int)value);
+    group->set_collide_mask(ulong_value);
   } else if (cmp_nocase_uh(name, "from_collide_mask") == 0) {
   } else if (cmp_nocase_uh(name, "from_collide_mask") == 0) {
-    group->set_from_collide_mask((int)value);
+    group->set_from_collide_mask(ulong_value);
   } else if (cmp_nocase_uh(name, "into_collide_mask") == 0) {
   } else if (cmp_nocase_uh(name, "into_collide_mask") == 0) {
-    group->set_into_collide_mask((int)value);
+    group->set_into_collide_mask(ulong_value);
   } else {
   } else {
     eggyywarning("Unknown group scalar " + name);
     eggyywarning("Unknown group scalar " + name);
   }
   }
@@ -2291,6 +2293,10 @@ string:
         NUMBER
         NUMBER
 {
 {
   $$ = $<_string>1;
   $$ = $<_string>1;
+}
+        | ULONG
+{
+  $$ = $<_string>1;
 }
 }
         | STRING
         | STRING
         ;
         ;
@@ -2344,24 +2350,37 @@ repeated_string_body:
  */
  */
 real:
 real:
         NUMBER
         NUMBER
+        | ULONG
+{
+  $$ = $1;
+}
         ;
         ;
 
 
 /*
 /*
  * real_or_string
  * real_or_string
  *
  *
  * enter: 
  * enter: 
- * exit: Returns a number as ($<_number>1) or a string (as $<_string>1).
+ * exit: Returns a number as ($<_number>1) or as an unsigned long
+ * ($<_ulong>1) or a string (as $<_string>1).
  *
  *
  */
  */
 real_or_string:
 real_or_string:
         NUMBER
         NUMBER
 {
 {
   $<_number>$ = $1;
   $<_number>$ = $1;
+  $<_ulong>$ = (unsigned long)$1;
+  $<_string>$ = $<_string>1;
+}
+        | ULONG
+{
+  $<_number>$ = $1;
+  $<_ulong>$ = $1;
   $<_string>$ = $<_string>1;
   $<_string>$ = $<_string>1;
 }
 }
         | STRING
         | STRING
 {
 {
   $<_number>$ = 0.0;
   $<_number>$ = 0.0;
+  $<_ulong>$ = 0;
   $<_string>$ = $1;
   $<_string>$ = $1;
 }
 }
         ;
         ;
@@ -2382,6 +2401,10 @@ integer:
     eggyywarning("Integer expected.");
     eggyywarning("Integer expected.");
     $$ = (double)i;
     $$ = (double)i;
   }
   }
+}
+        | ULONG
+{
+  $$ = $1;
 }
 }
         ;
         ;
 
 

+ 1 - 0
panda/src/egg/parserDefs.h

@@ -46,6 +46,7 @@ void egg_cleanup_parser();
 class EXPCL_PANDAEGG EggTokenType {
 class EXPCL_PANDAEGG EggTokenType {
 public:
 public:
   double _number;
   double _number;
+  unsigned long _ulong;
   string _string;
   string _string;
   PT(EggObject) _egg;
   PT(EggObject) _egg;
   PTA_double _number_list;
   PTA_double _number_list;