Hide

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

Ditt program behöver klara av åtminstone de 18 första atomerna i periodiska systemet, dvs:

H He Li Be B C N O F Ne Na Mg Al Si P S Cl Ar

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 och med exakt samma ord som visas i exemplet nedan.

Sample Input 1 Sample Output 1
Na
H2O
Si(C3(COOH)2)4(H2O)7
#
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
H0
H1C
Nacl
#
Okänd atom vid radslutet 4)5
Saknad siffra vid radslutet C
Saknad högerparentes vid radslutet
För litet tal vid radslutet
För litet tal vid radslutet C
Saknad stor bokstav vid radslutet cl

Please log in to submit a solution to this problem

Log in