Parsovanie .java zdrojakov cestou najmensieho odporu
Ahoj. Maintainujem qtjambi/maven plugin a stojim pred rozhodnutim ci/a/alebo cim parsovat javovske zdrojaky. V principe mi ide o extrakciu textov k prekladu ( pokial niekto pouziva qt/qtjambi, ide mi o nahradu toolu lupdate ). Priklad: public class MainClass extends SomeObject { public void someMethod() { String s1 = tr(string1); String s2 = QApplication.translate(MyContext, string2); String s3 = QCoreApplication.translate(MyContext, string3, 5); //String s4 = QApplication.translate(MyContext, string4, 5); String s5 = QApplication.translate( MyContext, string5, 7); /* String s6 = tr(commented); */ } class InnerClass { void anotherMethod() { String s6 = tr(string6); } } } Z tohoto zdrojaku potrebujem vyextrahovat parameter pre tr() a prve dva parametre pre QApplication.translate() a QCoreApplication.translate(). Dalej v pripade tr() potrebujem vediet meno class-y ( MainClass ), pripadne aj rodicovskej classy (MainClass.InnerClass). Samozrejme k tomu spravne handlovat zakomentovane casti kodu a viacriadkove statementy. Vysledkom tohoto extraktu by bolo cosi podobne tomuto: MainClass,string1 MyContext,string2 MyContext,string3 MyContext,string5 MainClass.InnerClass,string6 Mam niekolko moznosti: - regexp ( primitivne, nezistim meno classy ) - nejaky vlastny tokenizer ( dlhsi cas vyvoja ) - zneuzit cosi existujuce ... ? Ako by ste na to sli vy? Dik -- Dusan ... tykajte mi
Re: Parsovanie .java zdrojakov cestou najmensieho odporu
A co parsovat bytecode pres ASM http://asm.ow2.org/? Zda se mi to jako nejlepsi cesta. Parsovat zdrojaky bych uvazoval az jako posledni vec. Pokud to nelze, kouknul bych napr. do Findbugshttp://findbugs.sourceforge.net/nebo Clirr http://clirr.sourceforge.net/ jestli tam nebude neco pouzitelneho... Petr Prochazka 2010/4/14 Dusan Zatkovsky msk.c...@gmail.com Ahoj. Maintainujem qtjambi/maven plugin a stojim pred rozhodnutim ci/a/alebo cim parsovat javovske zdrojaky. V principe mi ide o extrakciu textov k prekladu ( pokial niekto pouziva qt/qtjambi, ide mi o nahradu toolu lupdate ). Priklad: public class MainClass extends SomeObject { public void someMethod() { String s1 = tr(string1); String s2 = QApplication.translate(MyContext, string2); String s3 = QCoreApplication.translate(MyContext, string3, 5); //String s4 = QApplication.translate(MyContext, string4, 5); String s5 = QApplication.translate( MyContext, string5, 7); /* String s6 = tr(commented); */ } class InnerClass { void anotherMethod() { String s6 = tr(string6); } } } Z tohoto zdrojaku potrebujem vyextrahovat parameter pre tr() a prve dva parametre pre QApplication.translate() a QCoreApplication.translate(). Dalej v pripade tr() potrebujem vediet meno class-y ( MainClass ), pripadne aj rodicovskej classy (MainClass.InnerClass). Samozrejme k tomu spravne handlovat zakomentovane casti kodu a viacriadkove statementy. Vysledkom tohoto extraktu by bolo cosi podobne tomuto: MainClass,string1 MyContext,string2 MyContext,string3 MyContext,string5 MainClass.InnerClass,string6 Mam niekolko moznosti: - regexp ( primitivne, nezistim meno classy ) - nejaky vlastny tokenizer ( dlhsi cas vyvoja ) - zneuzit cosi existujuce ... ? Ako by ste na to sli vy? Dik -- Dusan ... tykajte mi
Re: Parsovanie .java zdrojakov cestou najmensieho odporu
On Wednesday 14 of April 2010 13:04:42 Petr Prochazka wrote: Na to asm sa pozriem, vychadzal som z predpokladu, ze za tak masivnou podporou refactoringu a kontrole syntaxe v IDE-ckach je cosi, co by mozno slo pouzit... D -- Dusan ... tykajte mi
Re: Parsovanie .java zdrojakov cestou najmensieho odporu
Idea ma podporu pro export string konstant do properties souboru (nebo jenom konstant? presne ted nevim), ale ja osobne to zatim jeste nepouzil. Eclipse a NB nevim, moc je nepouzivam... Jinak o nicem takovem nevim... Petr Prochazka 2010/4/14 Dusan Zatkovsky msk.c...@gmail.com On Wednesday 14 of April 2010 13:04:42 Petr Prochazka wrote: Na to asm sa pozriem, vychadzal som z predpokladu, ze za tak masivnou podporou refactoringu a kontrole syntaxe v IDE-ckach je cosi, co by mozno slo pouzit... D -- Dusan ... tykajte mi
RE: Parsovanie .java zdrojakov cestou najmensieho odporu
Určitě by měl jít použít AntLR. Gramatika pro Javu už je hotová, netřeba ji vymýšlet znova. A nedávno jsem narazil ještě na tohle, to by mohlo být ještě jednodušší než AntLR http://code.google.com/p/javaparser/wiki/UsingThisParser Tom -Original Message- From: konference-boun...@java.cz [mailto:konference-boun...@java.cz] On Behalf Of Dusan Zatkovsky Sent: Wednesday, April 14, 2010 1:05 PM To: konference@java.cz Subject: Parsovanie .java zdrojakov cestou najmensieho odporu Ahoj. Maintainujem qtjambi/maven plugin a stojim pred rozhodnutim ci/a/alebo cim parsovat javovske zdrojaky. V principe mi ide o extrakciu textov k prekladu ( pokial niekto pouziva qt/qtjambi, ide mi o nahradu toolu lupdate ). Priklad: public class MainClass extends SomeObject { public void someMethod() { String s1 = tr(string1); String s2 = QApplication.translate(MyContext, string2); String s3 = QCoreApplication.translate(MyContext, string3, 5); //String s4 = QApplication.translate(MyContext, string4, 5); String s5 = QApplication.translate( MyContext, string5, 7); /* String s6 = tr(commented); */ } class InnerClass { void anotherMethod() { String s6 = tr(string6); } } } Z tohoto zdrojaku potrebujem vyextrahovat parameter pre tr() a prve dva parametre pre QApplication.translate() a QCoreApplication.translate(). Dalej v pripade tr() potrebujem vediet meno class-y ( MainClass ), pripadne aj rodicovskej classy (MainClass.InnerClass). Samozrejme k tomu spravne handlovat zakomentovane casti kodu a viacriadkove statementy. Vysledkom tohoto extraktu by bolo cosi podobne tomuto: MainClass,string1 MyContext,string2 MyContext,string3 MyContext,string5 MainClass.InnerClass,string6 Mam niekolko moznosti: - regexp ( primitivne, nezistim meno classy ) - nejaky vlastny tokenizer ( dlhsi cas vyvoja ) - zneuzit cosi existujuce ... ? Ako by ste na to sli vy? Dik -- Dusan ... tykajte mi
Re: Parsovanie .java zdrojakov cestou najmensieho odporu
Eclipse má tiez( moz(nost( Externalize Strings Týka sa to String kons(tánt, aj Stringov vo volaní metód. Ak to chcete jednorazovo... Rastislav Bedo Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Z(ilina, Slovakia E-mail : sie...@prosoft.sk mailto:sie...@prosoft.sk Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 14. 4. 2010 13:15, Petr Prochazka wrote: Idea ma podporu pro export string konstant do properties souboru (nebo jenom konstant? presne ted nevim), ale ja osobne to zatim jeste nepouzil. Eclipse a NB nevim, moc je nepouzivam... Jinak o nicem takovem nevim... Petr Prochazka 2010/4/14 Dusan Zatkovsky msk.c...@gmail.com mailto:msk.c...@gmail.com On Wednesday 14 of April 2010 13:04:42 Petr Prochazka wrote: Na to asm sa pozriem, vychadzal som z predpokladu, ze za tak masivnou podporou refactoringu a kontrole syntaxe v IDE-ckach je cosi, co by mozno slo pouzit... D -- Dusan ... tykajte mi
RE: Parsovanie .java zdrojakov cestou najmensieho odporu
Na to asm sa pozriem, vychadzal som z predpokladu, ze za tak masivnou podporou refactoringu a kontrole syntaxe v IDE-ckach je cosi, co by mozno slo pouzit... Eclipse obsahuje JDT (Java Development Tools) - pomoci tohoto je v Eclipsu provaden refactoring a dalsi. Mimo jine obsahuje i parser zdrojovych kodu. http://www.vogella.de/articles/EclipseJDT/article.html S uspechem parseruju javovske zdrojaky ve svem Eclipse pluginu. Jak vykutat JDT do standalone java aplikace/antu/mavenu bohuzel netusim. Treba to zadny problem neni Na vykousani textu ze zdrojaku mozna ani nic tak sloziteho jako parser nepotrebujete. Treba by vam stacil lexer. Rozhodne nedoporucuji snazit se vykousavat texty pomoci regularnich vyrazu. :-) Michal Polak
Re: Parsovanie .java zdrojakov cestou najmensieho odporu
On Wednesday 14 of April 2010 14:46:50 Dusan Zatkovsky wrote: Bingo! Musim uznat, ze som sa tomu venoval tak 15 minut a mam to s javaparser skoro hotove! Diky diky. Keby to niekoho zaujimalo, moze sa inspirovat: File src = new File(src/main/java/test/App.java); CompilationUnit u = JavaParser.parse(src); new MethodVisitor().visit(u, null); // toto sa bude prekladat tr(tr string 1); this.tr(tr string 2); QApplication.translate(context1, text1); QApplication.translate(context2, text2, 3); // toto sa nebude prekladat // QApplication.translate(context3, text3, 3); // toto sa tiez nebude prekladat /* test QApplication.translate(context4, text4, 3); * */ private static class MethodVisitor extends VoidVisitorAdapter { private String className; public void visit(ClassOrInterfaceDeclaration n, Object arg) { this.className = n.getName(); super.visit(n, arg); } public void visit(MethodCallExpr n, Object arg) { String name = n.getName(); Expression scope = n.getScope(); List args = n.getArgs(); if (name.equals(tr)) { if (args.size() == 1) { Translator.translate( className, args.get(0).toString()); } } else if (name.equals(translate) scope != null scope.toString().equals(QApplication)) { if (args.size() == 2) { Translator.translate(args.get(0).toString(), args.get(1).toString()); } else if (args.size() == 3) { System.out.println(args.get(2)); Translator.translate(args.get(0).toString(), args.get(1).toString(), new Integer(args.get(2).toString()).intValue()); } } super.visit(n, arg); } } ... ake jednoduche ! -- Dusan ... tykajte mi