Class: Kalc::Grammar
- Inherits:
-
Parslet::Parser
- Object
- Parslet::Parser
- Kalc::Grammar
- Defined in:
- lib/kalc/grammar.rb
Overview
Started with github.com/postmodern/cparser code which is based on www.lysator.liu.se/c/ANSI-C-grammar-y.html and worked from there
The second link really helped when it came to functions
Class Method Summary collapse
Class Method Details
.operators(operators = {}) ⇒ Object
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/kalc/grammar.rb', line 39 def self.operators(operators={}) trailing_chars = Hash.new { |hash,symbol| hash[symbol] = [] } operators.each_value do |symbol| operators.each_value do |op| if op[0,symbol.length] == symbol char = op[symbol.length,1] unless (char.nil? || char.empty?) trailing_chars[symbol] << char end end end end operators.each do |name,symbol| trailing = trailing_chars[symbol] if trailing.empty? rule(name) { str(symbol).as(:operator) >> spaces? } else pattern = "[#{Regexp.escape(trailing.join)}]" rule(name) { (str(symbol) >> match(pattern).absnt?).as(:operator) >> spaces? } end end end |
.symbols(symbols) ⇒ Object
25 26 27 28 29 |
# File 'lib/kalc/grammar.rb', line 25 def self.symbols(symbols) symbols.each do |name, symbol| rule(name) { str(symbol) >> spaces? } end end |