Haluan tehdä yksinkertaisen laskukoneen, joka osaa purkaa laskutoimituksen merkkijonosta. Mutta miten sulkulausekkeet voisi purkaa helposti auki. esim (((1 1)/2)*(1*2)/1) ja oletetaan että näitä sulkupareja voisi olla n-määrä. Mites tällänen probleema kannttaisi tehdä?
laskutoimitus merkkijonosta
15+2
2212
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 2
Vanhimmat
Tässä kolme vaihtoehtoa. Valitse sen mukaan minkä ongelman haluat oikein ratkaista:
1. Jos haluat vain laskea lausekkeen arvon, yksinkertaisinta on antaa lauseke jollekin valmiille funktiolle, joka hoitaa asian. Python esimerkki:
lauseke = "(((1 1)/2)*(1*2)/1)"
vastaus = eval(lauseke)
2. Jos haluat toteuttaa itse mm. operaattorit (esim. -*/) ja laskujärjestyksen, yksinkertaisinta on määritellä laskimen operaatiot ja sen hyväksymä "kieli" jonkin valmiin jäsentäjätyökalun avulla. Näin säästyt lausekkeen jäsennykseltä. Python esimerkki: http://www.dabeaz.com/ply/example.html
3. Jos haluat urheilla oikein kunnolla ja tehdä kaiken jäsentäjästä alkaen, voit aloittaa esimerkiksi täältä: http://en.wikipedia.org/wiki/LR_parser
Yllä mainittu vaihtoehto 3 on se mikä kannattaa jossain vaiheessa ohjelmoinnin opettelua käydä läpi. Jäsentäjät ovat kuitenkin sen verran perus tietojenkäsittelyteoriaa, että jokaisen itseäänkunnioittavan ohjemoijan pitäisi olla kerran tehnyt sellaisen. Usein tällainen tehdäänkin ohjelmointiopinnoissa. Kannattaa lainata kirjastosta klassikkokirja "Aho, Sethi, and Ullman: Compilers, Principles, Techniques and Tools" ja lukea sieltä miten homma toimii. Käytännössä joku operator precedence -parseri tai recursive descent ovat helpompia aluksi kuin LR.