Hey,
Ik ben bezig met een parser te schrijven voor een spreadsheet. Hiervoor gebruik ik de ingebouwde StreamTokenizer.
Dit werkt goed voor eenvoudige uitdrukkingen als 5*6/8...
Ook constanten (gedefinieerd door '$' en dan de naam) werken ook goed.
Dus als je een constante 'pi' aanmaakt met de waarde 3.14159265358979323846 (uit mijn hoofd
)
dan gaat '5*5*$pi' evalueren tot de oppervlakte van een cirkel met straal 5.
Dit doe ik, door als ik de token '$' tegenkom, een token verder te lezen, die me dan een naam teruggeeft (TT_WORD).
Nu wil ik ook geavanceerdere functies gebruiken. Zoals SIN(5+8-9*8/2) etc.
Als ik dit laat tokenizen, dan krijg ik voor SIN een TT_WORD terug. Ik zou nu kunnen kijken naar de waarde, en kijken of het een SIN is en dan de sinus berekenen, dat is opzich niet zo'n probleem.
Probleem is wel dat als je een constante 'SIN' zou maken, en dan 59+$SIN parst, je dan eerst ziet dat er een $ staat en je dus een constante wil hebben, maar dan krijg je van de volgende getToken() geen woord terug, maar een sinus wat problemen geeft...
Dus in het kort:
Is er een mogelijkheid om op een propere manier StreamTokenizer in te stellen dat die nieuwe types parst?
of kan ik beter gewoon mijn eigen Streamtokenizer schrijven (waarmee ik nu al bezig ben...)
Of is er een mogelijkheid om '$' toe te voegen aan de karakters die hij als word bestempeld ofzo?
Zoo typissch, net de vraag gesteld en dan zelf op een oplossing komen
Gewoon ipv reursief getToken() op te roepen, getWordToken() maken en die oproepen
Dat zou moeten werken
Ik ben bezig met een parser te schrijven voor een spreadsheet. Hiervoor gebruik ik de ingebouwde StreamTokenizer.
Dit werkt goed voor eenvoudige uitdrukkingen als 5*6/8...
Ook constanten (gedefinieerd door '$' en dan de naam) werken ook goed.
Dus als je een constante 'pi' aanmaakt met de waarde 3.14159265358979323846 (uit mijn hoofd
dan gaat '5*5*$pi' evalueren tot de oppervlakte van een cirkel met straal 5.
Dit doe ik, door als ik de token '$' tegenkom, een token verder te lezen, die me dan een naam teruggeeft (TT_WORD).
Nu wil ik ook geavanceerdere functies gebruiken. Zoals SIN(5+8-9*8/2) etc.
Als ik dit laat tokenizen, dan krijg ik voor SIN een TT_WORD terug. Ik zou nu kunnen kijken naar de waarde, en kijken of het een SIN is en dan de sinus berekenen, dat is opzich niet zo'n probleem.
Probleem is wel dat als je een constante 'SIN' zou maken, en dan 59+$SIN parst, je dan eerst ziet dat er een $ staat en je dus een constante wil hebben, maar dan krijg je van de volgende getToken() geen woord terug, maar een sinus wat problemen geeft...
Dus in het kort:
Is er een mogelijkheid om op een propere manier StreamTokenizer in te stellen dat die nieuwe types parst?
of kan ik beter gewoon mijn eigen Streamtokenizer schrijven (waarmee ik nu al bezig ben...)
Of is er een mogelijkheid om '$' toe te voegen aan de karakters die hij als word bestempeld ofzo?
Zoo typissch, net de vraag gesteld en dan zelf op een oplossing komen
Gewoon ipv reursief getToken() op te roepen, getWordToken() maken en die oproepen
Dat zou moeten werken
[ Voor 9% gewijzigd door Teun_2 op 13-04-2008 13:28 ]