diff --git a/grammars/f1_g4_translate.py b/grammars/f1_g4_translate.py index 0b54790..b69e461 100644 --- a/grammars/f1_g4_translate.py +++ b/grammars/f1_g4_translate.py @@ -75,11 +75,30 @@ def esc_token(self, t): t = t.replace('\t', '\\t') return t - def rule_to_s(self, rule, grammar): - return ' '.join(["'%s'" % self.esc_token(t) + def rule_to_s(self, key, rule, grammar): + # feat: add 'directly head/tail recursion' optimized syntax '+' + if len(rule) == 0: + return '' + + # head recursion + recursion = False + if rule[0] == key: + rule = rule[1:] + recursion = True + # tail recursion + if rule[-1] == key: + rule = rule[:-1] + recursion = True + + # append rules + data = ' '.join(["'%s'" % self.esc_token(t) if t not in grammar else self.to_key(t) for t in rule]) + if recursion: + data = "(%s)+" % data + return data + def translate(self): lines = ['grammar Grammar;'] entries = '\n | '.join([self.to_key(entry_k) + ' EOF' for entry_k in self.entry_keys]) @@ -89,7 +108,7 @@ def translate(self): ;''' % entries) for k in self.grammar_keys: rules = self.grammar[k] - v = '\n | '.join([self.rule_to_s(rule, self.grammar) + v = '\n | '.join([self.rule_to_s(k, rule, self.grammar) for rule in rules]) lines.append('''\ %s