diff options
author | Paul McGuire <ptmcg@austin.rr.com> | 2012-10-02 04:55:56 +0000 |
---|---|---|
committer | Paul McGuire <ptmcg@austin.rr.com> | 2012-10-02 04:55:56 +0000 |
commit | a7f9dda0668bfce4fba51df1bf2976b4a93a8bd5 (patch) | |
tree | 57ea8bcf2e66532a36c833a7bc57cff9d5d0e4dd /src/examples/macroExpander.py | |
parent | f5d2b716ffb57b65660a7ee0bbf04332dfb29620 (diff) | |
download | pyparsing-git-a7f9dda0668bfce4fba51df1bf2976b4a93a8bd5.tar.gz |
Add example files to SVN
Diffstat (limited to 'src/examples/macroExpander.py')
-rw-r--r-- | src/examples/macroExpander.py | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/examples/macroExpander.py b/src/examples/macroExpander.py new file mode 100644 index 0000000..2bd599f --- /dev/null +++ b/src/examples/macroExpander.py @@ -0,0 +1,59 @@ +# macroExpander.py
+#
+# Example pyparsing program for performing macro expansion, similar to
+# the C pre-processor. This program is not as fully-featured, simply
+# processing macros of the form:
+# #def xxx yyyyy
+# and replacing xxx with yyyyy in the rest of the input string. Macros
+# can also be composed using other macros, such as
+# #def zzz xxx+1
+# Since xxx was previously defined as yyyyy, then zzz will be replaced
+# with yyyyy+1.
+#
+# Copyright 2007 by Paul McGuire
+#
+from pyparsing import *
+
+# define the structure of a macro definition (the empty term is used
+# to advance to the next non-whitespace character)
+macroDef = "#def" + Word(alphas+"_",alphanums+"_").setResultsName("macro") + \
+ empty + restOfLine.setResultsName("value")
+
+# define a placeholder for defined macros - initially nothing
+macroExpr = Forward()
+
+# global dictionary for macro definitions
+macros = {}
+
+# parse action for macro definitions
+def processMacroDefn(s,l,t):
+ macroVal = macroExpander.transformString(t.value)
+ macros[t.macro] = macroVal
+ macroExpr << MatchFirst( map(Keyword,macros.keys()) )
+ return "#def " + t.macro + " " + macroVal
+
+# parse action to replace macro references with their respective definition
+def processMacroRef(s,l,t):
+ return macros[t[0]]
+
+# attach parse actions to expressions
+macroExpr.setParseAction(processMacroRef)
+macroDef.setParseAction(processMacroDefn)
+
+# define pattern for scanning through the input string
+macroExpander = macroExpr | macroDef
+
+
+
+# test macro substitution using transformString
+testString = """
+ #def A 100
+ #def ALEN A+1
+
+ char Astring[ALEN];
+ char AA[A];
+ typedef char[ALEN] Acharbuf;
+ """
+
+print macroExpander.transformString(testString)
+print macros
|