Schrift
[thread]11108[/thread]

Codegeneration aus XML Daten

Leser: 2


<< >> 8 Einträge, 1 Seite
Tr0Nix
 2008-01-07 20:30
#104469 #104469
User since
2006-11-21
44 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen

Hat jemand von euch schonmal einen Perl Codegenerator programmiert? Ist dies zu empfehlen?

Meine Idee ist folgende:
- Definitionen werden in einem oder mehreren XML-Files bereitgestellt an einer zentralen Stelle. Die Definitionen haben eine "Release-Nummer".
- Wird der "Client" gestartet, vergleicht er seine "Codeversion" mit der "Relase-Nummer" die an der zentralen Stelle gespeichert ist.
- Ist die Version aktuell, macht er normal weiter. Wenn nicht, muss er die Definitionen aktualisieren - er lädt die XML Files runter und "kompiliert" diese neu in Perl-Code.
- Das Programm nutzt den aktualisierten Perl-Code - bsp. als Modul oder als Klasse.

Das XML muss Regular Expression-Checks beschreiben und Abhängigkeiten unter den Checks (sprich wenn Check A matcht, überspringe Check B & C). Natürlich könnte ich auch jedesmal das XML parsen, aber die Geschwindigkeit würde wohl darunter leiden wenn ich jedesmal auswerten muss, wie reagiert werden muss wenn gematcht wird oder nicht.

Gruess
tr0nix

P.S.
XML weil ich die Expressions auslagern möchte so, dass auch jemand fremdes ohne Perl-Kentnisse dies maintainen könnte. Auch weil es einen grossteil der Logik portierbar macht und die Informationen darin in anderen Programmen weiterverwendet werden kann für bsp. ein Statistikprogramm.
renee
 2008-01-07 21:07
#104471 #104471
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was möchtest Du denn überhaupt genau generieren lassen? Komplette Subroutinen oder nur "Stubs"?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Ronnie
 2008-01-07 21:09
#104472 #104472
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
YAML oder JSON sind immer besser zu handhaben als XML!
Tr0Nix
 2008-01-07 21:40
#104473 #104473
User since
2006-11-21
44 Artikel
BenutzerIn
[default_avatar]
@ronnie:
Danke für den Tipp! YAML sieht echt prima aus.. es geht mir insb. um die Portierbarkeit des Regelsets, YAML scheint auf den ersten Blick genauso gut anwendbar zu sein. Nimm's mir nicht übel, dass ich unten das Beispiel aber noch mit XML gemacht habe :).

@renee:
Stark vereinfachtes Beispiel. Es geht insb. um das Übersetzen der boolschen Logik.

Beispiel Input:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
<root>
<regex name="nameCheck>qr/tr0nix/</regex>
<regex name="nrCheck>qr/^\d$/</regex>
<regex name="emptyCheck>qr/^$/</regex>
</root>

<root startAt="0">
<check id="0" onMatchAction="return">nameCheck</check>
<check id="1" onMatchCheck="2">nrCheck</check>
<check id="2" onMatchAction="return">emptyCheck</check>
</root>


Würde compiliert werden zu:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
my %regex;
$regex[nameCheck]="qr/tr0nix/";
$regex[nrCheck]="qr/^\d$/";
$regex[emptyCheck]="qr/^$/";

sub check {
my $line = shift;

return if ($line =~ $regex[nameCheck]);
if ($line =~ $regex[nrCheck]) {
return if ($line =~ $regex[emptyCheck]);
}
}


P.S. danke für den Tipp mit $foo in deinem letzten Beitrag, habs abonniert und schon das erste Magazin erhalten! Echt cooles Design!
ptk
 2008-01-07 21:56
#104475 #104475
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Lass doch "qr/" und "/" im XML weg. Du sagst ja schon mit <regex>, dass eine Regexp ist.

Ansonsten: just do it! Das ist eher eine Frage, wie man XML parst. Daraus Strings zu erzeugen, die zufällig ein Perl-Programm ergeben, sollte nicht das Problem sein.
renee
 2008-01-07 22:06
#104476 #104476
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Als Anfang:
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
78
79
#!/usr/bin/perl

use strict;
use warnings;
use YAML::Tiny;
use Data::Dumper;

my $string = do{ local $/; <DATA> };
my $config = YAML::Tiny->read_string( $string )->[0];

my $code = '';
variable_declaration( \$code, $config->{root} );

print $code;

sub variable_declaration{
    my ($coderef,$config) = @_;
    
    for my $name ( keys %$config ){
        if( ! ref( $config->{$name} ) ){
            declare_scalar( $coderef, $config->{$name}, $name );
        }
        elsif( ref($config->{$name}) eq 'HASH' ){
            declare_hash( $coderef, $config->{$name}, $name );
        }
        elsif( ref( $config->{$name} ) eq 'ARRAY' ){
            declare_array( $coderef, $config->{$name}, $name );
        }
    }
}

sub declare_hash{
    my ($coderef,$config,$name) = @_;
    
    $$coderef .= 'my %' . $name . " = (\n";
    
    for my $key ( keys %$config ){
        my $val = $config->{$key}->{value};
           $val = $config->{$key}->{type} eq 'qr' ? "qr/$val/" : $val;
        $$coderef  .= "$key => $val,\n"
    }

    $$coderef .= ");\n";
}

sub declare_array{
    my ($coderef,$config,$name) = @_;
    
    $$coderef .= "\nmy \@$name = (" . join(",", map{ '"' . $_ . '"' }@$config ) . ");\n";
}

__DATA__
---
root:
  regex:
    nameCheck:
      type: qr
      value: tr0nix
    nrCheck:
      type: qr
      value: ^\d$
    emptyCheck:
      type: qr
      value: ^$
  array :
    - 1
    - 2
code:
  startAt: 0
  check:
    - 0 :
      Action: return
      Regex: nameCheck
    - 1 :
      Check: 2
      Regex: nrCheck
    - 2 :
      Action: return
      Regex: emptyCheck
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Tr0Nix
 2008-01-07 22:16
#104477 #104477
User since
2006-11-21
44 Artikel
BenutzerIn
[default_avatar]
Prima danke! Ich denke das Konzept ist weiter verfolgbar.

Es ging mir prinzipiell nur drum abzuklären, ob jemand gleich die Hände über dem Kopf zusammenschlägt, wenn er Codegenerator hört. Weil in meinen Augen sehe ich keine Probleme.
renee
 2008-01-07 22:26
#104478 #104478
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Es ist halt so, dass der Generator und die xml/yml/json/irgendwas-Dateien immer komplexer werden, um so mehr Logik Du schon generieren lassen willst. Während es für "Stubs" ziemlich einfach und alltäglich ist (siehe CPAN:Module::Start und h2xs) den Code generieren zu lassen, ist es für richtige Logik sehr komplex. Aber es ist sicherlich eine nähere Betrachtung wert und bis zu einem gewissen Grad auch gut lösbar.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 8 Einträge, 1 Seite



View all threads created 2008-01-07 20:30.