Mercurial > iscconf
changeset 4:b1e8f8a90853
Working parser
| author | Radomir Dopieralski <radomir.dopieralski@allegro.pl> |
|---|---|
| date | Tue, 26 Jun 2012 14:33:18 +0200 |
| parents | ea08558852e8 |
| children | d0c1181969ba |
| files | iscconf/__init__.py iscconf/parser.py tests/test_dhcp.py |
| diffstat | 3 files changed, 99 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/iscconf/__init__.py Tue Jun 26 12:22:45 2012 +0200 +++ b/iscconf/__init__.py Tue Jun 26 14:33:18 2012 +0200 @@ -0,0 +1,1 @@ +from iscconf.parser import parse
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iscconf/parser.py Tue Jun 26 14:33:18 2012 +0200 @@ -0,0 +1,97 @@ +import ply.lex +import ply.yacc + +tokens = ( + 'NAME', 'IPADDR', 'DOMAIN', 'MACADDR', + 'BRACE_OPEN', 'BRACE_CLOSE', 'SEMICOLON', + 'STRING', 'COMMENT', +) + +t_ignore = ' \t' +t_NAME = r'[a-zA-Z][a-zA-Z0-9-]*[a-zA-Z0-9]*' +t_IPADDR = r'([0-2]?[0-9]?[0-9][.]){3}[0-2]?[0-9]?[0-9]' +t_DOMAIN = r'([a-z][a-z0-9-]*[.])+[a-z][a-z0-9-]*[.]?' +t_MACADDR = r'([0-9a-fA-F][0-9a-fA-F]:){5}[0-9a-fA-F][0-9a-fA-F]' +t_BRACE_OPEN = r'{' +t_BRACE_CLOSE = r'}' +t_SEMICOLON = ';' +t_ignore_COMMENT = r'^[#].*$' + + +class Error(Exception): + pass + +class SyntaxError(Error): + pass + +class LexicalError(Error): + pass + +def t_string(t): + r'"([^"]|\\")*"' + t.value = t.value[1:1] + return t + +def t_newline(t): + r'\n+' + t.lexer.lineno += t.value.count("\n") + +def t_error(t): + raise LexicalError("Lexical error at %r line %d" % (t.value, t.lineno)) + +def p_content_empty(p): + r'content :' + p[0] = {} + +def p_content(p): + r'content : content entry' + p[0] = dict(p[1]) + p[0].update(p[2]) + +def p_value(p): + r''' + value : IPADDR + | DOMAIN + | MACADDR + | STRING + ''' + p[0] = p[1] + +def p_key_part(p): + r''' + key_part : NAME + | DOMAIN + | IPADDR + | MACADDR + | STRING + ''' + p[0] = p[1] + +def p_key_single(p): + r'key : key_part' + p[0] = (p[1],) + +def p_key(p): + r'key : key key_part' + p[0] = p[1] + (p[2],) + +def p_entry(p): + r''' + entry : key value SEMICOLON + | key block + | key block SEMICOLON + ''' + p[0] = { p[1]: p[2] } + +def p_block(p): + r'block : BRACE_OPEN content BRACE_CLOSE' + p[0] = p[2] + +def p_error(p): + raise SyntaxError("Syntax error at %r line %d" % (p.value, p.lineno)) + +def parse(string): + return ply.yacc.parse(string) + +ply.lex.lex() +ply.yacc.yacc()
--- a/tests/test_dhcp.py Tue Jun 26 12:22:45 2012 +0200 +++ b/tests/test_dhcp.py Tue Jun 26 14:33:18 2012 +0200 @@ -35,7 +35,7 @@ ('fixed-address',): '10.242.15.6', ('hardware', 'ethernet'): '00:1b:78:cf:b3:90', }, - ('host', 's10557.dc2'): { + ('host', 's10498.dc2'): { ('fixed-address',): '10.242.15.5', ('hardware', 'ethernet'): '00:1a:4b:d0:7c:60', },
