Parsen von JavaScript Code
Parsen von JavaScript Code
am 04.07.2007 18:18:39 von Ferry Bolhar
Hallo,
ich muss Dateien mit JavaScript-Code parsen. Ich denke,
um nicht das Rad neu zu erfinden, werden ich einen der
bekannten Parser (z.B. Parse::RecDescent) verwenden.
Frage: gibt es vielleicht schon irgendwo die Grammatik
für JavaScript, die man diesem Parser übergeben kann?
Ich möchte sie nicht umbedingt selber erstellen müssen,
wenn es sie schon woanders gibt.
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Parsen von JavaScript Code
am 05.07.2007 10:35:56 von Ingo Menger
On 4 Jul., 18:18, "Ferry Bolhar" wrote:
> Hallo,
>
> ich muss Dateien mit JavaScript-Code parsen. Ich denke,
> um nicht das Rad neu zu erfinden, werden ich einen der
> bekannten Parser (z.B. Parse::RecDescent) verwenden.
Dann hoffe ich, daß Du nicht allzuviel parsen mußt. Parse::RecDescent
ist cool um mal eben schnell eine kleine Grammatik auf wenig Text
anzuwenden. Für größere Sachen habe ich die Erfahrung gemacht, daß =
es
dann ewig dauert.
> Frage: gibt es vielleicht schon irgendwo die Grammatik
> für JavaScript, die man diesem Parser übergeben kann?
> Ich möchte sie nicht umbedingt selber erstellen müssen,
> wenn es sie schon woanders gibt.
Ich weiß es nicht, würde aber denken, Du solltest erst nach der
Grammar suchen und dann das passende Perl-Tool dazu auswählen. Eine
yacc/bison Gramar kann man z.B. in ein Perlmodul verwandeln.
Re: Parsen von JavaScript Code
am 05.07.2007 12:17:34 von Frank Seitz
Ferry Bolhar wrote:
> ich muss Dateien mit JavaScript-Code parsen.
Wieso das?
> Ich denke, um nicht das Rad neu zu erfinden, werden ich einen der
> bekannten Parser (z.B. Parse::RecDescent) verwenden.
>
> Frage: gibt es vielleicht schon irgendwo die Grammatik
> für JavaScript, die man diesem Parser übergeben kann?
> Ich möchte sie nicht umbedingt selber erstellen müssen,
> wenn es sie schon woanders gibt.
Javascript ist eine komplexe Sprache, die es in diversen
Versionen gibt. Unwahrscheinlich, dass dafür ein brauchbarer
Standalone-Parser existiert, geschweige denn eine Grammatik
für Parse::RecDescent.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Parsen von JavaScript Code
am 05.07.2007 13:07:59 von struebig
Ferry Bolhar schrieb:
> Hallo,
>
> ich muss Dateien mit JavaScript-Code parsen. Ich denke,
> um nicht das Rad neu zu erfinden, werden ich einen der
> bekannten Parser (z.B. Parse::RecDescent) verwenden.
Core JS ist eigentlich nur simples C, ansonsten hast du Browserobjekte
und Funktionen, die du aber kaum nachbilden möchtest, oder?
Struppi.
Re: Parsen von JavaScript Code
am 05.07.2007 19:27:50 von Frank Seitz
J. Strübig wrote:
> Core JS ist eigentlich nur simples C
JS ist keinesfalls mit C syntaktisch identisch.
Eine Ähnlichkeit ist da, aber das war's auch schon.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Parsen von JavaScript Code
am 05.07.2007 21:08:33 von Slaven Rezic
Frank Seitz writes:
> Ferry Bolhar wrote:
>
> > ich muss Dateien mit JavaScript-Code parsen.
>
> Wieso das?
>
> > Ich denke, um nicht das Rad neu zu erfinden, werden ich einen der
> > bekannten Parser (z.B. Parse::RecDescent) verwenden.
> >
> > Frage: gibt es vielleicht schon irgendwo die Grammatik
> > für JavaScript, die man diesem Parser übergeben kann?
> > Ich möchte sie nicht umbedingt selber erstellen müssen,
> > wenn es sie schon woanders gibt.
>
> Javascript ist eine komplexe Sprache, die es in diversen
> Versionen gibt. Unwahrscheinlich, dass dafür ein brauchbarer
> Standalone-Parser existiert, geschweige denn eine Grammatik
> für Parse::RecDescent.
Warum glaubst du das? Es gibt sogar eine Pure-Perl-Javascript-Engine:
http://search.cpan.org/~sprout/JE-0.015/
Und es gibt mindestens ein weiteres Modul, das eine bestehende
Javascript-Library verwendet (Javascript).
Ob man mit diesen Modulen auf den geparsten Syntaxtree à la PPI
zugreifen kann, weiß ich allerdings nicht.
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
Visualize XML files in a Tk text widget:
http://search.cpan.org/search?mode=module&query=Tk::XMLViewe r
Re: Parsen von JavaScript Code
am 06.07.2007 09:26:54 von Frank Seitz
Slaven Rezic wrote:
> Frank Seitz writes:
>>Ferry Bolhar wrote:
>>>
>>>Frage: gibt es vielleicht schon irgendwo die Grammatik
>>>für JavaScript, die man diesem Parser übergeben kann?
>>>Ich möchte sie nicht umbedingt selber erstellen müssen,
>>>wenn es sie schon woanders gibt.
>>
>>Javascript ist eine komplexe Sprache, die es in diversen
>>Versionen gibt. Unwahrscheinlich, dass dafür ein brauchbarer
>>Standalone-Parser existiert, geschweige denn eine Grammatik
>>für Parse::RecDescent.
>
> Warum glaubst du das?
Ich gebe zu, es ist ein diffuses Glauben, das ich nicht
richtig begründen kann. Es speist sich aus früheren
Erfahrungen. Kann sein, dass ich mich irre.
> Es gibt sogar eine Pure-Perl-Javascript-Engine:
>
> http://search.cpan.org/~sprout/JE-0.015/
>
> Und es gibt mindestens ein weiteres Modul, das eine bestehende
> Javascript-Library verwendet (Javascript).
>
> Ob man mit diesen Modulen auf den geparsten Syntaxtree à la PPI
> zugreifen kann, weiß ich allerdings nicht.
Was Ferry genau machen will, hat er ja bislang nicht verraten.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Parsen von JavaScript Code
am 06.07.2007 10:36:29 von Ferry Bolhar
J. Strübig:
> Core JS ist eigentlich nur simples C,
Na, das halte ich für untertrieben. Konstrukte wie
object.attribute = wert;
object.methode();
gibt es m.W. in C nicht (ich bin allerdings kein C Guru), von den
übrigen, aus der Objektprogrammierung kommenden Konzepten
(Vererbung, Prototyping u.a.) ganz zu schweigen. Bei C++ lass'
ich eventuell mit mir reden, obwohl da auch Einiges anders ist.
Im übrigen habe ich auch für C(++) keine entsprechende Grammatik
gefunden.
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
LG,
Re: Parsen von JavaScript Code
am 06.07.2007 11:06:17 von Ferry Bolhar
Frank Seitz:
>> ich muss Dateien mit JavaScript-Code parsen.
>
> Wieso das?
Um die in ihnen enthaltenen Methoden-, Klassen-, (= Prototype)
und Attributdefinitionen möglichst anschaulich darzustellen und
Abhängigkeiten innerhalb der Dateien herausfinden zu können.
Es sind über 50 Dateien (eine Bibliothek), die fast ausschließlich
Deklarationscode enthalten. Jede Datei ist mehrere 100 Zeilen
lang. Ich meine, bevor ich das alles "zur Fuß" mache, investiere
ich ein bißchen Aufwand in Programmierung - zugleich ein guter
Vorwand, mich mal näher mit Parsern zu beschäftigen... ;-)
> Javascript ist eine komplexe Sprache, die es in diversen
> Versionen gibt. Unwahrscheinlich, dass dafür ein brauchbarer
> Standalone-Parser existiert, geschweige denn eine Grammatik
> für Parse::RecDescent.
Naja, der Sprachkern selbst wird nicht so kompliziert sein,
nachdem es sogar einen Parse für Perl gibt... ;-). Im Ernst, ich
verstehe schon was du meinst, aber ich dachte, ich frag' mal.
Danke & LG,
Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Parsen von JavaScript Code
am 06.07.2007 11:49:16 von struebig
Ferry Bolhar schrieb:
> J. Strübig:
>
> object.attribute = wert;
> object.methode();
>
> gibt es m.W. in C nicht (ich bin allerdings kein C Guru),
struct
> von den
> übrigen, aus der Objektprogrammierung kommenden Konzepten
> (Vererbung, Prototyping u.a.) ganz zu schweigen. Bei C++ lass'
> ich eventuell mit mir reden, obwohl da auch Einiges anders ist.
Naja, das C++ OO Konzept ist schon deutlich anders als das von JS. Meine
Aussage drückte auch in erster Linie Verwunderung aus, warum man sowas
braucht, da das meiste was in JS genutzt wird Browserspezifisch ist.
Struppi.
Re: Parsen von JavaScript Code
am 06.07.2007 18:09:58 von Ferry Bolhar
J. Strübig:
> Naja, das C++ OO Konzept ist schon deutlich anders als das von JS. Meine
> Aussage drückte auch in erster Linie Verwunderung aus, warum man sowas
> braucht, da das meiste was in JS genutzt wird Browserspezifisch ist.
Stimmt, aber es gibt auch serverseitiges JavaScript. Und wenn jemand
clientseitig schon viel damit gemacht hat und die Sprache gut kennt,
warum soll er die Sprache dann serverseitig nicht auch verwenden?
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Parsen von JavaScript Code
am 06.07.2007 18:12:06 von Ferry Bolhar
Slaven Rezic:
> Warum glaubst du das? Es gibt sogar eine Pure-Perl-Javascript-Engine:
>
> http://search.cpan.org/~sprout/JE-0.015/
>
> Und es gibt mindestens ein weiteres Modul, das eine bestehende
> Javascript-Library verwendet (Javascript).
>
> Ob man mit diesen Modulen auf den geparsten Syntaxtree à la PPI
> zugreifen kann, weiß ich allerdings nicht.
Danke, Slaven! Auf den ersten Blick sieht es vielversprechend aus.
Mal sehen, wie ich damit zurechtkomme.
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Parsen von JavaScript Code
am 10.07.2007 11:56:01 von struebig
Ferry Bolhar schrieb:
> J. Strübig:
>
>> Naja, das C++ OO Konzept ist schon deutlich anders als das von JS. Meine
>> Aussage drückte auch in erster Linie Verwunderung aus, warum man sowas
>> braucht, da das meiste was in JS genutzt wird Browserspezifisch ist.
>
> Stimmt, aber es gibt auch serverseitiges JavaScript. Und wenn jemand
> clientseitig schon viel damit gemacht hat und die Sprache gut kennt,
> warum soll er die Sprache dann serverseitig nicht auch verwenden?
Stimmt, nur wieviele Server die JS können existieren noch in freier
Wildbahn? Ich finde nur Dokumente von 1996-1999
Zumal dann ja nicht Browserspezifische Objekte, sondern
Serverspezifische Objekte auftreten. Daher wird - mir zumindest - die
Frage nach dem Parser immer schleierhafter.
Struppi.
Re: Parsen von JavaScript Code
am 10.07.2007 12:37:00 von hjp-usenet2
On 2007-07-10 09:56, J. Strübig wrote:
> Ferry Bolhar schrieb:
>> J. Strübig:
>>> Naja, das C++ OO Konzept ist schon deutlich anders als das von JS. Meine
>>> Aussage drückte auch in erster Linie Verwunderung aus, warum man sowas
>>> braucht, da das meiste was in JS genutzt wird Browserspezifisch ist.
>>
>> Stimmt, aber es gibt auch serverseitiges JavaScript. Und wenn jemand
>> clientseitig schon viel damit gemacht hat und die Sprache gut kennt,
>> warum soll er die Sprache dann serverseitig nicht auch verwenden?
>
> Stimmt, nur wieviele Server die JS können existieren noch in freier
> Wildbahn? Ich finde nur Dokumente von 1996-1999
>
> Zumal dann ja nicht Browserspezifische Objekte, sondern
> Serverspezifische Objekte auftreten. Daher wird - mir zumindest - die
> Frage nach dem Parser immer schleierhafter.
Das hatte Ferry doch erklärt: Er will JavaScript Code analysieren,
| Um die in ihnen enthaltenen Methoden-, Klassen-, (= Prototype)
| und Attributdefinitionen möglichst anschaulich darzustellen und
| Abhängigkeiten innerhalb der Dateien herausfinden zu können.
-- <1183736744.208553@proxy.dienste.wien.at>
man kann auch Code analysieren wollen, der im Browser läuft. Was das
damit zu tun haben soll, ob es JS-fähige Server gibt, weià ich nicht.
hp
--
_ | Peter J. Holzer | I know I'd be respectful of a pirate
|_|_) | Sysadmin WSR | with an emu on his shoulder.
| | | hjp@hjp.at |
__/ | http://www.hjp.at/ | -- Sam in "Freefall"
Re: Parsen von JavaScript Code
am 10.07.2007 12:50:57 von struebig
Peter J. Holzer schrieb:
> On 2007-07-10 09:56, J. Strübig wrote:
>> Zumal dann ja nicht Browserspezifische Objekte, sondern
>> Serverspezifische Objekte auftreten. Daher wird - mir zumindest - die
>> Frage nach dem Parser immer schleierhafter.
>
> Das hatte Ferry doch erklärt: Er will JavaScript Code analysieren,
>
> | Um die in ihnen enthaltenen Methoden-, Klassen-, (= Prototype)
> | und Attributdefinitionen möglichst anschaulich darzustellen und
> | Abhängigkeiten innerhalb der Dateien herausfinden zu können.
Das dürfte so gut wie unmöglich sein, da JS (ähnlich wie Perl, aber z.T.
noch flexibler) zur Laufzeit alles möglich ändern, anhängen und
erstellen kann. Aber vielleicht liegt mein Problme einfach an dem
mangelndem Verständniss was ein Parser machen muss. Ich schau mir mal
das Modul das Slaven gezeigt hat an.
> man kann auch Code analysieren wollen, der im Browser läuft. Was das
> damit zu tun haben soll, ob es JS-fähige Server gibt, weiß ich nicht.
Das hatte ja Ferry eingeführt, es existieren dadurch noch erheblich mehr
Möglichkeiten welche Objekte existieren könnten.
Struppi.
Re: Parsen von JavaScript Code
am 10.07.2007 13:56:14 von Frank Seitz
J. Strübig wrote:
>
> Das dürfte so gut wie unmöglich sein, da JS (ähnlich wie Perl, aber z.T.
> noch flexibler) zur Laufzeit alles möglich ändern, anhängen und
> erstellen kann.
Perl kann in punkto Flexibilität kaum übertroffen werden
und wird, so weit ich es kenne, entsprechend auch
von JS nicht übertroffen. Eine Sache weiß ich aber, die
in JS möglich ist, aber nicht in Perl: dass verschiedene Objekte
derselben Klasse unterschiedliche Methoden haben können
(JS ist prototypbasiert, da ist die Begrifflichkeit nur etwas
anders).
Zur ursprünglichen Aufgabenstellung: Wenn der Code aus
einfachen Deklarationen besteht und keine dynamischen
Verrenkungen enthält, kann man durch Parsing wissenswerte
Dinge sicherlich zuverlässig herausfinden.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Parsen von JavaScript Code
am 10.07.2007 14:22:59 von struebig
Frank Seitz schrieb:
> J. Strübig wrote:
>> Das dürfte so gut wie unmöglich sein, da JS (ähnlich wie Perl, aber z.T.
>> noch flexibler) zur Laufzeit alles möglich ändern, anhängen und
>> erstellen kann.
>
> Perl kann in punkto Flexibilität kaum übertroffen werden
> und wird, so weit ich es kenne, entsprechend auch
> von JS nicht übertroffen. Eine Sache weiß ich aber, die
> in JS möglich ist, aber nicht in Perl: dass verschiedene Objekte
> derselben Klasse unterschiedliche Methoden haben können
> (JS ist prototypbasiert, da ist die Begrifflichkeit nur etwas
> anders).
Ich bin zwar nicht sicher wie du das meinst, aber so wie ich das
verstehe, geht das durchaus mit JS.
Obj.prototype = {
newFunc: function(name, func) { this[name] = func; }
};
var a = new Obj('a');
var b = new Obj('b');
a.newFunc('test_1', function() { alert('ich bin:' + this.name); } );
b.newFunc('test_2', function() { alert('und ich:' + this.name); } );
a.test_1();
b.test_2();
Soweit ich das überblicke gehen bei Perl und JS ähnliche Dinge, bei
denen ein Javaprogrammierer sofort tot umfallen würde, nur JS ist da
flexibler insofern das du keinerlei Verrenkungen über Referenzen machen
musst, du kannst jederzeit jedes Objekt beliebig erweitern oder ändern.
> Zur ursprünglichen Aufgabenstellung: Wenn der Code aus
> einfachen Deklarationen besteht und keine dynamischen
> Verrenkungen enthält, kann man durch Parsing wissenswerte
> Dinge sicherlich zuverlässig herausfinden.
Stell ich mir schwierig vor, das JE Modul funktioniert bei mir nicht (es
wird nichts geparst).
Struppi.
Re: Parsen von JavaScript Code
am 10.07.2007 14:25:34 von struebig
J. Strübig schrieb:
> Frank Seitz schrieb:
>> von JS nicht übertroffen. Eine Sache weiß ich aber, die
>> in JS möglich ist,
sorry, das hatte ich nicht genau gelesen.
Struppi.
Re: Parsen von JavaScript Code
am 10.07.2007 15:10:24 von Frank Seitz
J. Strübig wrote:
> Frank Seitz schrieb:
>>
>>Perl kann in punkto Flexibilität kaum übertroffen werden
>>und wird, so weit ich es kenne, entsprechend auch
>>von JS nicht übertroffen. Eine Sache weiß ich aber, die
>>in JS möglich ist, aber nicht in Perl: dass verschiedene Objekte
>>derselben Klasse unterschiedliche Methoden haben können
>>(JS ist prototypbasiert, da ist die Begrifflichkeit nur etwas
>>anders).
[...]
> Obj.prototype = {
> newFunc: function(name, func) { this[name] = func; }
> };
>
> var a = new Obj('a');
> var b = new Obj('b');
>
> a.newFunc('test_1', function() { alert('ich bin:' + this.name); } );
> b.newFunc('test_2', function() { alert('und ich:' + this.name); } );
>
> a.test_1();
> b.test_2();
Ja das meine ich. Ich würde es so demonstrieren:
Object.prototype.m = function() { alert('Methode der Klasse') };
var a = new Object;
var b = new Object;
a.m(); // -> Methode der Klasse
b.m(); // -> Methode der Klasse
b.m = function() { alert('Methode des Objekts') };
b.m(); // -> Methode des Objekts
a.m(); // -> Methode der Klasse
> Soweit ich das überblicke gehen bei Perl und JS ähnliche Dinge, bei
> denen ein Javaprogrammierer sofort tot umfallen würde,
Die dynamischen, typfreien Sprachen a la Perl, Ruby, Python
und auch Javascript spielen in einer völlig anderen Liga.
Java-Programmierer verstehen oft nicht, dass sie in einem
Korsett stecken, das sie stark einengt.
> nur JS ist da
> flexibler insofern das du keinerlei Verrenkungen über Referenzen machen
> musst, du kannst jederzeit jedes Objekt beliebig erweitern oder ändern.
Das geht in Perl genauso wie in JS (Operator -> statt .).
Nur dass Methoden auf Objektebene, siehe oben, in Perl eben nicht
definiert/überschrieben werden können.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Parsen von JavaScript Code
am 11.07.2007 08:56:51 von Ferry Bolhar
Frank Seitz:
> Das geht in Perl genauso wie in JS (Operator -> statt .).
> Nur dass Methoden auf Objektebene, siehe oben, in Perl eben nicht
> definiert/überschrieben werden können.
Ja, weil in JS Objektmethoden auch nur Attribute eines Objektes sind,
die natürlich geändert werden können. In Perl hingegen sind Methoden
(= Funktionen) immer global, da es keine lexikalischen Funktionen gibt,
die man an Objekte binden könnte.
Aber wird es in Perl 6 nicht so etwas Ähnliches in der Form von
"Rollen" geben?
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Parsen von JavaScript Code
am 11.07.2007 09:07:30 von Moritz Lenz
Hallo,
Ferry Bolhar wrote:
> Frank Seitz:
>=20
>> Das geht in Perl genauso wie in JS (Operator -> statt .).
>> Nur dass Methoden auf Objektebene, siehe oben, in Perl eben nicht
>> definiert/überschrieben werden können.
>=20
> Ja, weil in JS Objektmethoden auch nur Attribute eines Objektes sind,
> die natürlich geändert werden können. In Perl hingegen sind Metho=
den
> (=3D Funktionen) immer global, da es keine lexikalischen Funktionen gib=
t,
> die man an Objekte binden könnte.
Naja, mit AUTOLOAD-Magie könnte man so etwas vermutlich schon erreichen=
> Aber wird es in Perl 6 nicht so etwas Ähnliches in der Form von
> "Rollen" geben?
Rollen sind einfach nur Sammlungen von Methoden, aber man kann Objekten
zur Laufzeit noch Rollen zuweisen (wenn ich mich richtig erinnere
entweder mit 'does' oder mit 'but', aber OO in p6 war noch nie meine
Stärke).
Grüße,
Moritz
--=20
Moritz Lenz
http://perl-6.de/ http://moritz.faui2k3.org/
Re: Parsen von JavaScript Code
am 11.07.2007 09:33:17 von Ferry Bolhar
Frank Seitz:
> Zur ursprünglichen Aufgabenstellung: Wenn der Code aus
> einfachen Deklarationen besteht und keine dynamischen
> Verrenkungen enthält, kann man durch Parsing wissenswerte
> Dinge sicherlich zuverlässig herausfinden.
Genau darum geht es. Es werden in ellenlangen Deklarationen
Objekte, derenAttribute und Defaultwerte und Methoden
deklariert. Und natürlich gibt es auch Prototype-Deklarationen.
Code im eigentlichen Sinn ist kaum dabei. In C gesprochen,
kann man sich das Ganze als ein Sammelsurium von .h-Dateien,
die sich teilweise ergänzen bzw. untereinander referenzieren,
vorstellen.
Ich hatte eben gehofft, mir durch einen guten Parsing-Ansatz
die Arbeit des Entflechtens etwas erleichtern zu können.
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Parsen von JavaScript Code
am 11.07.2007 10:20:23 von Frank Seitz
Ferry Bolhar wrote:
> Frank Seitz:
>>
>>Das geht in Perl genauso wie in JS (Operator -> statt .).
>>Nur dass Methoden auf Objektebene, siehe oben, in Perl eben nicht
>>definiert/überschrieben werden können.
>
> Ja, weil in JS Objektmethoden auch nur Attribute eines Objektes sind,
> die natürlich geändert werden können.
Ja.
> In Perl hingegen sind Methoden (= Funktionen) immer global,
Naja, global stimmt nicht, sie sind der Klasse (dem Package)
zugeordnet.
> da es keine lexikalischen Funktionen gibt,
> die man an Objekte binden könnte.
Was verstehst Du unter einer lexikalischen Funkton?
Auch in Perl kann man natürlich eine Subroutine an
ein Objektattribut binden. Nur hat dieses Konstrukt nicht
den Status einer Methode.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Parsen von JavaScript Code
am 11.07.2007 10:29:34 von Frank Seitz
Moritz Lenz wrote:
> Naja, mit AUTOLOAD-Magie könnte man so etwas vermutlich schon erreichen.
Ja, mit AUTOLOAD kann man sich sicherlich sowas hinbasteln.
Die direkte Unterstützung von Singleton Methods (so heißen sie in Ruby)
fehlt allerdings.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Parsen von JavaScript Code
am 11.07.2007 10:43:41 von struebig
Ferry Bolhar schrieb:
> Genau darum geht es. Es werden in ellenlangen Deklarationen
> Objekte, derenAttribute und Defaultwerte und Methoden
> deklariert. Und natürlich gibt es auch Prototype-Deklarationen.
>
> Code im eigentlichen Sinn ist kaum dabei. In C gesprochen,
> kann man sich das Ganze als ein Sammelsurium von .h-Dateien,
> die sich teilweise ergänzen bzw. untereinander referenzieren,
> vorstellen.
Ich glaube ich kenne diese Bibliothek/Framework (mir fällt aber die
Bezeichnung nicht ein), obwohl ich mich seit Jahren mit JS intensiv
beschäftige fand ich deren Code auch beängstigend und letztlich für die
meisten Sachen die mit JS passieren sollen auch einfach overkill und
meines erachtens auch zuviel des Gutens.
> Ich hatte eben gehofft, mir durch einen guten Parsing-Ansatz
> die Arbeit des Entflechtens etwas erleichtern zu können.
Tja, mein Eindruck war, dass JE nicht funktioniert (das von Slaven
gezeigte Modul) und mit Sicherheit nicht bei vielen einzelenen Dateien
die zusammengehören. Wie schon gesagt, mein Eindruck ist, dass es nur
schwer möglich ist einen Parser zu schreiben, der nur mal eben den Code
analysiert, dazu muss dieser schon Kenntnisse haben über das komplette
Umfeld.
Es ist ja schon so, dass die Browserparser teilweise unterschieldicher
Meinung sind. ein einfaches Beispiel (das man auch als Perler versteht):
var obj = {
key1: 'val',
key2: 'val',
};
Der IE (zumindest bis 6) schmeisst eine Fehlermeldung wegen dem letzten
Komma in der Liste, FF nicht.
Oder wie soll ein Parser, ohne Browser so was auswerten:
var body = ( window.document.compatMode && window.document.compatMode ==
"CSS1Compat")
?
function() { return window.document.documentElement; }
:
function() { return window.document.body; }
body().clientWidth;
Er hat keine Ahnung von document.compatMode
(Ist ein bisschen fiktiv, da man sowas anders machen würde)
Struppi.
Re: Parsen von JavaScript Code
am 11.07.2007 10:47:51 von struebig
Frank Seitz schrieb:
> Ja das meine ich. Ich würde es so demonstrieren:
Jaja, ich hatte deinen Beitrag nicht richtig gelesen (meiner ist hier
auch gecancelt, aber ich hab sowas zum ersten mal gemacht und kenn
diesen Mechanismus nicht).
>> nur JS ist da
>> flexibler insofern das du keinerlei Verrenkungen über Referenzen machen
>> musst, du kannst jederzeit jedes Objekt beliebig erweitern oder ändern.
>
> Das geht in Perl genauso wie in JS (Operator -> statt .).
> Nur dass Methoden auf Objektebene, siehe oben, in Perl eben nicht
> definiert/überschrieben werden können.
Wieso nicht?
Du kannst doch so:
*{'objekt::' . $func} = sub {...}
jederzeit Methoden erzeugen und bei Bedarf auch überschreiben
Struppi.
Re: Parsen von JavaScript Code
am 11.07.2007 10:52:06 von Frank Seitz
J. Strübig wrote:
> Frank Seitz schrieb:
>>
>>Das geht in Perl genauso wie in JS (Operator -> statt .).
>>Nur dass Methoden auf Objektebene, siehe oben, in Perl eben nicht
>>definiert/überschrieben werden können.
>
> Wieso nicht?
> Du kannst doch so:
> *{'objekt::' . $func} = sub {...}
> jederzeit Methoden erzeugen und bei Bedarf auch überschreiben
Ja, aber diese gelten für alle Objekte der Klasse.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Parsen von JavaScript Code
am 11.07.2007 12:52:04 von hjp-usenet2
On 2007-07-11 08:43, J. Strübig wrote:
> Es ist ja schon so, dass die Browserparser teilweise unterschieldicher
> Meinung sind. ein einfaches Beispiel (das man auch als Perler versteht):
>
> var obj = {
> key1: 'val',
> key2: 'val',
> };
> Der IE (zumindest bis 6) schmeisst eine Fehlermeldung wegen dem letzten
> Komma in der Liste, FF nicht.
Da sehe ich das Problem nicht. Wenn man diesen Code parsen will, muss
der Parser halt abschlieÃende Kommas erlauben (so wie der von FF das
offenbar tut).
> Oder wie soll ein Parser, ohne Browser so was auswerten:
>
> var body = ( window.document.compatMode && window.document.compatMode ==
> "CSS1Compat")
> ?
> function() { return window.document.documentElement; }
>:
> function() { return window.document.body; }
>
> body().clientWidth;
>
> Er hat keine Ahnung von document.compatMode
Der Parser soll das gar nicht auswerten, er soll das nur parsen (drum
heiÃt er "Parser" und nicht "Interpreter"). D.h., der Parser soll einen
Syntax-Tree zurückliefern, der ungefähr so aussieht:
variable_declaclaration
variablename "body"
conditional_expression
&&
compound_name "window.document.compatMode"
==
compound_name "window.document.compatMode"
string_literal "CSS1Compat"
function_declaration
empty_name
block
statement
return
compound_name "window.document.documentElement"
function_declaration
empty_name
block
statement
return
compound_name "window.document.body"
(oder - äquivalent dazu: Es wird kein Baum erzeugt, sondern es werden
für jeden Knoten entsprechende Callbacks aufgerufen).
Was man dann mit diesem Syntax-Tree macht, ist nicht mehr Sache des
Parsers.
Es kann sein, dass es unmöglich ist, einen Parser für JavaScript zu
schreiben, der nicht gleichzeitig ein JavaScript-Interpreter ist (so wie
nur perl Perl parsen kann), aber ich glaube es eher nicht.
Es ist weiterhin möglich, dass Ferrys eigentliches Problem (das Parsen
ist ja nur ein kleiner Teil davon) äquivalent zum Halteproblem ist. Dann
hat er natürlich Pech gehabt :-).
hp
--
_ | Peter J. Holzer | I know I'd be respectful of a pirate
|_|_) | Sysadmin WSR | with an emu on his shoulder.
| | | hjp@hjp.at |
__/ | http://www.hjp.at/ | -- Sam in "Freefall"
Re: Parsen von JavaScript Code
am 11.07.2007 17:23:03 von hjp-usenet2
On 2007-07-11 08:52, Frank Seitz wrote:
> J. Strübig wrote:
>> Frank Seitz schrieb:
>>>Das geht in Perl genauso wie in JS (Operator -> statt .).
>>>Nur dass Methoden auf Objektebene, siehe oben, in Perl eben nicht
>>>definiert/überschrieben werden können.
>>
>> Wieso nicht?
>> Du kannst doch so:
>> *{'objekt::' . $func} = sub {...}
>> jederzeit Methoden erzeugen und bei Bedarf auch überschreiben
>
> Ja, aber diese gelten für alle Objekte der Klasse.
Ja.
Man kann natürlich on the fly neue Klassen erzeugen und die Objekte
entsprechend blessen. Soweit ich weiÃ, brauchen Klassen unter Perl
allerdings zwingend Namen, also muss man für Klassen mit genau einem
Objekt eindeutige Namen finden - z.B. durch UUIDs.
hp
--
_ | Peter J. Holzer | I know I'd be respectful of a pirate
|_|_) | Sysadmin WSR | with an emu on his shoulder.
| | | hjp@hjp.at |
__/ | http://www.hjp.at/ | -- Sam in "Freefall"
Re: Parsen von JavaScript Code
am 11.07.2007 17:38:34 von Ferry Bolhar
J. Strübig:
> var obj = {
> key1: 'val',
> key2: 'val',
> };
> Der IE (zumindest bis 6) schmeisst eine Fehlermeldung wegen dem letzten
> Komma in der Liste, FF nicht.
Na ja, das liegt wohl an den unterschiedlichen Implementierungen
in den Browsern. Ich weiß nicht, was ECMA-262 dazu sagt, aber
ich vermute mal, in einem der beiden Browser wird's richtig imple-
mentiert sein, im anderen nicht. Im Fall des Parsers ist es ja nur die
Frage, wie die entsprechende Grammatik, nachder er das Parsing
durchführt, aussieht.
> Oder wie soll ein Parser, ohne Browser so was auswerten:
Vorsicht! Auswerten soll er gar nichts, er soll nur _parsen_ und
entweder einen Syntaxbaum bilden, den ich nachher "abgrasen"
kann oder für jedes Element (Token) eine von mir zur Verfügung
gestellte Callback-Funktion aufrufen, mittels derer ich den Baum
selbst bilden kann. So hätte ich es mir zumindest vorgestellt...
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Parsen von JavaScript Code
am 11.07.2007 17:59:04 von Frank Seitz
Peter J. Holzer wrote:
> On 2007-07-11 08:52, Frank Seitz wrote:
>>J. Strübig wrote:
>>>Frank Seitz schrieb:
>>>
>>>>Das geht in Perl genauso wie in JS (Operator -> statt .).
>>>>Nur dass Methoden auf Objektebene, siehe oben, in Perl eben nicht
>>>>definiert/überschrieben werden können.
>>>
>>>Wieso nicht?
>>>Du kannst doch so:
>>>*{'objekt::' . $func} = sub {...}
>>>jederzeit Methoden erzeugen und bei Bedarf auch überschreiben
>>
>>Ja, aber diese gelten für alle Objekte der Klasse.
>
> Ja.
>
> Man kann natürlich on the fly neue Klassen erzeugen und die Objekte
> entsprechend blessen. Soweit ich weiÃ, brauchen Klassen unter Perl
> allerdings zwingend Namen, also muss man für Klassen mit genau einem
> Objekt eindeutige Namen finden - z.B. durch UUIDs.
Für jedes Objekt eine Klasse zu erzeugen, ist sicherlich zu teuer,
wenn man mehr als ein paar Objekte hat. Ich könnte mir eine
recht einfache Lösung mit AUTOLOAD vorstellen.
GrüÃe
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Parsen von JavaScript Code
am 11.07.2007 23:10:20 von Ch Lamprecht
Moritz Lenz schrieb:
> Hallo,
>
> Ferry Bolhar wrote:
>
> Naja, mit AUTOLOAD-Magie könnte man so etwas vermutlich schon erreichen.
>
>
>>Aber wird es in Perl 6 nicht so etwas Ähnliches in der Form von
>>"Rollen" geben?
>
>
> Rollen sind einfach nur Sammlungen von Methoden,
Rollen können auch Attribute definieren.
Grüße
--
use Tk;use Tk::GraphItems;$c=tkinit->Canvas->pack;push@i,Tk::GraphItems ->
TextBox(text=>$_,canvas=>$c,x=>$x+=70,y=>100)for(Just=>anoth er=>Perl=>Hacker);
Tk::GraphItems->Connector(source=>$i[$_],target=>$i[$_+1])fo r(0..2);
$c->repeat(30,sub{$_->move(0,4*cos($d+=3.16))for(@i)});MainL oop