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
|
import pyparsing as pp
ppc = pp.pyparsing_common
# fmt: off
word = pp.Word(pp.alphas).setName("word")
integer = pp.Word(pp.nums).setName("integer")
plus_minus = pp.Char("+-").set_name("add_sub")
mult_div = pp.Char("*/").set_name("mult_div")
street_address = pp.Group(integer("house_number")
+ word[1, ...]("street_name")
).setName("street_address")
time = pp.Regex(r"\d\d:\d\d")
grammar = (pp.Group(integer[1, ...])
+ (ppc.ipv4_address
& word("header_word")
& pp.Optional(time)
).setName("header with various elements")("header")
+ street_address("address")
+ pp.Group(pp.counted_array(word))
+ pp.Group(integer * 8)("data")
+ pp.Group(pp.Word("abc") + pp.Word("def")*3)
+ pp.infix_notation(integer,
[
(plus_minus().setName("pos_neg"), 1, pp.opAssoc.RIGHT),
(mult_div, 2, pp.opAssoc.LEFT),
(plus_minus, 2, pp.opAssoc.LEFT),
]).setName("simple_arithmetic")
+ ...
+ pp.Group(ppc.ipv4_address)("ip_address")
).setName("grammar")
grammar.create_diagram("railroad_diagram_demo.html", vertical=6, show_results_names=True)
test = """\
1 2 3
ABC 1.2.3.4 12:45
123 Main St
4
abc def ghi jkl
5 5 5 5 5 5 5 5
a d d d
2+2
alice bob charlie dave 5.6.7.8"""
result = grammar.runTests([test])
|