def value(rule): rule | (ID, star('-', _or(INT, ID))) rule.dont_ignore = True
def four_sub(rule): rule | (ID, _or('+','=','-'), ID, _or(NEWLINE, EOF))
def start(rule): rule | star(_or(section, NEWLINE)) rule.astAttrs = {'sections':[section]}
def section(rule): rule | (head, star(_or(define, NEWLINE))) rule.astAttrs = {'head':head, 'body':[define]}
def name(rule): rule | plus(_or(ID, NUMBER, WHITE)) rule.astAttrs = {'words':[ID, NUMBER, WHITE]}
def value(rule): rule | (star(_or(*not_newline)), _or(EOF, (NEWLINE, [INDENT, star(star(_or(*not_newline)), _or(NEWLINE, EOF)), _or(DEDENT, EOF)]))) rule.astAttrs = {'text':list(not_newline)+[NEWLINE]}
def define(rule): rule | (name, _or(':', '='), value) rule.astAttrs = {'name':name, 'value':value}
def at(rule): rule | (no_ignore("@", ID), _or(STRING, SSTRING, star(_not(_or(";", "}")))), ";") rule | star(_not(_or(";", "}")))
def at(rule): rule | (no_ignore('@', ID), _or(STRING, SSTRING, star(_not(_or(';','}')))), ';') rule | star(_not(_or(';','}')))
def start(rule): rule | plus(_or(STRING, ID, NUMBER)) rule.astAttrs = {'values':[STRING, ID, NUMBER]}
def at(rule): rule | (no_ignore('@', ID), _or(STRING, SSTRING))