| 

.NET C# Java Javascript Exception

Prüfen der Syntax

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


Prüfen der Syntax

JD - 02.09.2010 15:23
Hallo Leute,

auf der Suche nach einer Lösung des obengenannten und im Weiteren näher beschrieben Problems bin ich auf dieses Forum gestoßen und hoffe hier Hilfe zu finden. :)

Zur Problembeschreibung: Im Rahmen meiner Belegarbeit muss ich ein als Textfile bzw. String gegebenes Skript auf die Richtigkeit prüfen und anschließend mit erweiterten Zuweisungen in Java einbetten. Der zweite Teil ist aktuell nur wenig problematisch, die Syntaxprüfung bereitet allerdings einiges an Sorgen. Im Endprodukt soll zur Laufzeit auf inkorrekte Schreibweise hingewiesen werden können.
Vornweg mal ein Beispiel-Skript, wobei der else-Zweig einen Fehler enthält (pritln statt println):
def d = true;
if(d) { 
println 'Hello World!' ;
}else{
pritln('test')
}
Zur Überprüfung der Korrektheit bot sich zunächst Groovyshell.evaluate() an. Diese Methode ist aber nicht vollständig geignet, da sie nur das Skript kompiliert und dieses mit aktuellen Bindings ausführt. So gelangt sie allerdings nie in den else-Zweig, weil dieser nie immer erreichbar ist und hält deswegen das Skript für korrekt.

Der zweite Ansatz ist ein wenig unständlicher: Zuerst wird GroovyClassLoader.parseClass() das Skript zu einer Klasse kompiliert und davon ein Objekt erstellt. Dannach, zerlege ich dieses Objekt per Reflections und hole mir die Namen der CallSites, die die Methoden des Skripts und alle undeffinierten Variablen darstellen. Anschließend lasse ich mir die Methodennamen der erschaffenen Klasse, deren Metaklasse und der darin als Fields enthaltenen Klassen geben und schauen, ob für jeden CallSite-Namen eine Methode deklariert ist. Dies funktioeniert recht gut auch fürs folgende leicht abgeänderte Beispiel:
def d = true;
if(d) { 
System.out.println('Hello World!');
}else{
pritln('test')
}
Allerdings habe ich keine Möglichkeit die Zusamenhänge zwischen einzellnen CallSites zu prüfen, so ist beispielsweise wäre der mit der zweiten Methode auch folgendes gültig ( da out in der System-Klasse als Feld deklariert ist):
def d = true;
if(d) { 
System.out.println('Hello World!');
}else{
out ('test')
}
Ich sehe möglicherweise den Wald vor lauter Bäumen nicht mehr und bitte deswegen um euren Rat, wie ich die Aufgabe umsetzen könnte.

Gruß


Re: Prüfen der Syntax

Wicki - 03.09.2010 08:25
Hallo,

vielleicht solltest Du die Callsites per invokeMethod aufrufen und evtl. Exceptions abfangen.
Apropos Callsites, zeig doch bitte mal wie Du an diese Callsites rankommst.

Gruß Wicki


Re: Prüfen der Syntax

JD - 08.09.2010 07:53
Hallo,

das Aufrufen der Callsites ist zwar ne logische Schlußfolgerung, diese bieten jedoch mehrere call-Methoden, daher wohl schwer zu handlen. Ich habs jedoch noch nicht versucht, die Exceptions auszuwerten und werde dies jetzt mal testen.

Hat vielleicht noch jemand Ideen? :)

An die Callsites komme in dem ich das CallSite-Array des neuerschaffnen Objekt der erstellten Groovyklasse mit Hilfe der zugehörigen Methode mir gebenlasse:
//create a class from groovyscript
ClassLoader parent = getClass().getClassLoader();
GroovyClassLoader loader = new GroovyClassLoader(parent);
Class<?> groovyClass = loader.parseClass(file);
//create an object of the groovyClass
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
//get CallSite-Array
for (Method groovyMethod : groovyClass.getDeclaredMethods()){
  if (groovyMethod.getName().equals("$getCallSiteArray")){
    groovyMethod.setAccessible(true);
    try {
      Object callSiteObject = groovyMethod.invoke(groovyObject, new Object[]{});
      if (callSiteObject instanceof CallSite[]){
         CallSite[] callSites = (CallSite[]) callSiteObject;
         /*do something*/
      }
     } catch (Throwable t) {
        t.printStackTrace();
     }
   }
}


Re: Prüfen der Syntax

JD - 08.09.2010 14:07
Ein kleiner Nachtrag von mir:
Das Aufrufen der CallSites wäre wohl eine Option, jedoch nützt sie nicht viel ohne genauer Kenntnis der Abhängigkeiten zwischen diesen und die bleibt verborgen.

Ich bin fürs erste ratlos...


Re: Prüfen der Syntax

badbadverybad - 20.10.2010 18:03
JD schrieb:
-------------------------------------------------------
> Ich sehe möglicherweise den Wald vor lauter Bäumen
> nicht mehr

Kann ich verstehen. Und Deine (zweite) Methode reicht ja noch nicht einmal: Die "fehlende" Methode kann die einer Superklasse sein, oder zur Laufzeit der MetaClass zugewiesen sein, oder sie fehlt, weil ihr Aufruf über invokeMethod(..) zur Laufzeit abgefangen werden soll, oder ...

> und bitte deswegen um euren Rat, wie
> ich die Aufgabe umsetzen könnte.

Leider gar nicht. - Kompakte Methoden schreiben und reichlich Unit-Tests dazu.
Oder Deine Klassen mit - dem bislang noch verbuggten - Groovy++ statisch kompilieren, um compile-time checks zu bekommen.

Der ganze Bereich "dynamische Meta-Programmierung" in Groovy ist sowas von grottig ...


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "Prüfen der Syntax" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.