Reguläre Ausdrücke

Binio

Erfahrenes Mitglied
Hallo Leute,

hab ein kleines Problem mit meinem Regulären Ausdruck.
Ich Lese eine Datei Zeilenweise aus und möchte in jeder Zeile eine aufteilung erzielen.
Meine Datei sieht wie folgt aus:

Code:
#
# print sum of input numbers
#
      ld    zero    # initialize sum to zero
      st    sum
loop  get           # read a number
      jz    done    # no more input if number is zero
      add   sum     # add in accumulated sum
      st    sum     # store new value back in sum
      j     loop    # go back and read another number

done  ld    sum
      put           # print sum
      halt          # stop program execution

zero  const 0       # constant
sum   const         # variable

Mein bisher nicht gelungenes Perl Script ;o)

Code:
use strict;
use warnings;
use Data::Dumper;
use Storable qw(store retrieve freeze thaw dclone);

#-----------------------------------------------------------------------------------
#Globale Variablen
#-----------------------------------------------------------------------------------
my $INFILE = 'sum.asm';
my $adresse = 0;
my %symboltabelle;
my @befehle = qw(get put ld st add sub jpos jz j halt const);
my $regex = qr/\t ([A-Z][a-z]) \t/;

my $counter = 0;
open (IN,"<$INFILE") || die "$0:failed to open input file $INFILE:$!\n";
while (<IN>){
    #foreach (split(/ \t\n/,$_))
    #{
    #    if(exists(${befehle}{$_})){
    #        $symboltabelle{$_} = $counter;
    #    }
    #    print $_,"\n";
    #}
    if( $_ =~ m/$regex/ ) {
        print "$1 $2 $3 \n";
    }
    else{
        print "in Zeile ",$counter," keine Syntax entdeckt\n";
    }
    $counter++;
}
close(IN);

#print Dumper %symboltabelle ;

WIe man vieleicht sehen kann handelt es sich um Assembler Code.
Ich muss alles was hinter # steht verwerfen.
Dann muss ich die vergebenen Namen(loop,done,zero) ein eine variable speichern. Die Befehle (get put ld st add sub jpos jz j halt const) auch einzeln speichern.

Also sollte bei der Zeile:
Code:
      st    sum
das rauskommen
$1='' $2=st $3=sum

Bei Zeile:
Code:
loop  get           # read a number
das
$1=loop $2=get $3=''

uns so weiter

die Zwischenräume können leezeichen und Tabulatoren sein. Aber das kann man ja einfach mit '\t ' abfangen.
Ich weiss auch nicht ob das mit Regulären ausdrücken lösen kann. Evtl reicht einfach ein split.
Ich habe verschiedene Lösungsansätze versucht doch leider kam bei mir immer nicht gutes bei raus :eek:(
 
Hi.

Du kannst ja mal diesen reg. Ausdruck versuchen und ggf. erweitern:

Perl:
/^(\w+|(?=\s))\s+(\w+)(?:\s+(\w+))?/

Evtl. solltest du mal ein Tutorial für reg. Ausdrücke durcharbeiten. Es gibt auch gute Programme (z.B. RegEx Coach) dazu.

Gruß
 
Zurück