diff options
author | Paul McGuire <ptmcg@users.noreply.github.com> | 2018-01-06 23:38:53 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-06 23:38:53 -0600 |
commit | 430c5ad767cc946e9da7cd5f4673a4e3bd135a3c (patch) | |
tree | 5a7df11e0fd52ab320b0ef3e670e260f315ca9ae /examples/cpp_enum_parser.py | |
parent | f1d12567a8da4d254e6d62bb0d650c87c7d0bb89 (diff) | |
parent | d953150a6db3ac247a64b047edc2df7156f3e56b (diff) | |
download | pyparsing-git-430c5ad767cc946e9da7cd5f4673a4e3bd135a3c.tar.gz |
Merge pull request #1 from cngkaygusuz/master
Add Scrutinizer-CI configuration and other niceties
Diffstat (limited to 'examples/cpp_enum_parser.py')
-rw-r--r-- | examples/cpp_enum_parser.py | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/examples/cpp_enum_parser.py b/examples/cpp_enum_parser.py new file mode 100644 index 0000000..cd8f525 --- /dev/null +++ b/examples/cpp_enum_parser.py @@ -0,0 +1,52 @@ +#
+# cpp_enum_parser.py
+#
+# Posted by Mark Tolonen 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
|