// // Esimerkki Ohj.kielten periaatteet -kurssille, Arto Wikla // // Hyvin yksinkertainen rekursiivisesti etenevä jäsentäjä // lausekkeille, jotka muodostuvat yksinumeroisista luvuista, // kaksijäsenisistä yhteen- ja kertolaskuista sekä sulkuihin // kirjoitetuista samanrakenteisista lausekkeista. Välilyönnit // eivät ole sallittuja, virhediagnostiikka on alkeellinen. // Jäsentäjään on semantiikaksi liitetty infix-syötelausekkeen // tulostaminen postfix-muodossa. // Ohjelma on scala-skripti: ohjelma vain tiedostoon ja tuo // tiedosto parametriksi komennolle scala! // // kielioppi: // Lauseke => Yhtlaskettava | Yhtlaskettava + Yhtlaskettava // Yhtlaskettava => Kerrottava | Kerrottava * Kerrottava // Kerrottava => 0|1|2|3|4|5|6|7|8|9 | (Lauseke) // // selaaja: val infix:String = scala.io.StdIn.readLine + " " // indeksointivirheen esto var osoitin = 0 def etene {osoitin+=1} def seuraava_alkio: Char = {infix(osoitin)} // aktiivi alkio // jäsentäjä: def Lauseke { Yhtlaskettava if (seuraava_alkio=='+') { etene Yhtlaskettava print("+") } } def Yhtlaskettava { Kerrottava if (seuraava_alkio=='*') { etene Kerrottava print("*") } } def Kerrottava { if ("012345679".indexOf(seuraava_alkio) != -1) { print(seuraava_alkio) etene } else if (seuraava_alkio=='(') { etene Lauseke if (seuraava_alkio != ')') println("LOPPUSULKU PUUTTUU!") else etene } } Lauseke println