bild
Skolan för
elektroteknik
och datavetenskap

Laboration 6 - Formelkoll

Detta program ska l�sa in molekylformler och kolla att dom �r syntaktiskt korrekta. I terminalf�nstret st�lls fr�gorna, t ex
   Molekyl: Si(C3(COOH)2)4(H2O)7
   Formeln �r syntaktiskt korrekt
   Molekyl: Ag7(FyOj6)17
   Ok�nt atomnamn Fy vid radslutet Oj6)17
   Molekyl: H1SO4
   F�r litet tal vid radslutet SO4
   Molekyl: Ca(OH)NO3
   Saknad siffra vid radslutet NO3
   Molekyl: Na(OH
   Saknad h�gerparentes vid radslutet
   Molekyl: Nacl
   Saknad stor bokstav vid radslutet cl
N�r anv�ndaren trycker retur utan att ha skrivit n�gon formel ska slingan brytas och programmet avslutas.

Syntaxanalys

Syntaxen f�r molekylformler kan beskrivas s� h�r i BNF-notation:
<formel>::= <mol> \n
<mol>   ::= <group> | <group><mol>
<group> ::= <atom> |<atom><num> | (<mol>) <num>
<atom>  ::= <LETTER> | <LETTER><letter>
<LETTER>::= A | B | C | ... | Z
<letter>::= a | b | c | ... | z
<num>   ::= 2 | 3 | 4 | ...
Ditt program ska l�sa formeln tecken f�r tecken och med rekursiv med�kning kolla syntaxen. Eftersom det �r l�ttast att l�sa hela raden f�r du g�ra det och sedan l�gga in alla tecken i en k�. Avsluta med returtecknet, s� h�r.
   rad=raw_input("Molekyl:")
   for tkn in rad: q.put(tkn)
   q.put("\n")
Rekursiv med�kning inneb�r att huvudprogrammet g�r anropet readformel(), att readformel() anropar readmol() som anropar readgroup() och sedan eventuellt sej sj�lv, att readgroup() antingen anropar readatom() eller l�ser en parentes och anropar readmol() etc - allt enligt grammatiken. N�r ett syntaxbrott uppt�cks genereras ett s�rfall (raise Exception,msg) som f�ngas i huvudprogrammet och d�r skrivs hela resten av k�n ut.

Man m�ste ofta tjuvtitta p� n�sta tecken f�r att veta vilken gren man ska f�lja i syntaxtr�det och d�rf�r b�r du i klassen Queue l�gga till metoden peek() som returnerar f�rsta v�rdet men l�ter k�n vara of�r�ndrad.









Frivillig extrauppgift

Molekylvikten kan din formelkoll samtidigt r�kna ut om du l�ter alla metoder returnera ett tal, n�mligen s� h�r

  • readatom returnerar en atomvikt med hj�lp av hashtabellen
  • readnum returnerar ett heltal
  • readgroup returnerar vikten av en molekylgrupp, t ex Na eller (OH)2
  • readmol returnerar vikten av en delmolekyl
  • readformel returnerar hela molekylvikten
Nu ska k�rningen se ut s� h�r.
Molekyl:Si(C3(COOH)2)4(H2O)7
Formeln �r syntaktiskt korrekt
Molekylvikt: 658.466



En j�tteprestation av................................. enligt............................ den ...............


Sidansvarig: Magnus Rosell <rosell@csc.kth.se>
Uppdaterad 2006-09-29