Class: L43Rmap::Parsing::ChunkParser

Inherits:
Object
  • Object
show all
Includes:
L43::SimpleColor, Ast, RgxParsers
Defined in:
lib/l43_rmap/parsing/chunk_parser.rb

Constant Summary collapse

SyntaxError =
Class.new(RuntimeError)

Constants included from RgxParsers

RgxParsers::BAREWORD, RgxParsers::BarewordParser, RgxParsers::DQUOTE, RgxParsers::DquoteParser, RgxParsers::ESCAPE, RgxParsers::ESC_DQUOTE, RgxParsers::ESC_SQUOTE, RgxParsers::EscDquoteParser, RgxParsers::EscSquoteParser, RgxParsers::EscapeParser, RgxParsers::INDEXED_FIELD, RgxParsers::INT, RgxParsers::IndexedFieldParser, RgxParsers::IntParser, RgxParsers::LPAR, RgxParsers::LparParser, RgxParsers::NAME, RgxParsers::NAMED_FIELD, RgxParsers::NO_DQUOTE, RgxParsers::NO_META, RgxParsers::NO_SQUOTE, RgxParsers::NameParser, RgxParsers::NamedFieldParser, RgxParsers::NoDquoteParser, RgxParsers::NoMetaParser, RgxParsers::NoSquoteParser, RgxParsers::OP, RgxParsers::OpParser, RgxParsers::RPAR, RgxParsers::RparParser, RgxParsers::SQUOTE, RgxParsers::SYMBOL, RgxParsers::SquoteParser, RgxParsers::SymbolParser, RgxParsers::WS, RgxParsers::WsParser, RgxParsers::ZEROFIELD, RgxParsers::ZEROFIELD_INSIDE, RgxParsers::ZerofieldInsideParser, RgxParsers::ZerofieldParser

Constants included from Ast

Ast::Node

Instance Method Summary collapse

Instance Method Details

#parse(input, pos: 1) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/l43_rmap/parsing/chunk_parser.rb', line 25

def parse(input, pos: 1)
  input = Input.new(current: input, pos:)
  ast = []
  loop do
    # dbg("MAIN LOOP>>>", ast: ast.map(&:to_h), input: input.current)
    return ast if input.empty?
    result = parse_chunk(input)
    result => chunk, input
    # dbg("MAIN LOOP <<", ast: ast.map(&:to_h), chunk: chunk.to_h, input: input.current)
    ast = unify_verb(ast << chunk)
    # dbg("MAIN LOOP<<<", ast: ast.map(&:to_h), input: input.current)
  end
end

#parse_chunk(input) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/l43_rmap/parsing/chunk_parser.rb', line 39

def parse_chunk(input)
  # p(input:)
  if chunk = ZerofieldParser.parse(input)
    chunk
  elsif chunk = IndexedFieldParser.parse(input)
    # dbg("FieldParser", chunk:)
    chunk
  elsif chunk = NoMetaParser.parse(input)
    chunk
  elsif chunk = EscapeParser.parse(input)
    chunk
  elsif chunk = NamedFieldParser.parse(input)
    chunk
  elsif LparParser.parse(input) in _, input
    result = parse_sexp(input)
    # p(result)
    # dbg("MAIN <sexp", ast: result.first)
    result
  else
    raise SyntaxError, input.to_h.inspect
  end
end