#!/usr/bin/perl use strict; # REX/Perl 1.0 # Robert D. Cameron "REX: XML Shallow Parsing with Regular Expressions", # Technical Report TR 1998-17, School of Computing Science, Simon Fraser # University, November, 1998. # Copyright (c) 1998, Robert D. Cameron. # The following code may be freely used and distributed provided that # this copyright and citation notice remains intact and that modifications # or additions are clearly identified. my $TextSE = "[^<]+"; my $UntilHyphen = "[^-]*-"; my $Until2Hyphens = "$UntilHyphen(?:[^-]$UntilHyphen)*-"; my $CommentCE = "$Until2Hyphens>?"; my $UntilRSBs = "[^\\]]*](?:[^\\]]+])*]+"; my $CDATA_CE = "$UntilRSBs(?:[^\\]>]$UntilRSBs)*>"; my $S = "[ \\n\\t\\r]+"; my $NameStrt = "[A-Za-z_:]|[^\\x00-\\x7F]"; my $NameChar = "[A-Za-z0-9_:.-]|[^\\x00-\\x7F]"; my $Name = "(?:$NameStrt)(?:$NameChar)*"; my $QuoteSE = "\"[^\"]*\"|'[^']*'"; my $DT_IdentSE = "$S$Name(?:$S(?:$Name|$QuoteSE))*"; my $MarkupDeclCE = "(?:[^\\]\"'><]+|$QuoteSE)*>"; my $S1 = "[\\n\\r\\t ]"; my $UntilQMs = "[^?]*\\?+"; my $PI_Tail = "\\?>|$S1$UntilQMs(?:[^>?]$UntilQMs)*>"; my $DT_ItemSE = "<(?:!(?:--$Until2Hyphens>|[^-]$MarkupDeclCE)|\\?$Name(?:$PI_Tail))|%$Name;|$S"; my $DocTypeCE = "$DT_IdentSE(?:$S)?(?:\\[(?:$DT_ItemSE)*](?:$S)?)?>?"; my $DeclCE = "--(?:$CommentCE)?|\\[CDATA\\[(?:$CDATA_CE)?|DOCTYPE(?:$DocTypeCE)?"; my $PI_CE = "$Name(?:$PI_Tail)?"; my $EndTagCE = "$Name(?:$S)?>?"; my $AttValSE = "\"[^<\"]*\"|'[^<']*'"; my $ElemTagCE = "$Name(?:$S$Name(?:$S)?=(?:$S)?(?:$AttValSE))*(?:$S)?/?>?"; my $MarkupSPE = "<(?:!(?:$DeclCE)?|\\?(?:$PI_CE)?|/(?:$EndTagCE)?|(?:$ElemTagCE)?)"; my $XML_SPE = "$TextSE|$MarkupSPE"; my $filename; my %packageDef; my %methods; my %objects; my $objPath = "../obj"; my $ifacePath = "../iface/"; my %opts; # programm options my @files;# files to treat my %typeToObject = ( 'int' => 'Integer' , 'boolean' => 'Boolean', 'double' => 'Double', 'String' => 'String', 'byte' => 'Byte' ); my %typeToCType = ( 'int' => 'int', 'boolean' => 'boolean', 'double' => 'double', 'String' => "char *", 'byte' => 'char' ); sub openFile { my ( $fileToOpen ) = @_; print "openFile $fileToOpen\n"; if ( $opts{"-file"} ) { local *SORTIE; print "openFile -file $fileToOpen\n"; open( SORTIE, "> $fileToOpen") or die "Cannot open $fileToOpen"; return *SORTIE; } else { return *STDOUT; } } sub closeFile { my ($handleFile) =@_; close $handleFile if ( $opts{"-file"} ); } sub ShallowParse { my($XML_document) = @_; return $XML_document =~ /$MarkupSPE/g; } sub isPackage { my ($XML_Section) = @_; my @temp; my $temp; @temp = $XML_Section =~ /$Name/g; $temp = shift (@temp); return $temp eq "Package"; } sub isObject { my ($XML_Section) = @_; my @temp; my $temp; @temp = $XML_Section =~ /$Name/g; $temp = shift (@temp); return $temp eq "Object"; } sub isMethod { my ($XML_Section) = @_; my @temp; my $temp; @temp = $XML_Section =~ /$Name/g; $temp = shift (@temp); return $temp eq "Method"; } sub parsePackage { my ($Package, @XML_Sections) = @_; my @packageAttr = $Package =~ /$AttValSE/g; $_ = shift ( @packageAttr ); s/\"//g; $packageDef{"name"} = $_ ; s/^.*\.//; $packageDef{"shortName"} = $_; $packageDef{"version"}= shift(@packageAttr); return @XML_Sections; } sub parseObject { my ($Object, @XML_Sections) = @_; my %field=(); my @fields=(); my @objectAttr; my @field; my ( $nameObject,$field, $key, $value ); # get the object name @objectAttr = $Object =~ /$AttValSE/g; $_ = shift ( @objectAttr ); s/\"//g; $nameObject = $_ ; #Now get Every Field of the object while ( ($field,@XML_Sections) = @XML_Sections ) { @field = ($field =~ /$Name/g ); if ((shift @field) eq "Object") { $objects{$nameObject}=\@fields; return @XML_Sections; } else { while ( ($key,$value,@field)= @field ) { $field{$key} = $value; } @fields = ( @fields, $field{"name"}, $field{"type"} ); } } return @XML_Sections; } sub parseMethod { my ($Method, @XML_Sections) = @_; my $retour; my @param =(); my $nameMethod = ""; my @methodAttr; my @field; my ( $inout, $field, $p); # get the Method name # print $Method; @methodAttr = $Method =~ /$AttValSE/g; $_ = shift ( @methodAttr ); s/\"//g; $nameMethod = $_ ; #Now get Every Field of the object while ( ($field,@XML_Sections) = @XML_Sections ) { @field = ($field =~ /$Name/g ); $inout= shift (@field); if ( $inout eq "Method") { $methods{$nameMethod}=\@param; return @XML_Sections; } elsif ( $inout eq "return" ){ ($_,$retour,@field) = (@field); @param = ( $retour, @param); } else { ($_,$p,@field) = (@field); @param = (@param, $p); } } return @XML_Sections; } sub JObject { my ( $nameObj, @fields) = @_; my ( $def, $name, $type); $def = "public class " . $nameObj . " implements Serializable { \n" ; while ( ( $name, $type, @fields) = @fields ) { $def .= "\t private " . $type . " " . $name .";\n"; $def .= "\t public " . $type . " get" . $name ."() {return ". $name ."; }\n"; $def .= "\t public void set" . $name ."(" . $type . " x) {". $name ." = x; }\n"; } $def .= "\n\tpublic " . $nameObj . "() {} \n"; $def .= "}\n"; return $def; } sub CObject { my ( $nameObj, @fields) = @_; my ( $def, $name, $type); $def = "struct " . $nameObj . " { \n" ; while ( ( $name, $type, @fields) = @fields ) { $def .= "\t " . $type . " " . $name .";\n"; } $def .= "}\n"; return $def; } sub JMethod { my ($nameMethod, @param )= @_; my $i=0; my $def=""; $def .= "public " . shift(@param) . " ". $nameMethod . "( "; $def .= $_ . " p".$i++. ", " foreach (@param); $_ = $def; s/, $//; $def = $_ . " )"; return $def; } sub FileHeader { my ($fileheader, $include, $comment) = @_; print "generating $fileheader from $filename\n" if ($opts{"-verbose"});; my $temp=<