Thread Parameter umwandeln (55 answers)
Opened by Benji2010 at 2010-12-13 12:04

GUIfreund
 2011-11-25 17:47
#154474 #154474
User since
2011-08-08
559 Artikel
BenutzerIn
[default_avatar]
Es hat mich gereizt, mich ebenfalls an dem Problem zu versuchen. Allerdings stammt der Hauptteil der Diskussion aus einer Zeit, als ich noch nicht hier im Forum war. Da hatte ich einiges nachzuarbeiten.

Ich habe mich bemüht, meine Regexe möglichst einfach zu halten. Je komplexer eine Regex ist, desto größer ist die Gefahr von falsch positiven oder falsch negativen Treffern. Als Dreingabe habe ich noch den Sinus eingebaut. Und Exponenten bei Gleitkommawerten (habe ich gebraucht für SIN(180)). Hier mein Resultat:
more (18.8kb):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use strict;
use warnings;
use feature "switch";
use 5.10.1;   # for say

use constant PI => 4*atan2(1, 1);
use constant DEG2RAD => 2*PI/360;

my %vars;
$vars{R10} = '';

{   # main
    while (my $line = <DATA>) {
        chomp $line;
        my @cmds = split(' ', $line);
        foreach my $cmd (@cmds) {
            given ($cmd) {
                # Zuweisung
                when (/^(\w+)=(.+)$/) 
                    {$vars{$1} = ausdruck($2); $cmd = "$1=$vars{$1}"; next}
                # Kommentare durchwinken
                when (substr($_, 0, 1) eq '(') {next}
                # Sonderfall R10
                when (substr($_, 0, 1) eq 'T') 
                    {$vars{R10} = substr($_, -3, 2); next}
                # Argumente
                when (/^(\w+)\((.+)\)$/) {
                    my $funktion = $1;
                    my @params = split(',', $2);
                    my @ersetzte;
                    foreach my $par (@params) {
                        push @ersetzte, ausdruck($par);
                    }
                    $cmd = "$funktion(" . join(',', @ersetzte) . ')';
                    next;
                }
                default {say "Unbekanntes Kommando $cmd"};
            }
        }
        say join ' ', @cmds;
    }
}

sub ausdruck {
    my $ausdr = shift;
    foreach my $var (keys %vars) {
        $ausdr =~ s/\b$var\b/$vars{$var}/g;
    }
    # entferne Klammern
    $ausdr =~ m'\('  and  $ausdr = klammern($ausdr);
    # berechne Sinus
    $ausdr =~ s/SIN(-?[\d.]+)/sin($1*DEG2RAD)/eg;
    # replace exponent
    $ausdr =~ s/([.\d])e(-?\d+)/$1*10**$2/g;
    $ausdr =~ m'^[-+*/\d.]+$'  and  $ausdr = eval $ausdr;
    return $ausdr;
}

sub klammern {
    my $ausdr = shift;
    while ($ausdr =~ s'\(([^(]*?)\)'ausdruck($1)'e) {};
    return $ausdr;
}

__DATA__
R53=30
X=SIN(R53)+R53
R79=55
M977(103,R79,20,300)
T7020320
X=R10
R1=15
R4=20
X=R1+R4
Y=R1*R4
M779(R4,R1,20)
M13(R1+R4,10,R4-R1)


Editiert von GUIfreund: More-Tag eingefügt.
Last edited: 2011-11-25 17:50:41 +0100 (CET)
Gruß
GUIfreund

View full thread Parameter umwandeln