• 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
              • Dimb-exprs/decls/stmts
              • Dimb-make/adjust-expr-binary
              • Dimb-transunit
              • Dimb-params-to-names
              • Dimb-cast/call-to-call
              • Dimb-make/adjust-expr-cast
              • Dimb-fundef
              • Dimb-make/adjust-expr-unary
              • Dimb-expr
              • Dimb-dirdeclor
                • Dimb-amb-declor/absdeclor
                • Dimb-cast/call-to-cast
                • Dimb-cast/addsub-to-cast
                • Dimb-cast/addsub-to-addsub
                • Dimb-transunit-ensemble
                • Dimb-add-ident
                • Dimb-kind
                • Dimb-declor
                • Dimb-amb-expr/tyname
                • Dimb-cast/mul-to-cast
                • Dimb-cast/and-to-cast
                • Dimb-cast/mul-to-mul
                • Dimb-cast/and-to-and
                • Dimb-kind-option
                • Dimb-type-spec
                • Dimb-extdecl-list
                • Dimb-extdecl
                • Dimb-lookup-ident
                • Dimb-param-declor
                • Dimb-decl-spec
                • Dimb-add-idents-objfun
                • Dimb-param-declon
                • Dimb-add-ident-objfun
                • Dimb-table
                • Dimb-amb-decl/stmt
                • Dimb-pop-scope
                • Dimb-push-scope
                • Dimb-initdeclor
                • Dimb-declor-option
                • Dimb-enumspec
                • Dimb-decl
                • Dimb-stmt
                • Dimb-scope
                • Dimb-structdeclor
                • Dimb-initdeclor-list
                • Dimb-decl-spec-list
                • Dimb-absdeclor
                • Dimb-init-table
                • Dimb-dirabsdeclor
                • Dimb-align-spec
                • Dimb-strunispec
                • Irr-dimb-table
                • Irr-dimb-kind
                • Dimb-spec/qual-list
                • Dimb-spec/qual
                • Dimb-param-declon-list
                • Dimb-label
                • Dimb-enumer-list
                • Dimb-enumer
                • Dimb-dirabsdeclor-option
                • Dimb-block-item
                • Dimb-structdeclor-list
                • Dimb-structdecl-list
                • Dimb-statassert
                • Dimb-desiniter-list
                • Dimb-desiniter
                • Dimb-decl-list
                • Dimb-const-expr-option
                • Dimb-absdeclor-option
                • Dimb-structdecl
                • Dimb-member-designor
                • Dimb-initer-option
                • Dimb-initer
                • Dimb-genassoc-list
                • Dimb-genassoc
                • Dimb-expr-option
                • Dimb-expr-list
                • Dimb-designor-list
                • Dimb-designor
                • Dimb-const-expr
                • Dimb-block-item-list
                • Dimb-tyname
              • Abstract-syntax
              • Parser
              • 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
    • Disambiguator
    • Dimb-exprs/decls/stmts

    Dimb-dirdeclor

    Disambiguate a direct declarator.

    Signature
    (dimb-dirdeclor dirdeclor fundefp table) 
      → 
    (mv erp new-dirdeclor ident new-table)
    Arguments
    dirdeclor — Guard (dirdeclorp dirdeclor).
    fundefp — Guard (booleanp fundefp).
    table — Guard (dimb-tablep table).
    Returns
    new-dirdeclor — Type (dirdeclorp new-dirdeclor).
    ident — Type (identp ident).
    new-table — Type (dimb-tablep new-table).

    As explained in dimb-declor, a (direct) declarator adds an identifier to the scope. So here we return the identifer, recursively extracted from the direct declarator. The actual addition to the disambiguation table is performed outside this function.

    The purpose of the fundefp flag is the same as in dimb-declor, which in fact passes it to this function. Here we make use of it, as explained below.

    We recursively disambiguate the inner declarator and direct declarator, from which we obtain the identifier. We also recursively disambiguate any expressions in array declarators.

    For function declarators, the parser only produces :function-params, never :function-names. However, here we also process :function-names, so that the disambiguator is idempotent. We push a new scope, for uniformity with the treatment described in the next paragraph.

    For a :function-params, first we attempt to turn it into a :function-names, if applicable. we also push a new scope if fundefp is t, for the reason explained below. If we cannot turn the :function-params into :function-names, we disambiguate it (into another :function-params) as follows. We push a new scope for the function prototype [C17:6.2.1/2] [C17:6.2.1/4]. We call a separate function to disambiguate each parameter declaration. Then, based on the fundefp flag, we pop the scope (if the flag is nil), or we leave the scope there (if the flag is t): in the latter case, this will be the scope of the function definition. So that is the reason why we push a scope also in the case, described above, that we turn :function-params into :function-names: either way, we are pushing a scope for the function definition. If the code is valid, the function definition will indeed have parameter declarations, and so the disambiguator will do the right thing; if the code is invalid, it does not actually matter what the disambiguator does.