From a7f9dda0668bfce4fba51df1bf2976b4a93a8bd5 Mon Sep 17 00:00:00 2001 From: Paul McGuire Date: Tue, 2 Oct 2012 04:55:56 +0000 Subject: Add example files to SVN --- src/examples/cpp_enum_parser.py | 52 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/examples/cpp_enum_parser.py (limited to 'src/examples/cpp_enum_parser.py') diff --git a/src/examples/cpp_enum_parser.py b/src/examples/cpp_enum_parser.py new file mode 100644 index 0000000..70d60c0 --- /dev/null +++ b/src/examples/cpp_enum_parser.py @@ -0,0 +1,52 @@ +# +# cpp_enum_parser.py +# +# Posted by Mark Tolenen on comp.lang.python in August, 2009, +# Used with permission. +# +# Parser that scans through C or C++ code for enum definitions, and +# generates corresponding Python constant definitions. +# +# + +from pyparsing import * +# sample string with enums and other stuff +sample = ''' + stuff before + enum hello { + Zero, + One, + Two, + Three, + Five=5, + Six, + Ten=10 + }; + in the middle + enum blah + { + alpha, + beta, + gamma = 10 , + zeta = 50 + }; + at the end + ''' + +# syntax we don't want to see in the final parse tree +LBRACE,RBRACE,EQ,COMMA = map(Suppress,"{}=,") +_enum = Suppress('enum') +identifier = Word(alphas,alphanums+'_') +integer = Word(nums) +enumValue = Group(identifier('name') + Optional(EQ + integer('value'))) +enumList = Group(enumValue + ZeroOrMore(COMMA + enumValue)) +enum = _enum + identifier('enum') + LBRACE + enumList('names') + RBRACE + +# find instances of enums ignoring other syntax +for item,start,stop in enum.scanString(sample): + id = 0 + for entry in item.names: + if entry.value != '': + id = int(entry.value) + print '%s_%s = %d' % (item.enum.upper(),entry.name.upper(),id) + id += 1 -- cgit v1.2.1