• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • Std
    • Proof-automation
    • Macro-libraries
    • ACL2
    • Interfacing-tools
    • Hardware-verification
    • Software-verification
      • Kestrel-books
        • Crypto-hdwallet
        • Apt
        • Error-checking
        • Fty-extensions
        • Isar
        • Kestrel-utilities
        • Set
        • Soft
        • C
          • Syntax-for-tools
            • Disambiguator
            • Abstract-syntax
            • Parser
              • Parse-exprs/decls/stmts
              • Check-full-ppnumber
              • Read-char
              • Parstate
              • Lex-identifier/keyword
              • Lex-oct-iconst-/-dec-fconst
              • Lex-lexeme
              • Parse-external-declaration
              • Parse-cast-expression
              • Lex-isuffix-if-present
              • Parse-expression-or-type-name
              • Parse-postfix-expression
              • Lex-hex-iconst/fconst
              • Lex-dec-iconst/fconst
              • Lex-block-comment
              • Lex-escape-sequence
              • Read-token
                • Token
                • Lex-*-hexadecimal-digit
                • Lex-*-c-char
                • Lex-*-s-char
                • Parse-specifier/qualifier
                • Lex-*-digit
                • Lex-line-comment
                • Char-to-msg
                • Parse-primary-expression
                • Parse-declaration-specifier
                • Lex-iconst/fconst
                • Parse-external-declaration-list
                • Parse-declaration-specifiers
                • Lex-dec-expo-if-present
                • Init-parstate
                • Reread-to-token
                • Parse-asm-name-specifier
                • Lex-character-constant
                • Parse-expression-rest
                • Parstate$
                • Lex-dec-fconst
                • Token-unary-expression-start-p
                • Parse-declarator-or-abstract-declarator
                • Parse-asm-goto-labels
                • Parse-asm-clobbers
                • Lex-stringlit
                • Lex-non-octal-digit
                • Position
                • Lexeme
                • Lex-fsuffix-if-present
                • Parse-translation-unit
                • Lex-hexadecimal-digit
                • Token-type-specifier-keyword-p
                • Token-postfix-expression-rest-start-p
                • To-parstate$
                • Parse-?-asm-name-specifier
                • Parse-postfix-expression-rest
                • Parse-expression
                • Make-expr-unary-with-preinc/predec-ops
                • Lex-sign-if-present
                • Lex-dec-expo
                • Lex-bin-expo
                • Unread-to-token
                • Parse-*-stringlit
                • Parse-statement
                • Parse-fileset
                • Token-option
                • Lexeme-option
                • Token-struct-declaration-start-p
                • Parse-*-attribute-specifier
                • Parse-initializer-list
                • Parse-file
                • Parse-pointer
                • Parse-array/function-declarator
                • Unread-chars
                • Span
                • Read-stringlit
                • Lex-hex-quad
                • Unread-tokens
                • Token-type-qualifier-p
                • Read-identifier
                • Parse-*-asm-qualifier
                • Unread-char
                • Parse-attribute-name
                • Parse-argument-expressions
                • Make-expr-cast/add-or-cast/sub-ambig
                • Read-punctuator
                • Parse-struct-or-union-specifier
                • Parse-assignment-expression
                • Parse-asm-clobber
                • Token-specifier/qualifier-start-p
                • Token-primary-expression-start-p
                • Token-function-specifier-p
                • Reterr-msg
                • Read-keyword
                • Parse-*-increment/decrement
                • Parse-direct-abstract-declarator
                • Parse-declaration-or-statement
                • Char+position
                • Unread-token
                • Token+span
                • Token-expression-start-p
                • Update-parstate->tokens-unread
                • Update-parstate->chars-unread
                • Token-to-msg
                • Update-parstate->tokens-read
                • Update-parstate->tokens-length
                • Update-parstate->position
                • Update-parstate->chars-read
                • Parse-parameter-declaration
                • Parse-argument-expressions-rest
                • Update-parstate->chars-length
                • Token-to-type-specifier-keyword
                • Update-parstate->bytes
                • Parse-unary-expression
                • Parse-generic-associations-rest
                • Parse-conditional-expression
                • Update-parstate->size
                • Update-parstate->gcc
                • Parsize
                • Parse-direct-abstract-declarator-rest
                • Token-declaration-specifier-start-p
                • Parse-designator-list
                • Token-designation?-initializer-start-p
                • Token-abstract-declarator-start-p
                • Parse-?-asm-output-operands
                • Parse-?-asm-input-operands
                • Parse-struct-declaration
                • Parse-specifier-qualifier-list
                • Parse-parameter-declaration-list
                • Parse-constant-expression
                • Token-type-specifier-start-p
                • Token-type-qualifier-or-attribute-specifier-start-p
                • Parse-static-assert-declaration
                • Parse-fileset-loop
                • Parse-direct-declarator
                • Parse-declaration
                • Parse-attribute-parameters
                • Token-unary-operator-p
                • Token-to-unary-operator
                • Token-to-type-qualifier
                • Token-storage-class-specifier-p
                • Token-punctuatorp
                • Token-direct-abstract-declarator-start-p
                • Token-declarator-start-p
                • Parse-direct-declarator-rest
                • Token-to-storage-class-specifier
                • Token-to-assignment-operator
                • Token-to-asm-qualifier
                • Token-struct-declarator-start-p
                • Token-keywordp
                • Token-initializer-start-p
                • Token-direct-declarator-start-p
                • Token-assignment-operator-p
                • Parse-type-qualifier-and-attribute-specifier-list
                • Parse-enumerator-list
                • Parse-designation?-initializer
                • Parse-compound-literal
                • Parse-block-item
                • Token-type-name-start-p
                • Token-to-function-specifier
                • Token-preinc/predec-operator-p
                • Token-multiplicative-operator-p
                • Token-designator-start-p
                • Token-designation-start-p
                • Parstate->tokens-unread
                • Parstate->chars-unread
                • Parstate->bytes
                • Parse-initializer
                • Parse-generic-association
                • Parse-declaration-list
                • Parse-attribute-specifier
                • Parse-asm-output-operands
                • Token-to-relational-operator
                • Token-to-preinc/predec-operator
                • Token-to-multiplicative-operator
                • Token-relational-operator-p
                • Token-equality-operator-p
                • Token-asm-qualifier-p
                • Token-additive-operator-p
                • Span-join
                • Parstate->tokens-read
                • Parstate->tokens-length
                • Parstate->size
                • Parstate->chars-read
                • Parstate->chars-length
                • Parse-asm-statement
                • Parse-asm-input-operands
                • Update-parstate->token
                • Update-parstate->char
                • Token-to-equality-operator
                • Token-to-additive-operator
                • Token-shift-operator-p
                • To-parstate$-tokens-unread
                • To-parstate$-chars-unread
                • Position-inc-line
                • Position-inc-column
                • Parstate->gcc
                • Parse-type-name
                • Parse-struct-declarator-list
                • Parse-struct-declaration-list
                • Parse-relational-expression-rest
                • Parse-multiplicative-expression-rest
                • Parse-logical-or-expression-rest
                • Parse-logical-and-expression-rest
                • Parse-inclusive-or-expression-rest
                • Parse-exclusive-or-expression-rest
                • Parse-equality-expression-rest
                • Parse-array/function-abstract-declarator
                • Parse-additive-expression-rest
                • Token-to-shift-operator
                • To-parstate$-tokens-read
                • Parse-struct-declarator
                • Parse-shift-expression-rest
                • Parse-member-designor
                • Parse-init-declarator-list
                • Parse-init-declarator
                • Parse-and-expression-rest
                • Parse-alignment-specifier
                • To-parstate$-chars-read
                • Position-to-msg
                • Parstate->token
                • Parstate->char
                • Parse-shift-expression
                • Parse-relational-expression
                • Parse-multiplicative-expression
                • Parse-logical-or-expression
                • Parse-logical-and-expression
                • Parse-inclusive-or-expression
                • Parse-exclusive-or-expression
                • Parse-equality-expression
                • Parse-enum-specifier
                • Parse-block-item-list
                • Parse-attribute-list
                • Parse-and-expression
                • Parse-additive-expression
                • Parse-abstract-declarator
                • Char+position-list
                • Token+span-list
                • Span-to-msg
                • Parstate-fix
                • Parse-member-designor-rest
                • Position-init
                • Parstate->position
                • Parse-designator
                • Parse-declarator
                • Parse-attribute
                • Irr-token
                • Irr-span
                • Irr-position
                • Irr-lexeme
                • Token-list
                • Parse-type-qualifier-or-attribute-specifier
                • Parse-enumerator
                • Parse-asm-output-operand
                • Parse-asm-input-operand
              • Validator
              • Printer
              • Formalized-subset
              • Mapping-to-language-definition
              • Input-files
              • Defpred
              • Output-files
              • Abstract-syntax-operations
              • Validation-information
              • Implementation-environments
              • Concrete-syntax
              • Unambiguity
              • Ascii-identifiers
              • Preprocessing
              • Abstraction-mapping
            • Atc
            • Language
            • Representation
            • Transformation-tools
            • Insertion-sort
            • Pack
          • Bv
          • Imp-language
          • Event-macros
          • Java
          • Bitcoin
          • Ethereum
          • Yul
          • Zcash
          • ACL2-programming-language
          • Prime-fields
          • Json
          • Syntheto
          • File-io-light
          • Cryptography
          • Number-theory
          • Lists-light
          • Axe
          • Builtins
          • Solidity
          • Helpers
          • Htclient
          • Typed-lists-light
          • Arithmetic-light
        • X86isa
        • Axe
        • Execloader
      • Math
      • Testing-utilities
    • Parser

    Read-token

    Read a token.

    Signature
    (read-token parstate) → (mv erp token? span new-parstate)
    Arguments
    parstate — Guard (parstatep parstate).
    Returns
    token? — Type (token-optionp token?).
    span — Type (spanp span).
    new-parstate — Type (parstatep new-parstate), given (parstatep parstate).

    If we find a token, we return it, along with its span. If we reach the end of file, we return nil for no token, along with a span that covers just the position just past the end of file, although this span is not that relevant (this span comes from lex-lexeme).

    If there are unread tokens, we move a token from the sequence of unread tokens to the sequence of read tokens. We need to check that the index is in range, which we may be able to avoid in the future by adding invariants via an abstract stobj.

    Otherwise, we call the lexer to get the next lexeme, until we find a token lexeme or the end of file. That is, we discard white space and comments. (Future extensions of this parser may instead return certain white space and comments under some conditions.)

    Definitions and Theorems

    Function: read-token-loop

    (defun read-token-loop (parstate)
     (declare (xargs :stobjs (parstate)))
     (declare (xargs :guard (parstatep parstate)))
     (let ((__function__ 'read-token-loop))
       (declare (ignorable __function__))
       (b*
        (((reterr) nil (irr-span) parstate)
         (parstate.tokens-read (parstate->tokens-read parstate))
         ((erp lexeme? span parstate)
          (lex-lexeme parstate))
         ((when (not lexeme?))
          (retok nil span parstate))
         ((when (lexeme-case lexeme? :token))
          (b*
           ((token (lexeme-token->unwrap lexeme?))
            ((unless (< parstate.tokens-read
                        (parstate->tokens-length parstate)))
             (raise "Internal error: index ~x0 out of bound ~x1."
                    parstate.tokens-read
                    (parstate->tokens-length parstate))
             (reterr t))
            (parstate
                 (update-parstate->token parstate.tokens-read
                                         (make-token+span :token token
                                                          :span span)
                                         parstate))
            (parstate
                 (update-parstate->tokens-read (1+ parstate.tokens-read)
                                               parstate)))
           (retok token span parstate))))
        (read-token-loop parstate))))

    Theorem: token-optionp-of-read-token-loop.token?

    (defthm token-optionp-of-read-token-loop.token?
      (b* (((mv acl2::?erp ?token? ?span ?new-parstate)
            (read-token-loop parstate)))
        (token-optionp token?))
      :rule-classes :rewrite)

    Theorem: spanp-of-read-token-loop.span

    (defthm spanp-of-read-token-loop.span
      (b* (((mv acl2::?erp ?token? ?span ?new-parstate)
            (read-token-loop parstate)))
        (spanp span))
      :rule-classes :rewrite)

    Theorem: parstatep-of-read-token-loop.new-parstate

    (defthm parstatep-of-read-token-loop.new-parstate
      (implies (parstatep parstate)
               (b* (((mv acl2::?erp ?token? ?span ?new-parstate)
                     (read-token-loop parstate)))
                 (parstatep new-parstate)))
      :rule-classes :rewrite)

    Theorem: parsize-of-read-token-loop-uncond

    (defthm parsize-of-read-token-loop-uncond
      (b* (((mv acl2::?erp ?token? ?span ?new-parstate)
            (read-token-loop parstate)))
        (<= (parsize new-parstate)
            (parsize parstate)))
      :rule-classes :linear)

    Theorem: parsize-of-read-token-loop-cond

    (defthm parsize-of-read-token-loop-cond
      (b* (((mv acl2::?erp ?token? ?span ?new-parstate)
            (read-token-loop parstate)))
        (implies (and (not erp) token?)
                 (<= (parsize new-parstate)
                     (1- (parsize parstate)))))
      :rule-classes :linear)

    Function: read-token

    (defun read-token (parstate)
     (declare (xargs :stobjs (parstate)))
     (declare (xargs :guard (parstatep parstate)))
     (let ((__function__ 'read-token))
      (declare (ignorable __function__))
      (b*
       (((reterr) nil (irr-span) parstate)
        (parstate.tokens-read (parstate->tokens-read parstate))
        (parstate.tokens-unread (parstate->tokens-unread parstate))
        (parstate.size (parstate->size parstate))
        ((when (and (> parstate.tokens-unread 0)
                    (> parstate.size 0)))
         (b*
          (((unless (< parstate.tokens-read
                       (parstate->tokens-length parstate)))
            (raise "Internal error: index ~x0 out of bound ~x1."
                   parstate.tokens-read
                   (parstate->tokens-length parstate))
            (reterr t))
           (token+span (parstate->token parstate.tokens-read parstate))
           (parstate
             (update-parstate->tokens-unread (1- parstate.tokens-unread)
                                             parstate))
           (parstate
                (update-parstate->tokens-read (1+ parstate.tokens-read)
                                              parstate))
           (parstate (update-parstate->size (1- parstate.size)
                                            parstate)))
          (retok (token+span->token token+span)
                 (token+span->span token+span)
                 parstate))))
       (read-token-loop parstate))))

    Theorem: token-optionp-of-read-token.token?

    (defthm token-optionp-of-read-token.token?
      (b* (((mv acl2::?erp ?token? ?span ?new-parstate)
            (read-token parstate)))
        (token-optionp token?))
      :rule-classes :rewrite)

    Theorem: spanp-of-read-token.span

    (defthm spanp-of-read-token.span
      (b* (((mv acl2::?erp ?token? ?span ?new-parstate)
            (read-token parstate)))
        (spanp span))
      :rule-classes :rewrite)

    Theorem: parstatep-of-read-token.new-parstate

    (defthm parstatep-of-read-token.new-parstate
      (implies (parstatep parstate)
               (b* (((mv acl2::?erp ?token? ?span ?new-parstate)
                     (read-token parstate)))
                 (parstatep new-parstate)))
      :rule-classes :rewrite)

    Theorem: parsize-of-read-token-uncond

    (defthm parsize-of-read-token-uncond
      (b* (((mv acl2::?erp ?token? ?span ?new-parstate)
            (read-token parstate)))
        (<= (parsize new-parstate)
            (parsize parstate)))
      :rule-classes :linear)

    Theorem: parsize-of-read-token-cond

    (defthm parsize-of-read-token-cond
      (b* (((mv acl2::?erp ?token? ?span ?new-parstate)
            (read-token parstate)))
        (implies (and (not erp) token?)
                 (<= (parsize new-parstate)
                     (1- (parsize parstate)))))
      :rule-classes :linear)