07. maj 2003 - 21:21Der er
24 kommentarer og 1 løsning
Rekursiv metode
Jeg er ved at løse en opgave, som går ud på at skrive en metode, som finder ud af om en streng følger en bestemt syntaks og returnerer en boolean.
Syntaksen: Stregen skal enten være "x" eller bestå af to syntaktiskt gyldige strenge adskilt af '+' og omsluttet af parenteser: Fx: "x" "(x+x)" "((x+x)+x)"
Her er min kode:
public class Testing { public static void main(String[] args) { if(xsyntaks("(x+x)")) System.out.println("Kanon!"); else System.out.println("Lort!"); }
public static boolean xsyntaks(String str) { if (str=="x") { return true; }
//Til test af programmet System.out.println("x er ikke det samme som "+str);
int plus = str.indexOf('+'); String s1,s2; boolean b1, b2, b3, b4, ok=false;
nok lidt for hurtig, JVM laver normalt alias'er af ens strenge. Åbentbart ikke ved rekursive (måske statiske? ) metodekald - ikke altid i hvert fald.
Dit eksempel er det første jeg ser hvor == ikke kan benyttes - hvor der ikke oprettes en streng med new -
Også hedder det sig jo også at man bør bruge equals på strenge, men egentlig tak for et eksempel der viste det, har ledt efter sådan et. (selvom det ikke var det du ville vise :)
codemon>> Hvordan ved du om det i mit eksempel ikke skyldes at metoden substring bruger new. Det er jo netop en substring der bliver sendt videre rekursivt.
Problemet med manuel parsning som du gør er at der er så meget der skal testes for.
Prøv f.eks. bare at kør dit program på " (x+x)" !
(et lille skide mellemrum og puf)
Overvej også hvordan din kode ville se ud hvis der skulle tillades: - vilkårlige variabel navne (hvor alt undtagen første tegn også kan være tal) - integer konstanter - tilføje -*/
Det vil hurtigt blive rigtigt mange: if && ||.
Løsningen på det er en mere struktureret parser. Enten skrevet manuelt eller genereret med en parser generator.
Med en parse generator skriver man en grammatik og så genererer man kode udfra den grammatik til at parse med.
Det har store fordele ved bare lidt mere komplekse ting.
Det bruges meget i C/C++ med yacc/bison (og lex/flex).
Det er ikke helt så udbredt i Java, men der eksisterer faktisk parser generatorer for Java: JavaCC, CUP (og JLex) og nogle stykker mere som jeg ike lige kan huske navnene på.
I dit tilfælde vil en grammatik se nogenlunde ud som (skitseret - det er mig bekendt ikke legal grammatik syntax i nogen specifik parser generator):
Det lyder smart! Jeg vil huske på at der eksisterer sådanne generatorer, når jeg engang skal lave noget mere omfattende. Dette er en programmeringsopgave, som jeg har fået på mit studium, og det ville derfor være snyd at aflevere automatisk genereret kode... Jeg siger dog stadig tak for en brugbar forklaring!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.