home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / NEXTSTEP / UNIX / Programming / GDBbundle-1.0-MIS / src / TextEdit / GdbBundle.bproj / GdbValue.g < prev    next >
Encoding:
Text File  |  1997-05-10  |  11.1 KB  |  386 lines

  1. /* GdbValue.g
  2.  
  3.    Parse the values printed out by `info typed-arguments' GDB command.
  4.  
  5.    Author: Ovidiu Predescu
  6.    Sun 30-Mar-1997 
  7.  */
  8.  
  9. #header <<
  10. #import <Foundation/NSString.h>
  11.  
  12. #ifndef __Attrib_def__
  13. #define __Attrib_def__
  14. typedef id Attrib;
  15. #endif
  16.  
  17. #define USER_ZZSYN
  18. void zzcr_attr(Attrib* attr, int token, char* text);
  19. >>
  20.  
  21. <<
  22. #import <Foundation/NSArray.h>
  23. #import <Foundation/NSAutoreleasePool.h>
  24. #import <Foundation/NSValue.h>
  25. #import "Variable.h"
  26.  
  27. @implementation Variable (Parser)
  28.  
  29. // Class variables
  30. NSMutableString* gdbParserErrors;
  31. static const unsigned char* scannedString;
  32. static int length, position;
  33.  
  34. static int nextchar (void)
  35. {
  36.   if (position < length)
  37.     return scannedString[position++];
  38.   else
  39.     return -1;
  40. }
  41.  
  42. + (NSMutableArray*)variablesFromDescription:(NSString*)string
  43. {
  44.   id pool = [NSAutoreleasePool new];
  45.   id vars;
  46.  
  47.   gdbParserErrors = [NSMutableString new];
  48.  
  49.   scannedString = [string cString];
  50.   length = [string length];
  51.   position = 0;
  52.   ANTLRf(vars = variables(), nextchar);
  53.  
  54.   if([gdbParserErrors length]) {
  55.     NSLog (@"Errors were encountered during parsing of gdb output! Please "
  56.        @"submit this output as bug report:\nString to parse:\n%@\n\nError "
  57.        @"message:\n%@", string, gdbParserErrors);
  58.     [pool release];
  59.     return nil;
  60.   }
  61.  
  62.   [vars retain];
  63.   [pool release];
  64.   [gdbParserErrors autorelease];
  65.   [vars autorelease];
  66.  
  67. //  NSLog (@"variables = %@", vars);
  68.   return vars;
  69. }
  70.  
  71. @end
  72.  
  73. void zzcr_attr(Attrib* attr, int token, char* text)
  74. {
  75.   switch (token) {
  76.     case STRING:
  77.     case IDENTIFIER:
  78.     case FUNCTION_NAME:
  79.     case CHARACTER:
  80.     case OCTALINT:
  81.     case DECIMALINT:
  82.     case HEXADECIMALINT:
  83.     case FLOATONE:
  84.     case FLOATTWO:
  85.     case FLOATTHREE:
  86.       *attr = [NSString stringWithCString:text];
  87.       break;
  88.     default:
  89.       break;
  90.   }
  91. }
  92.  
  93. void zzsyn(char* text, int tok, char* egroup,
  94.     SetWordType* eset, int etok, int k, char*bad_text)
  95. {
  96.   extern id gdbParserErrors;
  97.  
  98.   [gdbParserErrors appendFormat:
  99.                       @"line %d: syntax error at \"%s\"",
  100.                       zzline, (tok == zzEOF_TOKEN) ? "EOF" : bad_text];
  101.   if(!etok && !eset) {
  102.     [gdbParserErrors appendString:@"\n"];
  103.     return;
  104.   }
  105.   if (k==1)
  106.     [gdbParserErrors appendString:@" missing"];
  107.   else {
  108.     [gdbParserErrors
  109.                 appendFormat:@"; \"%s\" not", bad_text];
  110.     if(zzset_deg(eset) > 1)
  111.       [gdbParserErrors appendString:@" in"];
  112.   }
  113.   if(zzset_deg(eset) > 0)
  114.     [gdbParserErrors appendString:zzedecode(eset)];
  115.   else
  116.     [gdbParserErrors appendFormat:@" %s", zztokens[etok]];
  117.   if(strlen(egroup) > 0)
  118.     [gdbParserErrors appendFormat:@" in %s", egroup];
  119.   [gdbParserErrors appendString:@"\n"];
  120. }
  121. >>
  122.  
  123. #lexaction <<
  124. >>
  125.  
  126. #lexclass STRING_CLASS
  127. #token STRING "\""    <<zzmode(START); zzreplstr("\"");>>
  128. #token "\\\""        <<zzmode(START); zzreplstr("\\\"");>>
  129. #token "[\1-\31]"    <<zzmore();>>
  130. #token "[\128-\254]"    <<zzmore();>>
  131. #token "~[\"]+"        <<zzmore();>>
  132.  
  133. #lexclass FUNCTION_NAME_CLASS
  134. #token FUNCTION_NAME "\>"    <<zzmode(START); zzreplstr(">");>>
  135. #token "~[\>]+"            <<zzmore();>>
  136.  
  137. #lexclass START
  138. #token "[\t\ ]+"    <<zzskip();>>
  139. #token "\n"        <<zzline++; zzskip();>>
  140. #token Eof "@"
  141. #token "\""        <<{zzmore(); zzmode(STRING_CLASS);}>>
  142. #token "\<"        <<zzmore(); zzmode(FUNCTION_NAME_CLASS);>>
  143.  
  144. #token LCURLYBRACE "\{"
  145. #token RCURLYBRACE "\}"
  146. #token LSQUAREBRACKET "\["
  147. #token RSQUAREBRACKET "\]"
  148. #token LPARENTHESIS "\("
  149. #token RPARENTHESIS "\)"
  150. #token DOUBLECOLON "::"
  151. #token SEMICOLON ";"
  152. #token EQUAL "="
  153. #token STAR "\*"
  154. #token AMPERSAND "&"
  155. #token COMMA ","
  156. #token LESSTHAN "<"
  157. #token GREATERTHAN "\>"
  158. #token DOTS "..."
  159.  
  160. #token CONST "const"
  161. #token VOLATILE "volatile"
  162. #token UNSIGNED "unsigned"
  163. #token CHAR "char"
  164. #token SHORT "short"
  165. #token INT "int"
  166. #token LONG "long"
  167. #token FLOAT "float"
  168. #token DOUBLE "double"
  169. #token STRUCT "struct"
  170. #token UNION "union"
  171. #token ENUM "enum"
  172. #token CLASS "class"
  173. #token VOID "void"
  174. #token NO_ARGUMENTS "No\ arguments\."
  175. #token NO_LOCALS "No\ locals\."
  176. #token NO_SYMBOL_TABLE "No\ symbol\ table\ info\ available\."
  177.  
  178. #token IDENTIFIER          "[a-zA-Z_$]([a-zA-Z0-9_$])*"
  179. #token CHARACTER    "\'~[\']*\'"
  180. #token OCTALINT "{[\+\-]}0[0-7]*{[uUlL]}"
  181. #token DECIMALINT "{[\+\-]}[1-9][0-9]*{[uUlL]}"
  182. #token HEXADECIMALINT "{[\+\-]}(0x|0X)[0-9a-fA-F]+{[uUlL]}"
  183. #token FLOATONE "{[\+\-]}([0-9]+.[0-9]* | [0-9]*.[0-9]+) {[eE]{[\-\+]}[0-9]+}"
  184. #token FLOATTWO "{[\+\-]}[0-9]+ [eE]{[\-\+]}[0-9]+"
  185. #token FLOATTHREE "{[\+\-]}[nN]a[nN]\((0x|0X)[0-9a-fA-F]+\)"
  186.  
  187. variables > [id vars]:
  188.     <<id var; $vars = [NSMutableArray array];>>
  189.     {NO_ARGUMENTS} {NO_LOCALS} (NO_SYMBOL_TABLE)*
  190.     (variable > [var] <<[$vars addObject:var];>>)*
  191. ;
  192. variable > [id var]:
  193.     <<id value; $var = [[Variable new] autorelease];>>
  194.     (  name:IDENTIFIER <<[$var setName:$name];>>
  195.      | class_id:CLASS <<[$var setName:@"class"];>>)
  196.     EQUAL typed_value > [value] <<[$var setValue:value];>>
  197. ;
  198. typed_value > [id value]:
  199.     <<id t; $value = nil;>>
  200.     LPARENTHESIS type > [t] RPARENTHESIS value[t] > [$value]
  201.     <<[$value setType:t];>>
  202. ;
  203. type > [id ptypeObj]:
  204.     <<$ptypeObj = nil;>>
  205.     ptype > [$ptypeObj]
  206.     {DOUBLECOLON STAR <<[[$ptypeObj typeName] appendString:@"::* "];>>}
  207. ;
  208. ptype > [id type]:
  209.     <<$type = nil;>>
  210.       typebase > [$type]
  211.       { { CONST <<[[$type typeName] appendString:@"const "];>>
  212.         | VOLATILE <<[[$type typeName] appendString:@"volatile "];>>
  213.         } abs_decl[$type] }
  214. ;
  215. abs_decl[id type]:
  216.       (STAR <<[[$type typeName] appendString:@"*"];
  217.           [$type setTypeKind:kPointer];
  218.         >>
  219.       | AMPERSAND <<[[$type typeName] appendString:@"&"];
  220.             [$type setTypeKind:kPointer];
  221.               >>
  222.       ) {abs_decl[$type]}
  223.     | direct_abs_decl[$type]
  224. ;
  225. direct_abs_decl[id type]:
  226.       LPARENTHESIS <<[[$type typeName] appendString:@"("];>>
  227.       abs_decl[$type]
  228.       RPARENTHESIS <<[[$type typeName] appendString:@")"];>>
  229.       rest_of_direct_abs_decl[$type]
  230.     | array_mod[$type] rest_of_direct_abs_decl[$type]
  231.     | func_mod[$type] rest_of_direct_abs_decl[$type]
  232. ;
  233. rest_of_direct_abs_decl[id type]:
  234.       direct_abs_decl[$type]
  235.     | /* empty */
  236. ;
  237. array_mod[id type]:
  238.     <<id num;>>
  239.     LSQUAREBRACKET <<[[$type typeName] appendString:@"["];>>
  240.     { int_number[$type] > [num]
  241.       <<[[$type typeName] appendString:[num stringValue]];>>}
  242.     RSQUAREBRACKET <<[[$type typeName] appendString:@"]"];>>
  243.     <<[$type setTypeKind:kArray];>>
  244. ;
  245. func_mod[id typeObj]:
  246.     <<id funcType;>>
  247.     LPARENTHESIS
  248.     { type > [funcType]
  249.       <<[[$typeObj typeName] appendString:[funcType typeName]];>>
  250.       (COMMA type > [funcType]
  251.        <<[[$typeObj typeName] appendString:[funcType typeName]];>>)*}
  252.     RPARENTHESIS
  253. ;
  254. typebase > [id type]:
  255.     <<id string = [NSMutableString string];
  256.       id synType;
  257.       $type = [[Type new] autorelease];
  258.       [$type setTypeName:string];
  259.     >>
  260.  
  261.       {UNSIGNED <<[string appendString:@"unsigned "];>>}
  262.       ( (LONG <<[string appendString:@"long "];
  263.             [$type setScalarTypeKind:kLong];
  264.           >>
  265.          {UNSIGNED <<[string appendString:@"unsigned "];>>}
  266.          { INT <<[string appendString:@"int "];
  267.              [$type setScalarTypeKind:kInt];
  268.            >>
  269.          | (LONG <<[string appendString:@"long "];
  270.                [$type setScalarTypeKind:kLong];
  271.              >>
  272.         {INT <<[string appendString:@"int "];>>})})
  273.        | INT <<[string appendString:@"int "];
  274.            [$type setScalarTypeKind:kInt];
  275.          >>
  276.        | (SHORT <<[string appendString:@"short "];
  277.               [$type setScalarTypeKind:kShort];
  278.             >>
  279.           {UNSIGNED <<[string appendString:@"unsigned "];>>}
  280.           {INT <<[string appendString:@"int "];>>})
  281.        | CHAR <<[string appendString:@"char "];
  282.             [$type setScalarTypeKind:kChar];
  283.           >>)
  284.       <<[$type setTypeKind:kScalar];>>
  285.     | FLOAT
  286.       <<[string appendString:@"float "];
  287.         [$type setTypeKind:kScalar]; [$type setScalarTypeKind:kFloat];
  288.       >>
  289.     | DOUBLE
  290.       <<[string appendString:@"double "];
  291.         [$type setTypeKind:kScalar]; [$type setScalarTypeKind:kDouble];
  292.       >>
  293.     | STRUCT <<[string appendString:@"struct "];>>
  294.       ( identifier > [synType] <<[string appendString:synType];>>
  295.       | LCURLYBRACE <<[string appendString:@"{ "];>>
  296.         (type>[synType] <<[string appendString:[synType typeName]];>>
  297.          identifier>[synType] <<[string appendString:synType];>>
  298.          {array_mod[$type]} SEMICOLON <<[string appendString:@"; "];>>)+
  299.         RCURLYBRACE <<[string appendString:@"}"];>>)
  300.       <<[$type setTypeKind:kStructure];>>
  301.     | CLASS identifier > [synType]
  302.       <<[string appendString:@"struct "];
  303.         [string appendString:synType];
  304.         [$type setTypeKind:kClass];
  305.       >>
  306.     | UNION <<[string appendString:@"union "];>>
  307.       ( identifier > [synType] <<[string appendString:synType];>>
  308.       | LCURLYBRACE <<[string appendString:@"{ "];>>
  309.         (type>[synType] <<[string appendString:[synType typeName]];>>
  310.          identifier>[synType] <<[string appendString:synType];>>
  311.          {array_mod[$type]} SEMICOLON <<[string appendString:@"; "];>>)+
  312.         RCURLYBRACE <<[string appendString:@"}"];>>)
  313.       <<[$type setTypeKind:kUnion];>>
  314.     | ENUM <<[string appendString:@"enum "];>>
  315.       ( identifier > [synType] <<[string appendString:synType];>>
  316.       | LCURLYBRACE <<[string appendString:@"{ "];>>
  317.         identifier>[synType] <<[string appendString:synType];>>
  318.         (COMMA <<[string appendString:@", "];>>
  319.          identifier>[synType] <<[string appendString:synType];>>)*
  320.         RCURLYBRACE <<[string appendString:@"}"];>>)
  321.       <<[$type setTypeKind:kEnum];>>
  322.     | ( CONST <<[string appendString:@"const "];>>
  323.        |VOLATILE <<[string appendString:@"volatile "];>>)
  324.       typebase > [synType]
  325.       <<[string appendString:[synType typeName]];
  326.         [synType setTypeName:string];
  327.         $type = synType;
  328.       >>
  329.     | VOID <<[string appendString:@"void "]; [$type setTypeKind:kVoid];>>
  330. ;
  331. value[id type] > [id valueObj]:
  332.     <<id num, string, synType; $valueObj = nil;>>
  333.       number[$type] > [num] <<$valueObj = num;>>
  334.       {descriptive_value > [string] <<[$valueObj setDescription:string];>>}
  335.     | identifier > [synType]
  336.       <<$valueObj = [[[$type valueClass] new] autorelease];
  337.         [$valueObj setStringValue:synType];
  338.       >>
  339.     | <<NSMutableArray* array = [NSMutableArray array];
  340.         $valueObj = [[[$type valueClass] new] autorelease];
  341.       >>
  342.       compound_value[array] <<[$valueObj setArrayValue:array];>>
  343. ;
  344. descriptive_value > [id description]:
  345.     <<$description = nil;>>
  346.       d1:CHARACTER        <<$description = $d1;>>
  347.     | d2:STRING        <<$description = $d2;>>
  348.     | d3:FUNCTION_NAME    <<$description = $d3;>>
  349. ;
  350. number[id type] > [id value]:
  351.     <<$value = nil;>>
  352.       n1:FLOATONE    <<$value = [SimpleValue numberWithString:$n1];>>
  353.     | n2:FLOATTWO    <<$value = [SimpleValue numberWithString:$n2];>>
  354.     | n3:FLOATTHREE    <<$value = [SimpleValue numberWithString:$n3];>>
  355.     | n4:STRING    <<$value = [SimpleValue numberWithString:$n4];>>
  356.     | int_number[$type] > [$value]
  357. ;
  358. int_number[id type] > [id value]:
  359.     <<id numberString; $value = nil;>>
  360.     (  n1:OCTALINT    <<numberString = $n1;>>
  361.      | n2:DECIMALINT <<numberString = $n2;>>
  362.      | n3:HEXADECIMALINT <<numberString = $n3;>>)
  363.     <<if ([type typeKind] == kPointer)
  364.         $value = [PointerValue pointerWithAddress:numberString];
  365.       else
  366.         $value = [SimpleValue numberWithString:numberString];
  367.     >>
  368. ;
  369. compound_value[id components]:
  370.     <<id val;>>
  371.     LCURLYBRACE
  372.       {(variable_or_typed_value > [val] <<[$components addObject:val];>>
  373.         (COMMA variable_or_typed_value > [val] <<[$components addObject:val];>>)*)
  374.        | DOTS}
  375.     RCURLYBRACE
  376. ;
  377. variable_or_typed_value > [id value]:
  378.     <<$value = nil;>>
  379.       variable > [$value]
  380.     | typed_value > [$value]
  381. ;
  382. identifier > [id name]:
  383.       name1:IDENTIFIER    <<$name=$name1;>>
  384.     | name2:CLASS        <<$name=$name2;>>
  385. ;
  386.