• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
      • Apt
      • Zfc
      • Acre
      • Milawa
      • Smtlink
      • Abnf
      • Vwsim
      • Isar
      • Wp-gen
      • Dimacs-reader
      • Pfcs
      • Legacy-defrstobj
      • Proof-checker-array
      • Soft
      • C
      • Farray
      • Rp-rewriter
      • Instant-runoff-voting
      • Imp-language
      • Sidekick
      • Leftist-trees
      • Java
      • Riscv
      • Taspi
      • Bitcoin
      • Des
      • Ethereum
      • X86isa
      • Sha-2
      • Yul
      • Zcash
      • Proof-checker-itp13
      • Regex
      • ACL2-programming-language
      • Json
      • Jfkr
      • Equational
      • Cryptography
      • Poseidon
      • Where-do-i-place-my-book
      • Axe
      • Aleo
        • Aleobft
        • Aleovm
        • Leo
          • Grammar
          • Early-version
            • Json2ast
            • Testing
            • Definition
              • Flattening
              • Abstract-syntax
              • Dynamic-semantics
              • Compilation
              • Static-semantics
              • Concrete-syntax
                • Pretty-printer
                • Grammar
                • Lexing-and-parsing
                  • Lexer
                    • Lex-symbol
                    • Lex-rest-of-block-comment-+-lex-rest-of-block-comment-after-star
                    • Lex-not-double-quote-or-backslash-or-line-feed-or-carriage-return
                    • Lex-not-star-or-slash-or-line-feed-or-carriage-return
                    • Lex-identifier/keyword/boolean/address
                    • Lex-simple-character-escape
                    • Lex-hexadecimal-digit
                    • Lex-token
                      • Lex-not-star-or-line-feed-or-carriage-return
                      • Lex-u8/16/32/64/128
                      • Lex-not-line-feed-or-carriage-return
                      • Lex-i8/16/32/64/128
                      • Lex-string-literal-element
                      • Lex-safe-ascii
                      • Lex-numeric-literal
                      • Lex-safe-nonascii
                      • Lex-letter/decdigit/underscore
                      • Lex-line-terminator
                      • Lex-unicode-character-escape
                      • Lex-ascii-character-escape
                      • Lex-1*6-hexadecimal-digit
                      • Lex-whitespace
                      • Lex-unsigned-literal
                      • Lex-lcletter/decdigit
                      • Lex-string-literal
                      • Lex-signed-literal
                      • Lex-product-group-literal
                      • Lex-lexeme
                      • Lex-single-quote-escape
                      • Lex-integer-literal
                      • Lex-double-quote-escape
                      • Lex-address-literal
                      • Lex-scalar-literal
                      • Lex-null-character-escape
                      • Lex-identifier
                      • Lex-horizontal-tab-escape
                      • Lex-carriage-return-escape
                      • Lex-line-comment
                      • Lex-letter
                      • Lex-field-literal
                      • Lex-comment
                      • Lex-block-comment
                      • Lex-uppercase-letter
                      • Lex-lowercase-letter
                      • Lex-line-feed-escape
                      • Lex-horizontal-tab
                      • Lex-carriage-return
                      • Lex-backslash-escape
                      • Lex-annotation
                      • Lex-visible-ascii
                      • Lex-single-quote
                      • Lex-octal-digit
                      • Lex-double-quote
                      • Lex-decimal-digit
                      • Lex-*-not-line-feed-or-carriage-return
                      • Lex-line-feed
                      • Lex-space
                      • Lex-numeral
                      • Lex-*-letter/decdigit/underscore
                      • Lex-*-string-literal-element
                      • Lex-58-lcletter/decdigit
                      • Lexemize-leo-from-string
                      • Lex-*-lcletter/decdigit
                      • Lex-*-hexadecimal-digit
                      • Lex-1*-decimal-digit
                      • Lex-*-decimal-digit
                      • Lex-*-lexeme
                      • Lexemize-leo-from-bytes
                      • Lexemize-leo
                      • *defparse-leo-repetition-table*
                      • *defparse-leo-group-table*
                      • Lex-generation-macros
                      • Lex-generation-tables
                      • *defparse-leo-option-table*
                    • Parser
                    • Token-fringe
                    • Longest-lexp
                    • Parser-interface
                    • Grammar-lexp
                    • Identifier-lexp
                    • Output-file-parsep
                    • Input-file-parsep
                    • File-lex-parse-p
                    • Filter-tokens
                    • Lexp
                    • File-parsep
                    • Input-parser
                    • Output-file-lex-parse-p
                    • Input-file-lex-parse-p
                    • Parser-abstractor-interface
                    • Identifier-abnf-stringp
                    • Symbol-abnf-stringp
                    • Keyword-abnf-stringp
                    • Output-parser
                    • Tokenizer
                  • Input-pretty-printer
                  • Output-pretty-printer
                  • Unicode-characters
                  • Concrete-syntax-trees
                  • Symbols
                  • Keywords
        • 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
    • Lexer

    Lex-token

    Lex a token.

    Signature
    (lex-token input) → (mv tree rest-input)
    Arguments
    input — Guard (nat-listp input).
    Returns
    tree — Type (abnf::tree-resultp tree).
    rest-input — Type (nat-listp rest-input).

    More precisely, lex a keyword, identifier, atomic-literal, numeral (that is not part of an atomic literal), or symbol.

    If the next input is an at sign, the token may only be an annotation. If the next input is a double quote, the token may only be a string literal. If the next input is a decimal digit, the token may only be a numeric literal or a bare numeral. Otherwise, we try to lex something that starts with a letter (identifier, or keyword, or boolean, or address). Note that we need to wrap string, boolean and address literals with atomic-literal so that the returned CST will match the lexical grammar rules. Finally, we try to lex a symbol.

    Definitions and Theorems

    Function: lex-token

    (defun lex-token (input)
     (declare (xargs :guard (nat-listp input)))
     (let ((__function__ 'lex-token))
       (declare (ignorable __function__))
       (b*
        (((when (endp input))
          (mv (reserrf :end-of-input) nil))
         (next (lnfix (car input)))
         ((when (= next (char-code #\@)))
          (b* (((mv tree input) (lex-annotation input))
               ((when (reserrp tree))
                (mv (reserrf-push tree) input)))
            (mv (abnf-tree-wrap tree "token")
                input)))
         ((when (= next (char-code #\")))
          (b* (((mv tree input)
                (lex-string-literal input))
               ((when (reserrp tree))
                (mv (reserrf-push tree) input)))
            (mv (abnf-tree-wrap (abnf-tree-wrap tree "atomic-literal")
                                "token")
                input)))
         ((when (or (and (<= (char-code #\0) next)
                         (<= next (char-code #\9)))))
          (b*
            (((mv tree input1)
              (lex-numeric-literal input))
             ((when (not (reserrp tree)))
              (mv (abnf-tree-wrap (abnf-tree-wrap tree "atomic-literal")
                                  "token")
                  input1))
             ((mv tree input2) (lex-numeral input))
             ((when (not (reserrp tree)))
              (mv (abnf-tree-wrap tree "token")
                  input2)))
            (mv (reserrf-push tree)
                (nat-list-fix input))))
         ((mv tree input)
          (lex-identifier/keyword/boolean/address input))
         ((when (not (reserrp tree)))
          (mv (abnf-tree-wrap
                   (cond ((abnf-tree-with-root-p tree "boolean-literal")
                          (abnf-tree-wrap tree "atomic-literal"))
                         ((abnf-tree-with-root-p tree "address-literal")
                          (abnf-tree-wrap tree "atomic-literal"))
                         (t tree))
                   "token")
              input))
         ((mv tree input) (lex-symbol input))
         ((when (not (reserrp tree)))
          (mv (abnf-tree-wrap tree "token")
              input)))
        (mv (reserrf :no-token) input))))

    Theorem: tree-resultp-of-lex-token.tree

    (defthm tree-resultp-of-lex-token.tree
      (b* (((mv ?tree ?rest-input)
            (lex-token input)))
        (abnf::tree-resultp tree))
      :rule-classes :rewrite)

    Theorem: nat-listp-of-lex-token.rest-input

    (defthm nat-listp-of-lex-token.rest-input
      (b* (((mv ?tree ?rest-input)
            (lex-token input)))
        (nat-listp rest-input))
      :rule-classes :rewrite)

    Theorem: len-of-lex-token-<=

    (defthm len-of-lex-token-<=
      (b* (((mv ?tree ?rest-input)
            (lex-token input)))
        (<= (len rest-input) (len input)))
      :rule-classes :linear)

    Theorem: len-of-lex-token-<

    (defthm len-of-lex-token-<
      (b* (((mv ?tree ?rest-input)
            (lex-token input)))
        (implies (not (reserrp tree))
                 (< (len rest-input) (len input))))
      :rule-classes :linear)

    Theorem: lex-token-of-nat-list-fix-input

    (defthm lex-token-of-nat-list-fix-input
      (equal (lex-token (nat-list-fix input))
             (lex-token input)))

    Theorem: lex-token-nat-list-equiv-congruence-on-input

    (defthm lex-token-nat-list-equiv-congruence-on-input
      (implies (acl2::nat-list-equiv input input-equiv)
               (equal (lex-token input)
                      (lex-token input-equiv)))
      :rule-classes :congruence)