From 18e889237f7d4c2d6695d7bfb4375bb64c3c5279 Mon Sep 17 00:00:00 2001 From: John Schmitt Date: Thu, 4 Nov 2021 13:28:55 +0100 Subject: [PATCH] Extended GrammarFuzzer to handle EBNF grammars. --- docs/beta/code/GrammarFuzzer.py | 9 ++++++++- docs/code/GrammarFuzzer.py | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/beta/code/GrammarFuzzer.py b/docs/beta/code/GrammarFuzzer.py index 570ff8728..e4dca8ede 100755 --- a/docs/beta/code/GrammarFuzzer.py +++ b/docs/beta/code/GrammarFuzzer.py @@ -398,10 +398,11 @@ def tree_to_string(tree): class GrammarFuzzer(Fuzzer): def __init__(self, grammar, start_symbol=START_SYMBOL, - min_nonterminals=0, max_nonterminals=10, disp=False, log=False): + min_nonterminals=0, max_nonterminals=10, conv=False, disp=False, log=False): """Produce strings from `grammar`, starting with `start_symbol`. If `min_nonterminals` or `max_nonterminals` is given, use them as limits for the number of nonterminals produced. + If `conv` is set, convert EBNF to BNF. (Converting BNF will have no impact.) If `disp` is set, display the intermediate derivation trees. If `log` is set, show intermediate steps as text on standard output.""" @@ -412,6 +413,8 @@ def __init__(self, grammar, start_symbol=START_SYMBOL, self.disp = disp self.log = log self.check_grammar() # Invokes is_valid_grammar() + self.conv_grammar() # Invokes convert_ebnf_grammar() if conv is set + self.check_grammar() #### Excursion: `check_grammar()` implementation @@ -428,6 +431,10 @@ def check_grammar(self): start_symbol=self.start_symbol, supported_opts=self.supported_opts()) + def conv_grammar(self): + if self.conv: + self.grammar = convert_ebnf_grammar(self.grammar) + def supported_opts(self): return set() diff --git a/docs/code/GrammarFuzzer.py b/docs/code/GrammarFuzzer.py index 570ff8728..b94275020 100755 --- a/docs/code/GrammarFuzzer.py +++ b/docs/code/GrammarFuzzer.py @@ -398,10 +398,11 @@ def tree_to_string(tree): class GrammarFuzzer(Fuzzer): def __init__(self, grammar, start_symbol=START_SYMBOL, - min_nonterminals=0, max_nonterminals=10, disp=False, log=False): + min_nonterminals=0, max_nonterminals=10, conv=False, disp=False, log=False): """Produce strings from `grammar`, starting with `start_symbol`. If `min_nonterminals` or `max_nonterminals` is given, use them as limits for the number of nonterminals produced. + If `conv` is set, convert EBNF to BNF. (Converting BNF will have no impact.) If `disp` is set, display the intermediate derivation trees. If `log` is set, show intermediate steps as text on standard output.""" @@ -412,6 +413,8 @@ def __init__(self, grammar, start_symbol=START_SYMBOL, self.disp = disp self.log = log self.check_grammar() # Invokes is_valid_grammar() + self.conv_grammar() # Invokes convert_ebnf_grammar() if conv is set + self.check_grammar() #### Excursion: `check_grammar()` implementation @@ -428,6 +431,10 @@ def check_grammar(self): start_symbol=self.start_symbol, supported_opts=self.supported_opts()) + def conv_grammar(self): + if self.conv: + self.grammar = convert_ebnf_grammar(self.grammar) + def supported_opts(self): return set()