more actual text for the readme
This commit is contained in:
parent
cc96f5a0e8
commit
b25d5ab992
43
README.md
43
README.md
@ -7,12 +7,40 @@ This is interesing if you want to generate executable code, like crystal, but al
|
|||||||
Also it is very educational, as it is very readable code, and not too much of it.
|
Also it is very educational, as it is very readable code, and not too much of it.
|
||||||
|
|
||||||
*
|
*
|
||||||
It looks into it's crystal ball and all it sees is red. A red crystal . . . ruby code, yes.
|
It looks into it's crystal ball and all it sees is red. A red crystal . . . ruby, yes.
|
||||||
|
|
||||||
|
### Parser
|
||||||
|
|
||||||
|
The main parser per se is in parser/crystal , but it just pulls in all the parts.
|
||||||
|
|
||||||
|
All the other files are ruby modules representing aspects of the parser. Most names are quite self explanitory, but here is a list:
|
||||||
|
|
||||||
|
- basic_type defines just that. Strings, symbols, integers, floats , also comments and space
|
||||||
|
- call_site is a function call. May be qualified, but currently must still have braches
|
||||||
|
- compound types are hash and array definitions. Hashes still need curlies
|
||||||
|
- control is if statement which still must have an else
|
||||||
|
- expression is a helper for all code allowed in a function
|
||||||
|
- function definition must have braces too
|
||||||
|
- keywords is just a list of them
|
||||||
|
- operator expression are binary operators (see also below). There's a surprising amount
|
||||||
|
- return statement are straightforward
|
||||||
|
- while still needs a do, though i think in ruby a newline is sufficient
|
||||||
|
|
||||||
|
**Transform** defines how the rules map to Ast objects.
|
||||||
|
|
||||||
|
### Ast
|
||||||
|
|
||||||
|
The Abtract Syntax Tree (ast) layer puts the parsed code into objects, so they are nice and easy to work with.
|
||||||
|
|
||||||
|
The Classes don't really define any functionality, that is done in Crystal, or can be done in any code using this. Crystal just adds a compile function to each class, but a visitor pattern would do just as well.
|
||||||
|
|
||||||
|
The functionality that is in there is mainly to do with testing. Equality is defined, but also **inspect** in such a way that it's output (which you get from a failing test) can be pasted straight into the test case as the expected result.
|
||||||
|
|
||||||
|
|
||||||
### Parslet
|
### Parslet
|
||||||
|
|
||||||
Parslet is really great in that it:
|
Parslet is really great in that it:
|
||||||
- does not generate code but instean gives a clean dsl to define a grammar
|
- does not generate code but instead gives a clean dsl to define a grammar
|
||||||
- uses ruby modules so one can split the grammars up
|
- uses ruby modules so one can split the grammars up
|
||||||
- has support for binary operators with presedence and binding
|
- has support for binary operators with presedence and binding
|
||||||
- has a seperate tranform stage to generate an ast layer
|
- has a seperate tranform stage to generate an ast layer
|
||||||
@ -21,6 +49,17 @@ Especially the last point is great. Since it is seperate it does not clutter up
|
|||||||
And it can generate a layer that has no links to the actual parser anymore, thus saving/automating
|
And it can generate a layer that has no links to the actual parser anymore, thus saving/automating
|
||||||
a complete tranformation process.
|
a complete tranformation process.
|
||||||
|
|
||||||
|
### Todo
|
||||||
|
|
||||||
|
A random list of things left for the future
|
||||||
|
|
||||||
|
- extract commonality of function call/definition,array, hash and multi assignment comma lists
|
||||||
|
- break and next
|
||||||
|
- blocks
|
||||||
|
- more loops, i'm not even sure what ruby supports
|
||||||
|
- ifs without else, also elsif
|
||||||
|
- negative tests
|
||||||
|
|
||||||
### Operators
|
### Operators
|
||||||
|
|
||||||
Parslets operator support is **outstanding** and such it was a breeze to implement most of rubies operators very simply. See the operators.rb for details. Below is a list from the web of how it should be.
|
Parslets operator support is **outstanding** and such it was a breeze to implement most of rubies operators very simply. See the operators.rb for details. Below is a list from the web of how it should be.
|
||||||
|
Loading…
Reference in New Issue
Block a user