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