home *** CD-ROM | disk | FTP | other *** search
- /* GdbValue.g
-
- Parse the values printed out by `info typed-arguments' GDB command.
-
- Author: Ovidiu Predescu
- Sun 30-Mar-1997
- */
-
- #header <<
- #import <Foundation/NSString.h>
-
- #ifndef __Attrib_def__
- #define __Attrib_def__
- typedef id Attrib;
- #endif
-
- #define USER_ZZSYN
- void zzcr_attr(Attrib* attr, int token, char* text);
- >>
-
- <<
- #import <Foundation/NSArray.h>
- #import <Foundation/NSAutoreleasePool.h>
- #import <Foundation/NSValue.h>
- #import "Variable.h"
-
- @implementation Variable (Parser)
-
- // Class variables
- NSMutableString* gdbParserErrors;
- static const unsigned char* scannedString;
- static int length, position;
-
- static int nextchar (void)
- {
- if (position < length)
- return scannedString[position++];
- else
- return -1;
- }
-
- + (NSMutableArray*)variablesFromDescription:(NSString*)string
- {
- id pool = [NSAutoreleasePool new];
- id vars;
-
- gdbParserErrors = [NSMutableString new];
-
- scannedString = [string cString];
- length = [string length];
- position = 0;
- ANTLRf(vars = variables(), nextchar);
-
- if([gdbParserErrors length]) {
- NSLog (@"Errors were encountered during parsing of gdb output! Please "
- @"submit this output as bug report:\nString to parse:\n%@\n\nError "
- @"message:\n%@", string, gdbParserErrors);
- [pool release];
- return nil;
- }
-
- [vars retain];
- [pool release];
- [gdbParserErrors autorelease];
- [vars autorelease];
-
- // NSLog (@"variables = %@", vars);
- return vars;
- }
-
- @end
-
- void zzcr_attr(Attrib* attr, int token, char* text)
- {
- switch (token) {
- case STRING:
- case IDENTIFIER:
- case FUNCTION_NAME:
- case CHARACTER:
- case OCTALINT:
- case DECIMALINT:
- case HEXADECIMALINT:
- case FLOATONE:
- case FLOATTWO:
- case FLOATTHREE:
- *attr = [NSString stringWithCString:text];
- break;
- default:
- break;
- }
- }
-
- void zzsyn(char* text, int tok, char* egroup,
- SetWordType* eset, int etok, int k, char*bad_text)
- {
- extern id gdbParserErrors;
-
- [gdbParserErrors appendFormat:
- @"line %d: syntax error at \"%s\"",
- zzline, (tok == zzEOF_TOKEN) ? "EOF" : bad_text];
- if(!etok && !eset) {
- [gdbParserErrors appendString:@"\n"];
- return;
- }
- if (k==1)
- [gdbParserErrors appendString:@" missing"];
- else {
- [gdbParserErrors
- appendFormat:@"; \"%s\" not", bad_text];
- if(zzset_deg(eset) > 1)
- [gdbParserErrors appendString:@" in"];
- }
- if(zzset_deg(eset) > 0)
- [gdbParserErrors appendString:zzedecode(eset)];
- else
- [gdbParserErrors appendFormat:@" %s", zztokens[etok]];
- if(strlen(egroup) > 0)
- [gdbParserErrors appendFormat:@" in %s", egroup];
- [gdbParserErrors appendString:@"\n"];
- }
- >>
-
- #lexaction <<
- >>
-
- #lexclass STRING_CLASS
- #token STRING "\"" <<zzmode(START); zzreplstr("\"");>>
- #token "\\\"" <<zzmode(START); zzreplstr("\\\"");>>
- #token "[\1-\31]" <<zzmore();>>
- #token "[\128-\254]" <<zzmore();>>
- #token "~[\"]+" <<zzmore();>>
-
- #lexclass FUNCTION_NAME_CLASS
- #token FUNCTION_NAME "\>" <<zzmode(START); zzreplstr(">");>>
- #token "~[\>]+" <<zzmore();>>
-
- #lexclass START
- #token "[\t\ ]+" <<zzskip();>>
- #token "\n" <<zzline++; zzskip();>>
- #token Eof "@"
- #token "\"" <<{zzmore(); zzmode(STRING_CLASS);}>>
- #token "\<" <<zzmore(); zzmode(FUNCTION_NAME_CLASS);>>
-
- #token LCURLYBRACE "\{"
- #token RCURLYBRACE "\}"
- #token LSQUAREBRACKET "\["
- #token RSQUAREBRACKET "\]"
- #token LPARENTHESIS "\("
- #token RPARENTHESIS "\)"
- #token DOUBLECOLON "::"
- #token SEMICOLON ";"
- #token EQUAL "="
- #token STAR "\*"
- #token AMPERSAND "&"
- #token COMMA ","
- #token LESSTHAN "<"
- #token GREATERTHAN "\>"
- #token DOTS "..."
-
- #token CONST "const"
- #token VOLATILE "volatile"
- #token UNSIGNED "unsigned"
- #token CHAR "char"
- #token SHORT "short"
- #token INT "int"
- #token LONG "long"
- #token FLOAT "float"
- #token DOUBLE "double"
- #token STRUCT "struct"
- #token UNION "union"
- #token ENUM "enum"
- #token CLASS "class"
- #token VOID "void"
- #token NO_ARGUMENTS "No\ arguments\."
- #token NO_LOCALS "No\ locals\."
- #token NO_SYMBOL_TABLE "No\ symbol\ table\ info\ available\."
-
- #token IDENTIFIER "[a-zA-Z_$]([a-zA-Z0-9_$])*"
- #token CHARACTER "\'~[\']*\'"
- #token OCTALINT "{[\+\-]}0[0-7]*{[uUlL]}"
- #token DECIMALINT "{[\+\-]}[1-9][0-9]*{[uUlL]}"
- #token HEXADECIMALINT "{[\+\-]}(0x|0X)[0-9a-fA-F]+{[uUlL]}"
- #token FLOATONE "{[\+\-]}([0-9]+.[0-9]* | [0-9]*.[0-9]+) {[eE]{[\-\+]}[0-9]+}"
- #token FLOATTWO "{[\+\-]}[0-9]+ [eE]{[\-\+]}[0-9]+"
- #token FLOATTHREE "{[\+\-]}[nN]a[nN]\((0x|0X)[0-9a-fA-F]+\)"
-
- variables > [id vars]:
- <<id var; $vars = [NSMutableArray array];>>
- {NO_ARGUMENTS} {NO_LOCALS} (NO_SYMBOL_TABLE)*
- (variable > [var] <<[$vars addObject:var];>>)*
- ;
- variable > [id var]:
- <<id value; $var = [[Variable new] autorelease];>>
- ( name:IDENTIFIER <<[$var setName:$name];>>
- | class_id:CLASS <<[$var setName:@"class"];>>)
- EQUAL typed_value > [value] <<[$var setValue:value];>>
- ;
- typed_value > [id value]:
- <<id t; $value = nil;>>
- LPARENTHESIS type > [t] RPARENTHESIS value[t] > [$value]
- <<[$value setType:t];>>
- ;
- type > [id ptypeObj]:
- <<$ptypeObj = nil;>>
- ptype > [$ptypeObj]
- {DOUBLECOLON STAR <<[[$ptypeObj typeName] appendString:@"::* "];>>}
- ;
- ptype > [id type]:
- <<$type = nil;>>
- typebase > [$type]
- { { CONST <<[[$type typeName] appendString:@"const "];>>
- | VOLATILE <<[[$type typeName] appendString:@"volatile "];>>
- } abs_decl[$type] }
- ;
- abs_decl[id type]:
- (STAR <<[[$type typeName] appendString:@"*"];
- [$type setTypeKind:kPointer];
- >>
- | AMPERSAND <<[[$type typeName] appendString:@"&"];
- [$type setTypeKind:kPointer];
- >>
- ) {abs_decl[$type]}
- | direct_abs_decl[$type]
- ;
- direct_abs_decl[id type]:
- LPARENTHESIS <<[[$type typeName] appendString:@"("];>>
- abs_decl[$type]
- RPARENTHESIS <<[[$type typeName] appendString:@")"];>>
- rest_of_direct_abs_decl[$type]
- | array_mod[$type] rest_of_direct_abs_decl[$type]
- | func_mod[$type] rest_of_direct_abs_decl[$type]
- ;
- rest_of_direct_abs_decl[id type]:
- direct_abs_decl[$type]
- | /* empty */
- ;
- array_mod[id type]:
- <<id num;>>
- LSQUAREBRACKET <<[[$type typeName] appendString:@"["];>>
- { int_number[$type] > [num]
- <<[[$type typeName] appendString:[num stringValue]];>>}
- RSQUAREBRACKET <<[[$type typeName] appendString:@"]"];>>
- <<[$type setTypeKind:kArray];>>
- ;
- func_mod[id typeObj]:
- <<id funcType;>>
- LPARENTHESIS
- { type > [funcType]
- <<[[$typeObj typeName] appendString:[funcType typeName]];>>
- (COMMA type > [funcType]
- <<[[$typeObj typeName] appendString:[funcType typeName]];>>)*}
- RPARENTHESIS
- ;
- typebase > [id type]:
- <<id string = [NSMutableString string];
- id synType;
- $type = [[Type new] autorelease];
- [$type setTypeName:string];
- >>
-
- {UNSIGNED <<[string appendString:@"unsigned "];>>}
- ( (LONG <<[string appendString:@"long "];
- [$type setScalarTypeKind:kLong];
- >>
- {UNSIGNED <<[string appendString:@"unsigned "];>>}
- { INT <<[string appendString:@"int "];
- [$type setScalarTypeKind:kInt];
- >>
- | (LONG <<[string appendString:@"long "];
- [$type setScalarTypeKind:kLong];
- >>
- {INT <<[string appendString:@"int "];>>})})
- | INT <<[string appendString:@"int "];
- [$type setScalarTypeKind:kInt];
- >>
- | (SHORT <<[string appendString:@"short "];
- [$type setScalarTypeKind:kShort];
- >>
- {UNSIGNED <<[string appendString:@"unsigned "];>>}
- {INT <<[string appendString:@"int "];>>})
- | CHAR <<[string appendString:@"char "];
- [$type setScalarTypeKind:kChar];
- >>)
- <<[$type setTypeKind:kScalar];>>
- | FLOAT
- <<[string appendString:@"float "];
- [$type setTypeKind:kScalar]; [$type setScalarTypeKind:kFloat];
- >>
- | DOUBLE
- <<[string appendString:@"double "];
- [$type setTypeKind:kScalar]; [$type setScalarTypeKind:kDouble];
- >>
- | STRUCT <<[string appendString:@"struct "];>>
- ( identifier > [synType] <<[string appendString:synType];>>
- | LCURLYBRACE <<[string appendString:@"{ "];>>
- (type>[synType] <<[string appendString:[synType typeName]];>>
- identifier>[synType] <<[string appendString:synType];>>
- {array_mod[$type]} SEMICOLON <<[string appendString:@"; "];>>)+
- RCURLYBRACE <<[string appendString:@"}"];>>)
- <<[$type setTypeKind:kStructure];>>
- | CLASS identifier > [synType]
- <<[string appendString:@"struct "];
- [string appendString:synType];
- [$type setTypeKind:kClass];
- >>
- | UNION <<[string appendString:@"union "];>>
- ( identifier > [synType] <<[string appendString:synType];>>
- | LCURLYBRACE <<[string appendString:@"{ "];>>
- (type>[synType] <<[string appendString:[synType typeName]];>>
- identifier>[synType] <<[string appendString:synType];>>
- {array_mod[$type]} SEMICOLON <<[string appendString:@"; "];>>)+
- RCURLYBRACE <<[string appendString:@"}"];>>)
- <<[$type setTypeKind:kUnion];>>
- | ENUM <<[string appendString:@"enum "];>>
- ( identifier > [synType] <<[string appendString:synType];>>
- | LCURLYBRACE <<[string appendString:@"{ "];>>
- identifier>[synType] <<[string appendString:synType];>>
- (COMMA <<[string appendString:@", "];>>
- identifier>[synType] <<[string appendString:synType];>>)*
- RCURLYBRACE <<[string appendString:@"}"];>>)
- <<[$type setTypeKind:kEnum];>>
- | ( CONST <<[string appendString:@"const "];>>
- |VOLATILE <<[string appendString:@"volatile "];>>)
- typebase > [synType]
- <<[string appendString:[synType typeName]];
- [synType setTypeName:string];
- $type = synType;
- >>
- | VOID <<[string appendString:@"void "]; [$type setTypeKind:kVoid];>>
- ;
- value[id type] > [id valueObj]:
- <<id num, string, synType; $valueObj = nil;>>
- number[$type] > [num] <<$valueObj = num;>>
- {descriptive_value > [string] <<[$valueObj setDescription:string];>>}
- | identifier > [synType]
- <<$valueObj = [[[$type valueClass] new] autorelease];
- [$valueObj setStringValue:synType];
- >>
- | <<NSMutableArray* array = [NSMutableArray array];
- $valueObj = [[[$type valueClass] new] autorelease];
- >>
- compound_value[array] <<[$valueObj setArrayValue:array];>>
- ;
- descriptive_value > [id description]:
- <<$description = nil;>>
- d1:CHARACTER <<$description = $d1;>>
- | d2:STRING <<$description = $d2;>>
- | d3:FUNCTION_NAME <<$description = $d3;>>
- ;
- number[id type] > [id value]:
- <<$value = nil;>>
- n1:FLOATONE <<$value = [SimpleValue numberWithString:$n1];>>
- | n2:FLOATTWO <<$value = [SimpleValue numberWithString:$n2];>>
- | n3:FLOATTHREE <<$value = [SimpleValue numberWithString:$n3];>>
- | n4:STRING <<$value = [SimpleValue numberWithString:$n4];>>
- | int_number[$type] > [$value]
- ;
- int_number[id type] > [id value]:
- <<id numberString; $value = nil;>>
- ( n1:OCTALINT <<numberString = $n1;>>
- | n2:DECIMALINT <<numberString = $n2;>>
- | n3:HEXADECIMALINT <<numberString = $n3;>>)
- <<if ([type typeKind] == kPointer)
- $value = [PointerValue pointerWithAddress:numberString];
- else
- $value = [SimpleValue numberWithString:numberString];
- >>
- ;
- compound_value[id components]:
- <<id val;>>
- LCURLYBRACE
- {(variable_or_typed_value > [val] <<[$components addObject:val];>>
- (COMMA variable_or_typed_value > [val] <<[$components addObject:val];>>)*)
- | DOTS}
- RCURLYBRACE
- ;
- variable_or_typed_value > [id value]:
- <<$value = nil;>>
- variable > [$value]
- | typed_value > [$value]
- ;
- identifier > [id name]:
- name1:IDENTIFIER <<$name=$name1;>>
- | name2:CLASS <<$name=$name2;>>
- ;
-