forked from Luctia/owl_perftest
/
grammar_generator.py
65 lines (52 loc) · 2.02 KB
/
grammar_generator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import random
TERMINALS = ["number", "identifier", "integer", "string"]
def get_random_terminal():
terminals = list(dict.fromkeys(random.choices(TERMINALS, k=random.randint(1, len(TERMINALS)))))
output = terminals[0]
for terminal in terminals[1:]:
output += " | " + terminal
return output
def many(N, filename):
grammar = open(filename, "w")
for i in range(N):
grammar.write("a" + str(i) + " = " + get_random_terminal() + "\n")
grammar.close()
def deep(N, filename):
grammar = open(filename, "w")
for i in range(N):
grammar.write("a" + str(i) + " = a" + str(i + 1) + "\n")
grammar.write("a" + str(N) + " = " + get_random_terminal())
grammar.close()
def nested(N, filename):
grammar = open(filename, "w")
token_pairs = [["{", "}"], ["(", ")"], ["[", "]"]]
# First, we write a terminal that could be anything.
res = "nested0 = " + get_random_terminal() + "\n"
for i in range(N):
token_pair = random.choice(token_pairs)
res = "nested" + str(i + 1) + " = [ '" + token_pair[0] + "' nested" + str(i) + " '" + token_pair[1] + "' ]\n" + res
grammar.write(res)
grammar.close()
# At large N:
# free(): invalid next size (fast)
# Aborted (core dumped)
def optionals(N, filename):
grammar = open(filename, "w")
output = get_random_terminal()
terminals = ""
# N = 331 is most we could get until Owl indicated that we were too deeply nested.
if N > 331:
N = 331
for i in range(N):
terminals += "terminal" + str(i * 2) + " = " + get_random_terminal() + "\n"
terminals += "terminal" + str(i * 2 + 1) + " = " + get_random_terminal() + "\n"
output = "(terminal" + str(i * 2) + " " + output + ")? terminal" + str(i * 2 + 1)
grammar.write("if = " + output + "\n" + terminals)
grammar.close()
def long(N, filename):
grammar = open(filename, "w")
rule = "long = "
for _ in range(N):
rule += random.choice(TERMINALS) + " "
grammar.write(rule)
grammar.close()