Skip to content

Commit

Permalink
Merge pull request #40 from 0x7Fancy/stable (fix #17)
Browse files Browse the repository at this point in the history
feat: add 'directly head/tail recursion' optimized syntax '+'
  • Loading branch information
h1994st authored Jan 8, 2024
2 parents ff4e5a2 + 0854c7c commit 9716f10
Showing 1 changed file with 22 additions and 3 deletions.
25 changes: 22 additions & 3 deletions grammars/f1_g4_translate.py
Original file line number Diff line number Diff line change
Expand Up @@ -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])
Expand All @@ -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
Expand Down

0 comments on commit 9716f10

Please sign in to comment.