Problem D
Formelkoll
Introduktion
Molekylformler beskriver hur molekyler är uppbyggda. Molekylformler kan innehålla atomer, parenteser och siffror, exempelvis H$_2$O (vatten) eller Ba(NO$_3$)$_2$ (bariumnitrat).
Uppgift
Din uppgift är att utföra en syntaxanalys på indata. Du ska läsa in en sträng från standard input och sedan tala om ifall formeln är syntaktiskt korrekt eller inte. Om den inte är korrekt ska du även skriva ut vad som är fel och var i formeln felet uppstod. Till din hjälp får du nedan en BNF-syntax för molekylformler och en lista med atomer. Observera att alla atomer som finns med i listan räknas som korrekta. (Atomer som inte finns med i periodiska systemet räknas som inkorrekta men du behöver inte implementera alla atomer). Använd lämpligen rekursiv medåkning.
BNF-syntax
<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 | ...
Här är en lista på atomer:
H He Li Be B C N O F Ne Na Mg Al Si P S Cl Ar K Ca Sc Ti V Cr Mn Fe Co Ni Cu Zn Ga Ge As Se Br Kr Rb Sr Y Zr Nb Mo Tc Ru Rh Pd Ag Cd In Sn Sb Te I Xe Cs Ba La Ce Pr Nd Pm Sm Eu Gd Tb Dy Ho Er Tm Yb Lu Hf Ta W Re Os Ir Pt Au Hg Tl Pb Bi Po At Rn Fr Ra Ac Th Pa U Np Pu Am Cm Bk Cf Es Fm Md No Lr Rf Db Sg Bh Hs Mt Ds Rg Cn Fl Lv
Indata
Programmet ska läsa in en eller flera rader från standard input. Varje rad ska representera en (korrekt eller inkorrekt) formel. Inläsningen ska avslutas då tecknet $\# $ hittas.
Utdata
För varje rad programmet har läst in (utom raden med $\# $) ska programmet berätta om formeln var syntaktiskt korrekt eller vilket fel som hittades. Om formeln innehöll flera fel ska bara det första felet skrivas ut. Var noga med att skriva output på exakt samma format som visas i exemplet nedan.
Sample Input 1 | Sample Output 1 |
---|---|
Na H2O Si(C3(COOH)2)4(H2O)7 Na332 # |
Formeln är syntaktiskt korrekt Formeln är syntaktiskt korrekt Formeln är syntaktiskt korrekt Formeln är syntaktiskt korrekt |
Sample Input 2 | Sample Output 2 |
---|---|
C(Xx4)5 C(OH4)C C(OH4C H2O)Fe H0 H1C H02C Nacl a (Cl)2)3 ) 2 # |
Okänd atom vid radslutet 4)5 Saknad siffra vid radslutet C Saknad högerparentes vid radslutet Felaktig gruppstart vid radslutet )Fe För litet tal vid radslutet För litet tal vid radslutet C För litet tal vid radslutet 2C Saknad stor bokstav vid radslutet cl Saknad stor bokstav vid radslutet a Felaktig gruppstart vid radslutet )3 Felaktig gruppstart vid radslutet ) Felaktig gruppstart vid radslutet 2 |