from mode import Fundamental
from lex import Grammar, PatternRule, RegionRule

# this is a comment
class StringGrammar1(Grammar):
    rules = [
        PatternRule(r'data', r"[^\\']+"),
        PatternRule(r'escaped', r'\\.'),
    ]
class StringGrammar2(Grammar):
    rules = [
        PatternRule(r'data', r'[^\\"]+'),
        PatternRule(r'escaped', r'\\.'),
    ]

tbbid = r'[A-Z]{2}\d{3}-\d{3}-\d{3}'

class BDSGrammar(Grammar):
    rules = [
        PatternRule('eol', r'\n'),
        PatternRule('spaces', r' +'),
        PatternRule('comment', r'#.*$'),
        PatternRule('delimiter', r'(?:\|\||&&|[!<>=:\{\}\(\)\[\]])'),
        PatternRule('bds.section', r'section(?= *\()'),
        PatternRule('bds.component', tbbid + r"(?= *\()"),
        PatternRule('bds.aname', r"[a-z_]+(?==)"),
        RegionRule('bds.avalue', r"(?<=)'", StringGrammar1, r"'"),
        RegionRule('bds.avalue', r'(?<=)"', StringGrammar2, r'"'),
        PatternRule('bds.num', r"-?(?:[0-9][0-9\.]*[0-9]|[0-9])"),
        PatternRule('bds.alias', r"[a-z0-9]+(?=:" + tbbid + ")"),
        PatternRule('bds.id', tbbid),
        PatternRule('bds.func', r"[a-zA-Z0-9_]+(?= *\()"),
        RegionRule('bds.string', r"'", StringGrammar1, r"'"),
        RegionRule('bds.string', r'"', StringGrammar2, r'"'),
        PatternRule('bds.bareword', r'[a-zA-Z0-9_]+'),
    ]

class BDS(Fundamental):
    name       = 'bds'
    extensions = ['.bds']
    grammar    = BDSGrammar
    colors     = {
        'bds.section':      ('blue', 'default', 'bold'),
        'bds.component':    ('magenta', 'default', 'bold'),
        'bds.aname':        ('blue', 'default', 'bold'),
        'bds.avalue.start': ('green', 'default', 'bold'),
        'bds.avalue.data':  ('green', 'default', 'bold'),
        'bds.avalue.null':  ('green', 'default', 'bold'),
        'bds.avalue.end':   ('green', 'default', 'bold'),
        'bds.num':          ('red', 'default', 'bold'),
        'bds.alias':        ('magenta', 'default', 'bold'),
        'bds.id':           ('yellow', 'default', 'bold'),
        'bds.func':         ('cyan', 'default', 'bold'),
        'bds.op':           ('magenta', 'default', 'bold'),
        'bds.string.start': ('red', 'default', 'bold'),
        'bds.string.null':  ('red', 'default', 'bold'),
        'bds.string.end':   ('red', 'default', 'bold'),
    }
    opentokens  = ('delimiter',)
    opentags    = {'(': ')', '[': ']', '{': '}'}
    closetokens = ('delimiter',)
    closetags   = {')': '(', ']': '[', '}': '{'}
    _bindings = {
        'close-paren':   (')'),
        'close-bracket': (']'),
        'close-brace':   ('}'),
    }

install = BDS.install