From b2c3ade75384efe76b8774b607e17fe98fab92ef Mon Sep 17 00:00:00 2001 From: ptmcg Date: Tue, 9 Aug 2016 00:23:49 +0000 Subject: TagTag for 2.1.6 release git-svn-id: svn://svn.code.sf.net/p/pyparsing/code/tags/pyparsing_2.1.6@402 9bf210a0-9d2d-494c-87cf-cfb32e7dff7b --- trunk/src/examples/macroExpander.py | 60 +++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 trunk/src/examples/macroExpander.py (limited to 'trunk/src/examples/macroExpander.py') diff --git a/trunk/src/examples/macroExpander.py b/trunk/src/examples/macroExpander.py new file mode 100644 index 0000000..327976c --- /dev/null +++ b/trunk/src/examples/macroExpander.py @@ -0,0 +1,60 @@ +# 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) +identifier = Word(alphas+"_",alphanums+"_") +macroDef = "#def" + identifier("macro") + empty + restOfLine("value") + +# define a placeholder for defined macros - initially nothing +macroExpr = Forward() +macroExpr << NoMatch() + +# 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) -- cgit v1.2.1