Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Java] Tokens aan tokenizer toevoegen.

Pagina: 1
Acties:

  • Teun_2
  • Registratie: Oktober 2003
  • Laatst online: 14-11 07:36
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 8)7 )
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 ]


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 29-10 20:56

Macros

I'm watching...

Als je nou een nog gecompeliceerdere parser gaat schrijven zou ik eens naar javacc kijken. Dan maak je een grammer, (er staan zat voorbeelden bij) en dan krijg je van javacc een interface die je moet implementeren. En dan werkt je parser. Dan kan je een net zo ingewikkelde parser maken als parsers voor java.

"Beauty is the ultimate defence against complexity." David Gelernter


  • Teun_2
  • Registratie: Oktober 2003
  • Laatst online: 14-11 07:36
Dank voor de link, maar ik zit u eigenlijk al te ver om nu nog te veranderen...
Ondertussen worden ook matrices en operaties daarop ondersteund.
Ik ga mijn code denk ik niet meer herschrijven. Het werkt nu eigenlijk al behoorlijk goed.
Had ik die link maar vroeger tegengekomen ;(
Ach ja, ik heb ondertussen wel veel bijgeleerd over parsen *O*

[ Voor 19% gewijzigd door Teun_2 op 13-04-2008 21:52 ]