summaryrefslogtreecommitdiff
path: root/examples/shapes.py
diff options
context:
space:
mode:
authorPaul McGuire <ptmcg@users.noreply.github.com>2018-01-06 23:38:53 -0600
committerGitHub <noreply@github.com>2018-01-06 23:38:53 -0600
commit430c5ad767cc946e9da7cd5f4673a4e3bd135a3c (patch)
tree5a7df11e0fd52ab320b0ef3e670e260f315ca9ae /examples/shapes.py
parentf1d12567a8da4d254e6d62bb0d650c87c7d0bb89 (diff)
parentd953150a6db3ac247a64b047edc2df7156f3e56b (diff)
downloadpyparsing-git-430c5ad767cc946e9da7cd5f4673a4e3bd135a3c.tar.gz
Merge pull request #1 from cngkaygusuz/master
Add Scrutinizer-CI configuration and other niceties
Diffstat (limited to 'examples/shapes.py')
-rw-r--r--examples/shapes.py64
1 files changed, 64 insertions, 0 deletions
diff --git a/examples/shapes.py b/examples/shapes.py
new file mode 100644
index 0000000..b5a0ebd
--- /dev/null
+++ b/examples/shapes.py
@@ -0,0 +1,64 @@
+# shapes.py
+#
+# A sample program showing how parse actions can convert parsed
+# strings into a data type or object.
+#
+# Copyright 2012, Paul T. McGuire
+#
+
+# define class hierarchy of Shape classes, with polymorphic area method
+class Shape(object):
+ def __init__(self, tokens):
+ self.__dict__.update(tokens.asDict())
+
+ def area(self):
+ raise NotImplementedException()
+
+ def __str__(self):
+ return "<%s>: %s" % (self.__class__.__name__, self.__dict__)
+
+class Square(Shape):
+ def area(self):
+ return self.side**2
+
+class Rectangle(Shape):
+ def area(self):
+ return self.width * self.height
+
+class Circle(Shape):
+ def area(self):
+ return 3.14159 * self.radius**2
+
+
+from pyparsing import *
+
+number = Regex(r'-?\d+(\.\d*)?').setParseAction(lambda t:float(t[0]))
+
+# Shape expressions:
+# square : S <centerx> <centery> <side>
+# rectangle: R <centerx> <centery> <width> <height>
+# circle : C <centerx> <centery> <diameter>
+
+squareDefn = "S" + number('centerx') + number('centery') + number('side')
+rectDefn = "R" + number('centerx') + number('centery') + number('width') + number('height')
+circleDefn = "C" + number('centerx') + number('centery') + number('diameter')
+
+squareDefn.setParseAction(Square)
+rectDefn.setParseAction(Rectangle)
+
+def computeRadius(tokens):
+ tokens['radius'] = tokens.diameter/2.0
+circleDefn.setParseAction(computeRadius, Circle)
+
+shapeExpr = squareDefn | rectDefn | circleDefn
+
+tests = """\
+C 0 0 100
+R 10 10 20 50
+S -1 5 10""".splitlines()
+
+for t in tests:
+ shape = shapeExpr.parseString(t)[0]
+ print(shape)
+ print("Area:", shape.area())
+ print()