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