//
// 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