Skip to content
Snippets Groups Projects
  1. Sep 29, 2022
  2. Sep 28, 2022
    • Sven M. Hallberg's avatar
      rename pos member of HInputStream to base · dcdfa469
      Sven M. Hallberg authored
      This reads a bit clearer, but really it is in prepration for reusing 'pos'
      for a substructure holding all the members that make up the actual position.
      That in turn prepares for using only that structure as the key in the packrat
      cache. To carry the cache over from one chunk to the next, the keys must not
      depend on parts of the HInputStream that change between chunks, e.g. the
      'input' pointer.
      dcdfa469
    • Sven M. Hallberg's avatar
      add h_hashtable_del_precomp · cba58db7
      Sven M. Hallberg authored
      cba58db7
    • Sven M. Hallberg's avatar
      refactor h_do_parse for readability · 0d824741
      Sven M. Hallberg authored
      Chip away the small cases: finding a cached result, initiating LR handling.
      Add or reword some comments.
      0d824741
    • Sven M. Hallberg's avatar
      add an early return to recall · 06e2242e
      Sven M. Hallberg authored
      This should be functionally equivalent, because a parser that isn't in the
      head's involved set cannot show up in it's eval set, either. Right?
      06e2242e
    • Sven M. Hallberg's avatar
      refactor packrat recall for readability · 65b6d4ee
      Sven M. Hallberg authored
      Eliminates an unneeded level of if and expands comments.
      Should be exactly equivalent code-wise.
      65b6d4ee
    • Sven M. Hallberg's avatar
      unify the "done" exit paths out of grow · df528221
      Sven M. Hallberg authored
      Analyzing the call sites of update_cached_result shows, I hope, that the call
      to perform_lowlevel_parse() in grow() will not modify the cached result if it
      fails:
      
      1. The call in h_do_parse() is in the non-recursive case.
      2. The call in lr_answer() happens before entering the grow() recursion.
      3. The call at the end of grow() is not reached until later because grow() is
         only called recursively by itself.
      4. The call in recall() only applies to parsers in the eval set of the parser
         in question, which is initialized from its involved set and only shrunk
         after that. The involved set of a parser p, however, does not include p
         itself.
      df528221
    • Sven M. Hallberg's avatar
      remove unneeded cache (re)lookup in grow · 400027ff
      Sven M. Hallberg authored
      No longer needed since all cache updates are made in place (cf. 7f9f2808).
      400027ff
    • Sven M. Hallberg's avatar
      remove an unneeded test · 8f60697a
      Sven M. Hallberg authored
      This was a leftover from before the refactor of 38e47a62.
      8f60697a
    • Sven M. Hallberg's avatar
      chip-away and assert in lr_answer · 8ec887df
      Sven M. Hallberg authored
      Looking at the call site, the errx() case is properly unreachable.
      8ec887df
    • Sven M. Hallberg's avatar
      always update a cached result in place · f40c2754
      Sven M. Hallberg authored
      This is preparation to remove the re-lookup of cached results from grow().
      f40c2754
    • Sven M. Hallberg's avatar
      cosmetics · 1eaa1f45
      Sven M. Hallberg authored
      Remove an unnecessary variable in h_do_parse() and use the nicer freed-up name
      for another. Apply the same rename in perform_lowlevel_parse() for consistency.
      1eaa1f45
    • Sven M. Hallberg's avatar
      factor out the uncached primitive case in h_do_parse · 359f3be0
      Sven M. Hallberg authored
      Should be an equivalent refactor that instead of conditionally enabling
      everything but one line in the higher-order case, chips off the primitive
      case at the very beginning.
      359f3be0
    • Sven M. Hallberg's avatar
      cosmetics · 2ede75fa
      Sven M. Hallberg authored
      Consistently use one style of pointer syntax.
      2ede75fa
    • Sven M. Hallberg's avatar
      refactor packrat grow() · 9b489ee2
      Sven M. Hallberg authored
      - Declare variables at the top.
      - Convert to chip-away style.
      - Avoid come code duplication (done path).
      - Use assert() as appropriate, instead of errx().
      - Add more comments.
      9b489ee2
    • Sven M. Hallberg's avatar
      properly suspend h_end_p and h_seek before the last chunk · 5b5f131c
      Sven M. Hallberg authored
      Includes a test that exercises both.
      Also fixes tracking of input position when suspending on the first chunk and
      adapts h_input_stream_pos and h_input_stream_length to multi-chunk operation.
      5b5f131c
  3. Sep 23, 2022
    • Sven M. Hallberg's avatar
      add (naive) multi-chunk operation for packrat · dec43afe
      Sven M. Hallberg authored
      The naive implementation concatenates all input and blindly re-runs the full
      parse on every chunk. Keeping state between chunks is for later.
      
      Note: The iterative API expects us to always consume an entire input chunk
      when we suspend, even if packrat later backtracks into it. We will produce
      the correct parse result and accurately consume from a final chunk, but all
      earlier chunks will be reported as fully consumed and as being part of the
      HParseResult in terms of its bit_length field.
      dec43afe
    • Sven M. Hallberg's avatar
      add h_realloc to go with h_alloc · b3f509ee
      Sven M. Hallberg authored
      b3f509ee
    • Sven M. Hallberg's avatar
      use %zu for printing size_t · 8213eb45
      Sven M. Hallberg authored
      NB: The 'z' size modifier is in C99.
      8213eb45
  4. Sep 22, 2022
    • Sven M. Hallberg's avatar
      fail packrat parsers if they need more input · 866fd4d6
      Sven M. Hallberg authored
      This commit changes the contract for the combinator parse functions:
      
       (1) The input state on failure must retain valid overrun and last_chunk
           fields. The latter is never changed, but overrun would be cleared by
           various combinators that backtrack in case of failure. All other
           fields of the input stream are still considered indeterminate after a
           failed parse.
      
       (2) If an overrun condition is encountered before the final chunk
           (last_chunk is false), the parse *must* fail. A helper want_suspend()
           is introduced as a shorthand for this check.
      
      Fixes the packrat/iterative/dummy test.
      866fd4d6
    • Sven M. Hallberg's avatar
      don't restore input state on failure · 0d7f1091
      Sven M. Hallberg authored
      There's no need.
      0d7f1091
    • Sven M. Hallberg's avatar
      improve a label name · f8e0dffb
      Sven M. Hallberg authored
      This is the case where parsing stops, which may be a parse error or not,
      depending on how many elements were read.
      f8e0dffb
    • Sven M. Hallberg's avatar
      remove an unreachable case · a30adad4
      Sven M. Hallberg authored
      Replace it with an assert. This case could never occur because it tests
      precisely the loop condition and there are no break statements in the loop.
      
      This was the only use of the 'err' label, so that can go. The code under it
      remains the fall-through case for 'err0', i.e. the actual error (parse failure)
      case.
      a30adad4
    • Sven M. Hallberg's avatar
      add a test for using dummy iterative with multiple chunks · 46164756
      Sven M. Hallberg authored
      The test fails because currently parsers that fail may leave the input stream
      in any indeterminate state. Parsers that backtrack (h_many, h_choice,
      h_optional, etc.) do not propagate an overrun of their subordinate parsers to
      h_packrat_parse_chunk where we would detect it and fail.
      46164756
    • Sven M. Hallberg's avatar
      b28f5427
    • Sven M. Hallberg's avatar
      fit comment to 80 columns · 3b22f3e7
      Sven M. Hallberg authored
      3b22f3e7
    • Sven M. Hallberg's avatar
      make header guard match file name · 1c83beb7
      Sven M. Hallberg authored
      Also includes a very important cosmetic whitespace change.
      1c83beb7
    • Sven M. Hallberg's avatar
      refactor perform_lowlevel_parse for readability · f600634a
      Sven M. Hallberg authored
      Drive-by elimination of an age-old TODO. :)
      Code should be functionally equivalent. Changes:
      
       - Remove broken code under CONSISTENCY_CHECK.
       - Transform to chip-away style.
       - Remove braces around single statements.
       - Declare variables at top of function.
       - Shorten some variable names (tmp_res and bit_length).
       - Limit line length to 80 columns.
      f600634a
    • Sven M. Hallberg's avatar
      dummy support for iterative parsing in packrat · 92805cb1
      Sven M. Hallberg authored
      A very first step. This implementation still expects all input in a single
      chunk but allows the use of the iterative API. If the parser attempts to read
      past the first chunk, the parse fails.
      
      Contains some comments for next steps towards full support.
      
      Adds tests for the single-chunk case.
      92805cb1
  5. Sep 21, 2022
  6. Aug 11, 2022
  7. Aug 09, 2022
  8. Aug 08, 2022
Loading