File: ebnf_number_words.py

package info (click to toggle)
pyparsing 3.3.2-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 12,200 kB
  • sloc: python: 30,867; ansic: 422; sh: 112; makefile: 24
file content (77 lines) | stat: -rw-r--r-- 2,112 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#
# ebnftest_number_parser.py
#
#     BNF from number_parser.py:
#
#     optional_and ::= ["and" | "-"]
#     optional_dash ::= ["-"]
#     units ::= "one" | "two" | "three" | ... | "nine"
#     tens ::= "twenty" | "thirty" | ... | "ninety"
#     one_to_99 ::= units | ten | teens | (tens [optional_dash units])
#     ten ::= "ten"
#     teens ::= "eleven" | "twelve" | ... | "nineteen"
#     hundreds ::= (units | teens_only | tens optional_dash units) "hundred"
#     thousands ::= one_to_99 "thousand"
#
#     # number from 1-999,999
#     number ::= [thousands [optional_and]] [hundreds[optional_and]] one_to_99
#                | [thousands [optional_and]] hundreds
#                | thousands
#

import ebnf

grammar = """
    (*
    EBNF for number_words.py
    *)
    number = [thousands, [and]], [hundreds, [and]], [one_to_99];
    thousands = one_to_99, "thousand";
    hundreds_mult = units | teens | multiples_of_ten, ["-"], units; 
    hundreds = hundreds_mult, "hundred";
    teens = 
        "eleven"
        | "twelve"
        | "thirteen"
        | "fourteen"
        | "fifteen"
        | "sixteen"
        | "seventeen"
        | "eighteen"
        | "nineteen"
    ;
    one_to_99 = units | teens | ten | multiples_of_ten, [["-"], units];
    ten = "ten";
    multiples_of_ten = "twenty" | "thirty" | "forty" | "fifty" | "sixty" | "seventy" | "eighty" | "ninety";
    units = "one" | "two" | "three" | "four" | "five" | "six" | "seven" | "eight" | "nine";
    and = "and" | "-";
    """

parsers = ebnf.parse(grammar)
number_parser = parsers["number"]

try:
    number_parser.create_diagram("ebnf_number_parser_diagram.html")
except Exception as e:
    print("Failed to create diagram for EBNF-generated number parser"
          f" - {type(e).__name__}: {e}")

number_parser.run_tests(
    """
    one
    seven
    twelve
    twenty six
    forty-two
    two hundred
    twelve hundred
    one hundred and eleven
    seven thousand and six
    twenty five hundred and one
    ninety nine thousand nine hundred and ninety nine

    # invalid
    twenty hundred
    """,
    full_dump=False
)