56 lines
2.3 KiB
Markdown
56 lines
2.3 KiB
Markdown
Parser
|
|
================
|
|
|
|
This includes the parser and generated ast.
|
|
|
|
Parslet is really great in that it:
|
|
- does not generate code but instean gives a clean dsl to define a grammar
|
|
- uses ruby modules so one can split the grammars up
|
|
- has support for binary operators with presedence and binding
|
|
- has a seperate tranform stage to generate an ast layer
|
|
|
|
Especially the last point is great. Since it is seperate it does not clutter up the actual grammar.
|
|
And it can generate a layer that has no links to the actual parser anymore, thus saving/automating
|
|
a complete tranformation process.
|
|
|
|
|
|
Operator list from http://stackoverflow.com/questions/21060234/ruby-operator-precedence-table
|
|
|
|
N A M Operator(s) Description
|
|
- - - ----------- -----------
|
|
1 R Y ! ~ + boolean NOT, bitwise complement, unary plus
|
|
(unary plus may be redefined from Ruby 1.9 with +@)
|
|
|
|
2 R Y ** exponentiation
|
|
1 R Y - unary minus (redefine with -@)
|
|
|
|
2 L Y * / % multiplication, division, modulo (remainder)
|
|
2 L Y + - addition (or concatenation), subtraction
|
|
|
|
2 L Y << >> bitwise shift-left (or append), bitwise shift-right
|
|
2 L Y & bitwise AND
|
|
|
|
2 L Y | ^ bitwise OR, bitwise XOR (exclusive OR)
|
|
2 L Y < <= >= > ordering
|
|
|
|
2 N Y == === != =~ !~ <=> equality, pattern matching, comparison
|
|
(!= and !~ may not be redefined prior to Ruby 1.9)
|
|
|
|
2 L N && boolean AND
|
|
2 L N || boolean OR
|
|
|
|
2 N N .. ... range creation (inclusive and exclusive)
|
|
and boolean flip-flops
|
|
|
|
3 R N ? : ternary if-then-else (conditional)
|
|
2 L N rescue exception-handling modifier
|
|
|
|
2 R N = assignment
|
|
2 R N **= *= /= %= += -= assignment
|
|
2 R N <<= >>= assignment
|
|
2 R N &&= &= ||= |= ^= assignment
|
|
|
|
1 N N defined? test variable definition and type
|
|
1 R N not boolean NOT (low precedence)
|
|
2 L N and or boolean AND, boolean OR (low precedence)
|
|
2 N N if unless while until conditional and loop modifiers |