| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- #
- # scanExamples.py
- #
- # Illustration of using pyparsing's scanString,transformString, and searchString methods
- #
- # Copyright (c) 2004, 2006 Paul McGuire
- #
- from pyparsing import Word, alphas, alphanums, Literal, restOfLine, OneOrMore, \
- empty, Suppress, replaceWith
- # simulate some C++ code
- testData = """
- #define MAX_LOCS=100
- #define USERNAME = "floyd"
- #define PASSWORD = "swordfish"
- a = MAX_LOCS;
- CORBA::initORB("xyzzy", USERNAME, PASSWORD );
- """
- #################
- print("Example of an extractor")
- print("----------------------")
- # simple grammar to match #define's
- ident = Word(alphas, alphanums+"_")
- macroDef = Literal("#define") + ident.setResultsName("name") + "=" + restOfLine.setResultsName("value")
- for t,s,e in macroDef.scanString( testData ):
- print(t.name,":", t.value)
- # or a quick way to make a dictionary of the names and values
- # (return only key and value tokens, and construct dict from key-value pairs)
- # - empty ahead of restOfLine advances past leading whitespace, does implicit lstrip during parsing
- macroDef = Suppress("#define") + ident + Suppress("=") + empty + restOfLine
- macros = dict(list(macroDef.searchString(testData)))
- print("macros =", macros)
- print()
- #################
- print("Examples of a transformer")
- print("----------------------")
- # convert C++ namespaces to mangled C-compatible names
- scopedIdent = ident + OneOrMore( Literal("::").suppress() + ident )
- scopedIdent.setParseAction(lambda t: "_".join(t))
- print("(replace namespace-scoped names with C-compatible names)")
- print(scopedIdent.transformString( testData ))
- # or a crude pre-processor (use parse actions to replace matching text)
- def substituteMacro(s,l,t):
- if t[0] in macros:
- return macros[t[0]]
- ident.setParseAction( substituteMacro )
- ident.ignore(macroDef)
- print("(simulate #define pre-processor)")
- print(ident.transformString( testData ))
- #################
- print("Example of a stripper")
- print("----------------------")
- from pyparsing import dblQuotedString, LineStart
- # remove all string macro definitions (after extracting to a string resource table?)
- stringMacroDef = Literal("#define") + ident + "=" + dblQuotedString + LineStart()
- stringMacroDef.setParseAction( replaceWith("") )
- print(stringMacroDef.transformString( testData ))
|