summaryrefslogtreecommitdiff
path: root/examples/romanNumerals.py
diff options
context:
space:
mode:
authorPaul McGuire <ptmcg@austin.rr.com>2019-08-05 22:07:15 -0500
committerPaul McGuire <ptmcg@austin.rr.com>2019-08-05 22:07:15 -0500
commit9ca5931db90a487085851fd9f847066fd48ae55b (patch)
tree9dcdb6fb3bd842120b666c470b9206be237574a1 /examples/romanNumerals.py
parent10b5e96bda409e6ecd895fe41f65cc9bd943b824 (diff)
downloadpyparsing-git-9ca5931db90a487085851fd9f847066fd48ae55b.tar.gz
Code style updates; remove deprecated methods
Diffstat (limited to 'examples/romanNumerals.py')
-rw-r--r--examples/romanNumerals.py156
1 files changed, 79 insertions, 77 deletions
diff --git a/examples/romanNumerals.py b/examples/romanNumerals.py
index 8765055..6e675a9 100644
--- a/examples/romanNumerals.py
+++ b/examples/romanNumerals.py
@@ -1,77 +1,79 @@
-# romanNumerals.py
-#
-# Copyright (c) 2006, Paul McGuire
-#
-
-from pyparsing import *
-
-def romanNumeralLiteral(numeralString, value):
- return Literal(numeralString).setParseAction(replaceWith(value))
-
-one = romanNumeralLiteral("I",1)
-four = romanNumeralLiteral("IV",4)
-five = romanNumeralLiteral("V",5)
-nine = romanNumeralLiteral("IX",9)
-ten = romanNumeralLiteral("X",10)
-forty = romanNumeralLiteral("XL",40)
-fifty = romanNumeralLiteral("L",50)
-ninety = romanNumeralLiteral("XC",90)
-onehundred = romanNumeralLiteral("C",100)
-fourhundred = romanNumeralLiteral("CD",400)
-fivehundred = romanNumeralLiteral("D",500)
-ninehundred = romanNumeralLiteral("CM",900)
-onethousand = romanNumeralLiteral("M",1000)
-
-numeral = ( onethousand | ninehundred | fivehundred | fourhundred |
- onehundred | ninety | fifty | forty | ten | nine | five |
- four | one ).leaveWhitespace()
-
-romanNumeral = OneOrMore(numeral).setParseAction( lambda s,l,t : sum(t) )
-
-# unit tests
-def makeRomanNumeral(n):
- def addDigit(n,limit,c,s):
- n -= limit
- s += c
- return n,s
-
- ret = ""
- while n >= 1000: n,ret = addDigit(n,1000,"M",ret)
- while n >= 900: n,ret = addDigit(n, 900,"CM",ret)
- while n >= 500: n,ret = addDigit(n, 500,"D",ret)
- while n >= 400: n,ret = addDigit(n, 400,"CD",ret)
- while n >= 100: n,ret = addDigit(n, 100,"C",ret)
- while n >= 90: n,ret = addDigit(n, 90,"XC",ret)
- while n >= 50: n,ret = addDigit(n, 50,"L",ret)
- while n >= 40: n,ret = addDigit(n, 40,"XL",ret)
- while n >= 10: n,ret = addDigit(n, 10,"X",ret)
- while n >= 9: n,ret = addDigit(n, 9,"IX",ret)
- while n >= 5: n,ret = addDigit(n, 5,"V",ret)
- while n >= 4: n,ret = addDigit(n, 4,"IV",ret)
- while n >= 1: n,ret = addDigit(n, 1,"I",ret)
- return ret
-tests = " ".join(makeRomanNumeral(i) for i in range(1,5000+1))
-
-roman_int_map = {}
-expected = 1
-for t,s,e in romanNumeral.scanString(tests):
- orig = tests[s:e]
- if t[0] != expected:
- print("{0} {1} {2}".format("==>", t, orig))
- roman_int_map[orig] = t[0]
- expected += 1
-
-def verify_value(s, tokens):
- expected = roman_int_map[s]
- if tokens[0] != expected:
- raise Exception("incorrect value for {0} ({1}), expected {2}".format(s, tokens[0], expected ))
-
-romanNumeral.runTests("""\
- XVI
- XXXIX
- XIV
- XIX
- MCMLXXX
- MMVI
- """, fullDump=False,
- postParse=verify_value) \ No newline at end of file
+# romanNumerals.py
+#
+# Copyright (c) 2006, 2019, Paul McGuire
+#
+
+import pyparsing as pp
+
+def romanNumeralLiteral(numeralString, value):
+ return pp.Literal(numeralString).setParseAction(pp.replaceWith(value))
+
+one = romanNumeralLiteral("I", 1)
+four = romanNumeralLiteral("IV", 4)
+five = romanNumeralLiteral("V", 5)
+nine = romanNumeralLiteral("IX", 9)
+ten = romanNumeralLiteral("X", 10)
+forty = romanNumeralLiteral("XL", 40)
+fifty = romanNumeralLiteral("L", 50)
+ninety = romanNumeralLiteral("XC", 90)
+onehundred = romanNumeralLiteral("C", 100)
+fourhundred = romanNumeralLiteral("CD", 400)
+fivehundred = romanNumeralLiteral("D", 500)
+ninehundred = romanNumeralLiteral("CM", 900)
+onethousand = romanNumeralLiteral("M", 1000)
+
+numeral = (onethousand | ninehundred | fivehundred | fourhundred
+ | onehundred | ninety | fifty | forty | ten | nine | five
+ | four | one).leaveWhitespace()
+
+romanNumeral = numeral[1, ...].setParseAction(sum)
+
+# unit tests
+def makeRomanNumeral(n):
+ def addDigits(n, limit, c, s):
+ while n > limit:
+ n -= limit
+ s += c
+ return n, s
+
+ ret = ""
+ n, ret = addDigits(n, 1000, "M", ret)
+ n, ret = addDigits(n, 900, "CM", ret)
+ n, ret = addDigits(n, 500, "D", ret)
+ n, ret = addDigits(n, 400, "CD", ret)
+ n, ret = addDigits(n, 100, "C", ret)
+ n, ret = addDigits(n, 90, "XC", ret)
+ n, ret = addDigits(n, 50, "L", ret)
+ n, ret = addDigits(n, 40, "XL", ret)
+ n, ret = addDigits(n, 10, "X", ret)
+ n, ret = addDigits(n, 9, "IX", ret)
+ n, ret = addDigits(n, 5, "V", ret)
+ n, ret = addDigits(n, 4, "IV", ret)
+ n, ret = addDigits(n, 1, "I", ret)
+ return ret
+
+# make a string of all roman numerals from I to MMMMM
+tests = " ".join(makeRomanNumeral(i) for i in range(1, 5000+1))
+
+# parse each roman numeral, and populate map for validation below
+roman_int_map = {}
+for expected, (t, s, e) in enumerate(romanNumeral.scanString(tests), start=1):
+ orig = tests[s:e]
+ if t[0] != expected:
+ print("{0} {1} {2}".format("==>", t, orig))
+ roman_int_map[orig] = t[0]
+
+def verify_value(s, tokens):
+ expected = roman_int_map[s]
+ if tokens[0] != expected:
+ raise Exception("incorrect value for {0} ({1}), expected {2}".format(s, tokens[0], expected ))
+
+romanNumeral.runTests("""\
+ XVI
+ XXXIX
+ XIV
+ XIX
+ MCMLXXX
+ MMVI
+ """, fullDump=False,
+ postParse=verify_value)