123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- module Chervil
- class Parser def initialize(lexer)
- @lexer = lexer
- @tree = Array.new
- @current_token = @lexer.get_next_token
- end
-
- def parse
- until @current_token.type == :eof
- @tree << expr
- end
- @tree
- end
-
- def expr
- if [:string, :number].include?(@current_token.type)
- constant
- elsif @current_token.type == :identifier
- identifier
- elsif @current_token.type == :lparen
- application
- end
- end
-
- def application
- eat(:lparen)
-
- if @current_token.type == :identifier && @current_token.value == 'define'
- eat(:identifier)
- name = identifier
- value = expr
- p @current_token
- eat(:rparen)
- return AST::Definition.new(name, value)
- end
-
- expression = expr
-
- args = Array.new
- until @current_token.type == :rparen
- args << expr
- end
-
- eat(:rparen)
-
- AST::Application.new(expression, args)
- end
-
- def identifier
- identifier = eat(:identifier)
- AST::Identifier.new(identifier.value)
- end
-
- def constant
- case @current_token.type
- when :number
- token = eat(:number)
- AST::Number.new(token.value.to_f)
- when :string
- token = eat(:string)
- AST::String.new(token.value)
- end
- end
-
- def eat(type)
- if @current_token.type == type
- token = @current_token
- @current_token = @lexer.get_next_token
- token
- else
- raise "Expected #{type} but got #{@current_token.type}"
- end
- end
- end
- end
|