Implement caller keyword argument to slog()

Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2017-10-27 18:58:53 +02:00
commit 860f7d8cab
2 changed files with 35 additions and 21 deletions

View file

@ -92,8 +92,9 @@ def dump(obj):
slog(INFO, "obj.%s = %s (=> %s)" % (str(type(c)), str(c), str(v))) slog(INFO, "obj.%s = %s (=> %s)" % (str(type(c)), str(c), str(v)))
def dump_grammar(prio, grammar): def dump_grammar(prio, grammar):
caller = get_caller_pos()
for t, p in grammar.iteritems(): for t, p in grammar.iteritems():
p.dump(prio) p.dump(prio, caller=caller)
def cleanup_token(tok): def cleanup_token(tok):
tok = tok.strip() tok = tok.strip()
@ -179,6 +180,7 @@ class RuleComp:
self.token = token self.token = token
self.tp = tp self.tp = tp
slog(INFO, "creating rule component >" + self.str() + "<") slog(INFO, "creating rule component >" + self.str() + "<")
assert(token != "{ assignment")
def __eq__(self, rhs): def __eq__(self, rhs):
if self.token != rhs.token: if self.token != rhs.token:
@ -288,23 +290,30 @@ class Symbol:
return False return False
return True return True
def dump(self, prio = NOTICE, msg=""): def dump(self, prio = NOTICE, msg="", caller=None):
slog(prio, ",----------------", msg) if caller is None:
slog(prio, "| type =", self.tp) caller = get_caller_pos(1)
slog(prio, "| name =", self.name) slog(prio, ",----------------", msg, caller=caller)
slog(prio, "| token =", self.token) slog(prio, "| type =", self.tp, caller=caller)
slog(prio, "| sym =", self.sym) slog(prio, "| name =", self.name, caller=caller)
slog(prio, "| term =", self.term) slog(prio, "| token =", self.token, caller=caller)
slog(prio, "| regex =", self.regex) slog(prio, "| sym =", self.sym, caller=caller)
slog(prio, "| datatype =", self.datatype) slog(prio, "| term =", self.term, caller=caller)
slog(prio, "| is_lexical_element =", self.is_lexical_element) slog(prio, "| regex =", self.regex, caller=caller)
slog(prio, "| rules =", format_rules(self.rules)) slog(prio, "| datatype =", self.datatype, caller=caller)
slog(prio, "`----------------", msg) slog(prio, "| is_lexical_element =", self.is_lexical_element, caller=caller)
slog(prio, "| rules =", format_rules(self.rules), caller=caller)
slog(prio, "`----------------", msg, caller=caller)
def split_list_by(l_, tok): def split_list_by(l_, tok):
l = copy.deepcopy(l_) l = copy.deepcopy(l_)
return [list(x[1]) for x in itertools.groupby(l, lambda x: x==tok) if not x[0]] return [list(x[1]) for x in itertools.groupby(l, lambda x: x==tok) if not x[0]]
def split_list_by_regex(l_, regex):
l = copy.deepcopy(l_)
return [list(x[1]) for x in itertools.groupby(l, lambda x: re.match(regex, x)) if not x[0]]
def grammar_parse_ebnf(content_): def grammar_parse_ebnf(content_):
# remove comments # remove comments
@ -343,8 +352,8 @@ def grammar_parse_ebnf(content_):
raw_rules = split_list_by(raw_lhs_rhs[1], '|') raw_rules = split_list_by(raw_lhs_rhs[1], '|')
#slog(INFO, "raw_lhs_rhs[1] = ", raw_lhs_rhs[1]) #slog(INFO, "raw_lhs_rhs[1] = ", raw_lhs_rhs[1])
for raw_rule in raw_rules: for raw_rule in raw_rules:
#slog(INFO, "raw_rule =", raw_rule) slog(INFO, "raw_rule =", raw_rule)
rule_tokens = split_list_by(raw_rule, ',') rule_tokens = split_list_by_regex(raw_rule, ',{}\(\)\[\]')
#slog(INFO, "rule_tokens =", rule_tokens) #slog(INFO, "rule_tokens =", rule_tokens)
rule = [] rule = []
for raw_tok in rule_tokens: for raw_tok in rule_tokens:
@ -363,7 +372,6 @@ def grammar_parse_ebnf(content_):
slog(INFO, "Appending production>" + lhs + "< -> ", p.str()) slog(INFO, "Appending production>" + lhs + "< -> ", p.str())
grammar[lhs] = p grammar[lhs] = p
dump_grammar(INFO, grammar)
return grammar return grammar
def grammar_get_types(grammar): def grammar_get_types(grammar):

View file

@ -72,7 +72,12 @@ def __pad(token, total_size, right_align = False):
return space + token return space + token
return token + space return token + space
def slog(prio, *args): # export def get_caller_pos(up = 1):
assert(up == 1) # TODO: implement this
caller_frame = inspect.currentframe().f_back.f_back
return (basename(caller_frame.f_code.co_filename), caller_frame.f_lineno)
def slog(prio, *args, **kwargs): # export
if prio > level: if prio > level:
return return
@ -86,10 +91,11 @@ def slog(prio, *args): # export
msg += short_prio_str[prio] + ' ' msg += short_prio_str[prio] + ' '
if f_position in flags: if f_position in flags:
caller_frame = inspect.currentframe().f_back if 'caller' in kwargs:
line = '[' + __pad(str(caller_frame.f_lineno), 4, True) + ']' name, line = kwargs['caller']
file = __pad(basename(caller_frame.f_code.co_filename), 20) else:
msg += file + line name, line = get_caller_pos(1)
msg += __pad(name, 20) + '[' + __pad(str(line), 4, True) + ']'
if f_color in flags: if f_color in flags:
color_on, color_off = prio_colors[prio] color_on, color_off = prio_colors[prio]