HEX
Server: Apache/2.4.65 (Ubuntu)
System: Linux ielts-store-v2 6.8.0-1036-gcp #38~22.04.1-Ubuntu SMP Thu Aug 14 01:19:18 UTC 2025 x86_64
User: root (0)
PHP: 7.2.34-54+ubuntu20.04.1+deb.sury.org+1
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
Upload Files
File: //snap/google-cloud-cli/396/platform/gsutil/third_party/pyparsing/examples/apicheck.py
# apicheck.py
#   A simple source code scanner for finding patterns of the form
#       [ procname1 $arg1 $arg2 ]
#  and verifying the number of arguments
#
# Copyright (c) 2004-2016, Paul McGuire
#

from pyparsing import *

# define punctuation and simple tokens for locating API calls
LBRACK, RBRACK, LBRACE, RBRACE = map(Suppress, "[]{}")
ident = Word(alphas, alphanums + "_") | QuotedString("{", endQuoteChar="}")
arg = "$" + ident

# define an API call with a specific number of arguments - using '-'
# will ensure that after matching procname, an incorrect number of args will
# raise a ParseSyntaxException, which will interrupt the scanString
def apiProc(name, numargs):
    return LBRACK + Keyword(name)("procname") - arg * numargs + RBRACK


# create an apiReference, listing all API functions to be scanned for,  and
# their respective number of arguments.  Beginning the overall expression
# with FollowedBy allows us to quickly rule out non-api calls while scanning,
# since all of the api calls begin with a "["
apiRef = FollowedBy("[") + MatchFirst(
    [
        apiProc("procname1", 2),
        apiProc("procname2", 1),
        apiProc("procname3", 2),
    ]
)

autoname_elements()

if __name__ == '__main__':

    import contextlib

    with contextlib.suppress(Exception):
        apiRef.create_diagram("apicheck_diagram.html", vertical=9, show_groups=True)

    test = """[ procname1  $par1 $par2 ]
              other code here
              [ procname1 $par1 $par2 $par3 ]
              more code here
              [ procname1 $par1 ]
              [ procname3  ${arg with spaces} $par2 ]"""


    # now explicitly iterate through the scanner using next(), so that
    # we can trap ParseSyntaxException's that would be raised due to
    # an incorrect number of arguments. If an exception does occur,
    # then see how we reset the input text and scanner to advance to the
    # next line of source code
    api_scanner = apiRef.scanString(test)
    while 1:
        try:
            t, s, e = next(api_scanner)
            print(f"found {t.procname} on line {lineno(s, test)}")
        except ParseSyntaxException as pe:
            print(f"invalid arg count on line {pe.lineno}")
            print(f"{pe.lineno} : {pe.line}")
            # reset api scanner to start after this exception location
            test = "\n" * (pe.lineno - 1) + test[pe.loc + 1:]
            api_scanner = apiRef.scanString(test)
        except StopIteration:
            break