/usr/share/doc/python-pyparsing-doc/examples/apicheck.py is in python-pyparsing-doc 2.0.1+dfsg1-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | # apicheck.py
# A simple source code scanner for finding patterns of the form
# [ procname1 $arg1 $arg2 ]
# and verifying the number of arguments
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),
])
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("found %s on line %d" % (t.procname, lineno(s,test)))
except ParseSyntaxException as pe:
print("invalid arg count on line", pe.lineno)
print(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
|