-
Notifications
You must be signed in to change notification settings - Fork 35
Expand file tree
/
Copy pathconfig.py
More file actions
82 lines (65 loc) · 2.71 KB
/
config.py
File metadata and controls
82 lines (65 loc) · 2.71 KB
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
78
79
80
81
# -*- coding: utf-8 -*-
import pyparsing as pp
"""
Classes for handling the configuration files.
"""
__author__ = 'Bernardo Martínez Garrido'
__license__ = 'MIT'
__status__ = 'Development'
rule_at_least = \
pp.Literal('at_least_').suppress() + \
pp.Word(pp.nums).setResultsName('count')
rule_at_least.setParseAction(lambda v: int(v[0]))
_rule_config_string = pp.Regex(r'[^()\[\]\n,:]*')
_rule_config_string.setParseAction(lambda v: v[0].strip())
_rule_identifier = _rule_config_string + pp.Literal(':').suppress()
_rule_identifier.setParseAction(lambda rule: rule[0])
_rule_options_list = pp.Group(pp.delimitedList(_rule_config_string))
_rule_options_list.setParseAction(lambda rule: rule[0].asList())
rule_options = pp.Literal('(').suppress() + pp.Optional(_rule_options_list) + \
pp.Literal(')').suppress()
rule_id = pp.Literal('id:').suppress() + _rule_config_string.setResultsName(
'value')
rule_id.setName('ID field')
rule_id.setParseAction(lambda field: field[0])
rule_head = pp.Literal('head:').suppress() + _rule_options_list. \
setResultsName('value')
rule_head.setName('Head field')
rule_results = \
pp.Group(pp.Literal('results_name:') +
_rule_config_string.setResultsName('value'))
rule_results.setName('Results name field')
rule_results.setParseAction(lambda results: results[0])
rule_results.addParseAction(lambda results: results.value)
rule_terminal = \
_rule_identifier.setResultsName('rule_type') + \
_rule_config_string.setResultsName('rule_name') + \
pp.Optional(rule_options).setResultsName('rule_options')
_rule_rules_tree_terminal = pp.OneOrMore(pp.Group(rule_terminal))
_rule_rules_tree_recursive = pp.Forward()
_rule_rules_tree_recursive << \
_rule_config_string.setResultsName('list_type') + \
pp.Literal('[').suppress() + \
pp.ZeroOrMore(
pp.Group(_rule_rules_tree_recursive) |
pp.Group(rule_terminal)).setResultsName('rules') + \
pp.Literal(']').suppress()
_rule_rules_tree_recursive = \
pp.ZeroOrMore(
pp.Group(_rule_rules_tree_recursive)) + \
(pp.Group(_rule_rules_tree_recursive) |
pp.ZeroOrMore(pp.Group(rule_terminal))) + \
pp.ZeroOrMore(pp.Group(_rule_rules_tree_recursive))
rule_rules_tree = _rule_rules_tree_recursive
_rule_rules_root = \
pp.Literal('rules:').suppress() + \
pp.Literal('[').suppress() + \
pp.Optional(rule_rules_tree) + \
pp.Literal(']').suppress()
rule_config_set = \
_rule_identifier.setResultsName('rule_type') + \
rule_id.setResultsName('id') + \
pp.Optional(rule_head.setResultsName('head')) + \
pp.Optional(rule_results.setResultsName('results_name')) + \
pp.Group(_rule_rules_root).setResultsName('rules')
rule_config_file = pp.ZeroOrMore(pp.Group(rule_config_set))