It's trickier than I first thought. Once while coursing engineering I implemented a Scheme interpreter in Scheme, that was like cheating, scheme knows how to parse itself, implementing some scheme-like thing in Rev is a brand new thing.
First I am trying to work the parser out. It's harder than I thought. I am looping the string with many functions searching it. My first design is to parse it all to a nice table, I am parsing from outtermost expression to innermost expression, I wanted to do different, to parse and evaluate from inner expression to outter, but didn't know how to do it, so I'll parse from top to bottom, then evaluate from bottom to up... My trick is to go parsing, found something put it in the symbol table, found a right parenthesis, evaluate that list. Since the first right parenthesis should always tag us that we can finally try to evaluate something. The parser is almost character by character based, meaning, it looks for the first char in a string, if it's a char then it passes the expression to a handler that will extract that word and create the symbol, if it is a number the same but with a number been created in the symbol table, if its a parenthesis tag the damn thing for latter organization, yes there's a problem with '() construct, but that's easily solved.
Your old box prime is here by my side, and it's aiding me very much, almost all programs I make use it. The thing I am trying to solve now is the matching parenthesis issue, I don't know if I try to solve it in the parser, or parse everything to a table and allow the evaluation function to handle everything. For now it's like, supposed you have this code:
(+ 1000 1)
this is parsed to the following table: #lp + 1000 1 #rp
where #lp and #rp are used for parenthesis identification and thus ilegal to use in the code. I thought to work like this, everytime create_symbol function is called with an #rp value, it will go poping the stack/table and evaluating it till find a #lp entry. This way, when the ) is parsed and #rp is sent to create_symbol, it will first pop '1' and since it's nothing but a number it will put in the stack, then it will pop '1000' and to the same, then it will pop '+' this is a predicate, that evaluate the first to things in the stack, this will execute. and be put in the stack, when reaching a #lp entry, the first thing in the stack will be inserted in the symbol table. Is this clear? Is this a nice approach?
Am I the first one to try to implement a language in Rev? =)
Cheers
-- Andre Alves Garzia 2004 BRAZIL http://studio.soapdog.org
_______________________________________________ use-revolution mailing list [EMAIL PROTECTED] http://lists.runrev.com/mailman/listinfo/use-revolution
