• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
      • Apt
      • Zfc
      • Acre
      • Milawa
      • Smtlink
      • Abnf
        • Deftreeops
        • Defdefparse
          • Defdefparse-implementation
            • Defdefparse-event-generation
              • Defdefparse-gen-function-for-rulename
              • Defdefparse-gen-code-for-alternation
              • Defdefparse-gen-code-for-repetition
              • Defdefparse-gen-function-for-group
                • Defdefparse-function-spec
                • Defdefparse-gen-code-for-element
                • Defdefparse-gen-*-group-macro
                • Defdefparse-gen-function-for-option
                • Defdefparse-gen-option-macro
                • Defdefparse-gen-group-macro
                • Defdefparse-gen-function-for-repetition
                • Defdefparse-gen-code-for-concatenation
                • Defdefparse-gen-*-rulename-macro
                • Defdefparse-gen-rulename-macro
                • Defdefparse-gen-repetition-alist
                • Defdefparse-gen-option-alist
                • Defdefparse-gen-group-alist
                • Defdefparse-gen-everything
                • Defdefparse-gen-repetition-table-macro
                • Defdefparse-gen-option-table-macro
                • Defdefparse-gen-group-table-macro
                • Defdefparse-gen-function-for-spec
                • Defdefparse-gen-repetition-table
                • Defdefparse-gen-option-table
                • Defdefparse-gen-group-table
                • Defdefparse-reorder-alternation
                • Defdefparse-order-permutationp
                • Defdefparse-gen-repetition-table-name
                • Defdefparse-gen-option-table-name
                • Defdefparse-gen-group-table-name
                • Defdefparse-alt-symbol-alist
                • Defdefparse-rep-symbol-alist
              • Defdefparse-fn
              • Defdefparse-input-processing
              • Defdefparse-table
              • Defdefparse-macro-definition
          • Defgrammar
          • Tree-utilities
          • Notation
          • Grammar-parser
          • Meta-circular-validation
          • Parsing-primitives-defresult
          • Parsing-primitives-seq
          • Operations
          • Examples
          • Differences-with-paper
          • Constructor-utilities
          • Grammar-printer
          • Parsing-tools
        • Vwsim
        • Isar
        • Wp-gen
        • Dimacs-reader
        • Pfcs
        • Legacy-defrstobj
        • C
        • Proof-checker-array
        • Soft
        • Farray
        • Rp-rewriter
        • Instant-runoff-voting
        • Imp-language
        • Sidekick
        • Ethereum
        • Leftist-trees
        • Java
        • Riscv
        • Taspi
        • Bitcoin
        • Zcash
        • Des
        • X86isa
        • Sha-2
        • Yul
        • Proof-checker-itp13
        • Regex
        • ACL2-programming-language
        • Json
        • Jfkr
        • Equational
        • Cryptography
        • Axe
        • Poseidon
        • Where-do-i-place-my-book
        • Aleo
        • Bigmems
        • Builtins
        • Execloader
        • Solidity
        • Paco
        • Concurrent-programs
        • Bls12-377-curves
      • Debugging
      • Community
      • Std
      • Proof-automation
      • Macro-libraries
      • ACL2
      • Interfacing-tools
      • Hardware-verification
      • Software-verification
      • Math
      • Testing-utilities
    • Defdefparse-event-generation

    Defdefparse-gen-function-for-group

    Generate a parsing function for an ABNF group.

    Signature
    (defdefparse-gen-function-for-group alt order prefix group-table 
                                        option-table repetition-table) 
     
      → 
    event
    Arguments
    alt — Guard (alternationp alt).
    order — Guard (pos-listp order).
    prefix — Guard (common-lisp::symbolp prefix).
    group-table — Guard (defdefparse-alt-symbol-alistp group-table).
    option-table — Guard (defdefparse-alt-symbol-alistp option-table).
    repetition-table — Guard (defdefparse-rep-symbol-alistp repetition-table).
    Returns
    event — Type (pseudo-event-formp event).

    The name is retrieved from the alist for group parsing functions. We generate code to attempt to parse the alternation of the group, propagating errors, and returning a tree without rule name in case of success.

    We also generate linear rules about the remaining input. These are needed to prove the termination of recursive functions that call this function.

    If the alternation is nullable, we should not generate the strict inequality linear rule: see discussion in defdefparse-gen-function-for-rulename. However, for now we do not support that here, i.e. we implicitly assume that the alternation is not nullable.

    Definitions and Theorems

    Function: defdefparse-gen-function-for-group

    (defun defdefparse-gen-function-for-group
           (alt order prefix group-table
                option-table repetition-table)
     (declare
      (xargs
         :guard (and (alternationp alt)
                     (pos-listp order)
                     (common-lisp::symbolp prefix)
                     (defdefparse-alt-symbol-alistp group-table)
                     (defdefparse-alt-symbol-alistp option-table)
                     (defdefparse-rep-symbol-alistp repetition-table))))
     (let ((__function__ 'defdefparse-gen-function-for-group))
      (declare (ignorable __function__))
      (b* ((parse-group (cdr (assoc-equal alt group-table)))
           (order (or order (integers-from-to 1 (len alt)))))
       (cons
        'define
        (cons
         parse-group
         (cons
          '((input nat-listp))
          (cons
           ':returns
           (cons
            '(mv (tree tree-resultp)
                 (rest-input nat-listp))
            (cons
             ':short
             (cons
              (str::cat "Parse a @('"
                        (pretty-print-element (element-group alt))
                        "').")
              (cons
               (cons
                'b*
                (cons
                   (cons (cons '(mv treess input)
                               (cons (defdefparse-gen-code-for-alternation
                                          alt order prefix group-table
                                          option-table repetition-table)
                                     'nil))
                         '(((when (reserrp treess))
                            (mv (reserrf-push treess)
                                (nat-list-fix input)))))
                   '((mv (make-tree-nonleaf :rulename? nil
                                            :branches treess)
                         input))))
               (cons
                ':hooks
                (cons
                 '(:fix)
                 (cons
                  '///
                  (cons
                   (cons
                       'defret
                       (cons (packn-pos (list 'len-of- parse-group '-<=)
                                        parse-group)
                             '((<= (len rest-input) (len input))
                               :rule-classes :linear)))
                   (cons
                    (cons
                      'defret
                      (cons (packn-pos (list 'len-of- parse-group '-<)
                                       parse-group)
                            '((implies (not (reserrp tree))
                                       (< (len rest-input) (len input)))
                              :rule-classes :linear)))
                    'nil))))))))))))))))

    Theorem: pseudo-event-formp-of-defdefparse-gen-function-for-group

    (defthm pseudo-event-formp-of-defdefparse-gen-function-for-group
      (b* ((event (defdefparse-gen-function-for-group
                       alt order prefix group-table
                       option-table repetition-table)))
        (pseudo-event-formp event))
      :rule-classes :rewrite)