Schrift
[thread]10244[/thread]

Progress 4GL: Beautifier, Regex



<< >> 3 Einträge, 1 Seite
TEngelke
 2007-08-28 17:03
#98776 #98776
User since
2007-08-28
1 Artikel
BenutzerIn
[default_avatar]
Hallo!

Ich programmiere in der Firma in einer Sprache namens Progress Provision (ABL/4GL), einer High-Level-Datenbanksprache. Da es aufgrund der geringen Verbreitung der Sprache keine große Community gibt, sind wir bei Problemen und der Suche nach hilfreichen Tools oft auf uns selbst gestellt.

Für viele bekannte Sprachen gibt es sogenannte Code-Beautifier; Programme, die den Code korrekt und fein einrücken und formatieren. Eine der bekanntesten Funktionen ist die in Eclipse eingebaute Formatierung (Shift+Ctrl+F), die sich ja auch extensiv über die Konfiguration konfigurieren läßt.

Jetzt wollte ich versuchen, einen ersteinmal relativ simplen Beautifier für Progress-Code zu erzeugen, stoße dabei aber auf einige Probleme. Zwar halte ich alle Probleme für lösbar, aber meine erdachten Lösungen erscheinen mir alle sehr kompliziert bzw. wenig elegant. Vielleicht gibt es bessere Lösungen, und vielleicht kommt ihr auf die Eine oder Andere.

Der Hauptteil der Probleme betrifft Kommentare. Progress unterstützt verschachtelte Kommentare, also die Zeile

Code: (dl )
define variable abc as character. /* Dies ist ein Test /* */


ist am Ende weiterhin im äußeren Kommentar, also das "*/" am Ende schließt nicht alle offenen Kommentare ab.

Gibt es eine clevere Möglichkeit um folgende Probleme herum (jeweils eine Codezeile):

Code: (dl )
CODE /* KOMMENTAR /* KOMMENTAR2 */


In diesem Falle kann ein einfacher regulärer Ausdruck, welcher auf das Vorhandensein des öffnenden Kommentars und danach auf das Vorhandensein des schließenden Kommentars prüft, nicht ausreichend sein, da dann Kommentaranfänge und Enden übersprungen werden würden.

Code: (dl )
KOMMENTAR */ CODE /* KOMMENTAR2


In diesem Falle wollte ich überprüfen, ob ein Kommentaranfang und ein Kommentarende in der Zeile stehen. Leider funktioniert dies nicht für den Fall, das das Kommentarende vor dem neuen Kommentaranfang kommt.

Ich bin mir nicht sicher, ob ich mein "Problem" überhaupt verdeutlicht habe. Bitte fragt, wenn etwas nicht klar ist.

Vielen Dank,

Thomas
sid burn
 2007-08-28 17:10
#98778 #98778
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Schau dir mal Text::Balanced an. Damit kannst du alle Möglichen mehrere ineinder verschatelten Kommentare auslesen.

Aber mit einer Regex würde es auch gehen, ist nur etwas schwerer.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
bloonix
 2007-08-28 17:37
#98779 #98779
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
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
use strict;
use warnings;

my %ho = ( 
    '/*' => sub { ++$_[0] },
    '*/' => sub { --$_[0] },
);

while ( my $line = <DATA> ) { 
    my $c; 
    for ( $line =~ /(\/\*|\*\/)/g ) { 
        $c = $ho{$_}($c);
        warn "error in line $.! closing comment that isnt open\n" if $c < 0;
    }   
    warn "error in line $.! open comment isnt closed\n" if $c; 
}

__END__
korrekte zeile /* Dies ist ein Test */
define variable abc as character. /* Dies ist ein Test /* */
CODE /* KOMMENTAR /* KOMMENTAR2 */
KOMMENTAR */ CODE /* KOMMENTAR2

#> ./test.pl
error in line 2! open comment isnt closed
error in line 3! open comment isnt closed
error in line 4! closing comment that isnt open


geht bestimmt noch besser... aber nur ein Beispiel...
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< >> 3 Einträge, 1 Seite



View all threads created 2007-08-28 17:03.