Module: Kumi::Parser
- Defined in:
- lib/kumi-parser.rb,
lib/kumi/parser/base.rb,
lib/kumi/parser/token.rb,
lib/kumi/parser/errors.rb,
lib/kumi/parser/helpers.rb,
lib/kumi/parser/version.rb,
lib/kumi/parser/text_parser.rb,
lib/kumi/parser/direct_parser.rb,
lib/kumi/parser/error_extractor.rb,
lib/kumi/parser/smart_tokenizer.rb,
lib/kumi/parser/text_parser/api.rb,
lib/kumi/parser/token_constants.rb,
lib/kumi/parser/syntax_validator.rb
Defined Under Namespace
Modules: Errors, Helpers, TextParser, TokenType Classes: Base, DirectParser, ErrorExtractor, SmartTokenizer, SyntaxValidator, Token
Constant Summary collapse
- VERSION =
'0.0.31'- TOKEN_METADATA =
Rich metadata for each token type
{ # Keywords with parsing hints schema: { category: :keyword, expects_block: true, block_terminator: :end }, input: { category: :keyword, expects_block: true, block_terminator: :end, context: :input_declarations }, value: { category: :keyword, expects_expression: true, declaration_type: :value }, let: { category: :keyword, expects_expression: true }, trait: { category: :keyword, expects_expression: true, declaration_type: :trait }, import: { category: :keyword, import_declaration: true }, codegen: { category: :keyword, schema_directive: true }, from: { category: :keyword, import_source: true }, do: { category: :keyword, block_opener: true }, end: { category: :keyword, block_closer: true, terminates_expression: true }, on: { category: :keyword, cascade_keyword: true, expects_condition: true }, base: { category: :keyword, cascade_keyword: true, is_base_case: true }, # Type keywords integer_type: { category: :type_keyword, starts_declaration: true, type_name: :integer }, float_type: { category: :type_keyword, starts_declaration: true, type_name: :float }, decimal_type: { category: :type_keyword, starts_declaration: true, type_name: :decimal }, string_type: { category: :type_keyword, starts_declaration: true, type_name: :string }, boolean_type: { category: :type_keyword, starts_declaration: true, type_name: :boolean }, any_type: { category: :type_keyword, starts_declaration: true, type_name: :any }, array_type: { category: :type_keyword, starts_declaration: true, type_name: :array }, hash_type: { category: :type_keyword, starts_declaration: true, type_name: :hash }, element_type: { category: :type_keyword, starts_declaration: true, type_name: :element }, index_type: { category: :type_keyword, starts_declaration: true, type_name: :index }, # Function keyword fn: { category: :keyword, function_keyword: true, starts_expression: true }, function_sugar: { function_keyword: true, starts_expression: true }, # Operators with precedence and associativity exponent: { category: :operator, precedence: 7, associativity: :right, arity: :binary }, multiply: { category: :operator, precedence: 6, associativity: :left, arity: :binary }, divide: { category: :operator, precedence: 6, associativity: :left, arity: :binary }, modulo: { category: :operator, precedence: 6, associativity: :left, arity: :binary }, add: { category: :operator, precedence: 5, associativity: :left, arity: :binary }, subtract: { category: :operator, precedence: 5, associativity: :left, arity: :binary }, gte: { category: :operator, precedence: 4, associativity: :left, arity: :binary, returns_boolean: true }, lte: { category: :operator, precedence: 4, associativity: :left, arity: :binary, returns_boolean: true }, gt: { category: :operator, precedence: 4, associativity: :left, arity: :binary, returns_boolean: true }, lt: { category: :operator, precedence: 4, associativity: :left, arity: :binary, returns_boolean: true }, eq: { category: :operator, precedence: 4, associativity: :left, arity: :binary, returns_boolean: true }, ne: { category: :operator, precedence: 4, associativity: :left, arity: :binary, returns_boolean: true }, and: { category: :operator, precedence: 3, associativity: :left, arity: :binary, requires_boolean: true }, or: { category: :operator, precedence: 2, associativity: :left, arity: :binary, requires_boolean: true }, # Literals with type information integer: { category: :literal, starts_expression: true, ast_class: 'Kumi::Syntax::Literal' }, float: { category: :literal, starts_expression: true, ast_class: 'Kumi::Syntax::Literal' }, string: { category: :literal, starts_expression: true, ast_class: 'Kumi::Syntax::Literal' }, boolean: { category: :literal, starts_expression: true, ast_class: 'Kumi::Syntax::Literal' }, # Identifiers and references identifier: { category: :identifier, starts_expression: true, can_be_reference: true }, symbol: { category: :identifier, starts_expression: true, is_declaration_name: true }, constant: { category: :literal, starts_expression: true, ast_class: 'Kumi::Syntax::Literal' }, # Punctuation with parser hints dot: { category: :punctuation, indicates_member_access: true }, dot_dot: { category: :range }, dot_dot_dot: { category: :range }, comma: { category: :punctuation, separates_items: true }, colon: { category: :punctuation, indicates_symbol: true }, lparen: { category: :punctuation, opens_group: true, group_closer: :rparen, starts_expression: true }, rparen: { category: :punctuation, closes_group: true, terminates_expression: true }, lbracket: { category: :punctuation, opens_group: true, group_closer: :rbracket, starts_expression: true, indicates_array: true }, rbracket: { category: :punctuation, closes_group: true, terminates_expression: true }, left_brace: { category: :punctuation, opens_scope: :hash }, right_brace: { category: :punctuation, closes_scope: :hash }, # Special tokens newline: { category: :whitespace, separates_statements: true }, eof: { category: :special, terminates_input: true }, comment: { category: :whitespace, ignored_by_parser: true } }.freeze
- CHAR_TO_TOKEN =
Character to token mappings
{ '(' => :lparen, ')' => :rparen, '[' => :lbracket, ']' => :rbracket, '{' => :left_brace, '}' => :right_brace, ',' => :comma, '.' => :dot, ':' => :colon, '+' => :add, '-' => :subtract, '*' => :multiply, '/' => :divide, '%' => :modulo, '&' => :and, '|' => :or, '=>' => :arrow }.freeze
- FUNCTION_SUGAR =
{ 'select' => '__select__', 'shift' => 'shift', 'roll' => 'roll', 'index' => 'index', 'to_decimal' => 'to_decimal', 'to_integer' => 'to_integer', 'to_float' => 'to_float', 'to_string' => 'to_string' }
- KEYWORDS =
Keywords mapping
{ 'schema' => :schema, 'input' => :input, 'value' => :value, 'let' => :let, 'trait' => :trait, 'import' => :import, 'codegen' => :codegen, 'from' => :from, 'do' => :do, 'end' => :end, 'on' => :on, 'base' => :base, 'fn' => :fn, 'true' => :boolean, 'false' => :boolean, 'integer' => :integer_type, 'float' => :float_type, 'decimal' => :decimal_type, 'string' => :string_type, 'boolean' => :boolean_type, 'any' => :any_type, 'array' => :array_type, 'hash' => :hash_type, 'element' => :element_type }.freeze
- OPENER_FOR_CLOSER =
Opener to closer mappings for error recovery
{ rparen: :lparen, rbracket: :lbracket }.freeze