diff --git a/.gitignore b/.gitignore index b01daccb..a558afce 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,5 @@ project/target npm/aqua.js **/node_modules + +**/.antlr diff --git a/fuzzing-tests/Aqua.g4 b/fuzzing-tests/Aqua.g4 new file mode 100644 index 00000000..7af55031 --- /dev/null +++ b/fuzzing-tests/Aqua.g4 @@ -0,0 +1,51 @@ +grammar Aqua; + +tokens { + INDENT, + DEDENT, + NL +} + +@lexer::members { +# A hack to support indentation +def create_node(self, node, *args, **kwargs): + result = super().create_node(node, *args, **kwargs) + + if not hasattr(self, "indent_level"): + self.indent_level = 0 + + if node.name == "INDENT": + self.indent_level += 1 + result.src = "\n" + " " * self.indent_level + elif node.name == "DEDENT": + self.indent_level -= 1 + result.src = "\n" + " " * self.indent_level + elif node.name == "NL": + result.src = "\n" + " " * self.indent_level + + return result +} + +prog: function+; + +function: FUNC SP+ closure; + +closure: + ID LPAREN ((typedId COMMA SP*)* typedId)? RPAREN COLON block; + +block: INDENT ('expr' NL | ifStat)+ DEDENT; + +ifStat: IF SP+ ID COLON block; + +typedId: ID SP* COLON SP* type; + +type: 'u16'; + +LPAREN: '('; +RPAREN: ')'; +COLON: ':'; +COMMA: ','; +SP: ' '; +IF: 'if'; +FUNC: 'func'; +ID: [a-zA-Z][a-zA-Z_]+; diff --git a/fuzzing-tests/README.md b/fuzzing-tests/README.md new file mode 100644 index 00000000..2208b607 --- /dev/null +++ b/fuzzing-tests/README.md @@ -0,0 +1,21 @@ +# Fuzzing tests for Aqua Compiler + +## Installation + +```sh +python3 -m pip install -r requirements.txt +``` + +## Usage + +File `Aqua.g4` contains ANTLRv4 grammar of Aqua Language. + +The following command will generate python fuzzing input generators for Aqua in `generated` dir: +```sh +grammarinator-process Aqua.g4 -o generated +``` + +The following command will generate `N` tests in `tests` dir with maximum grammar depth `D`: +```sh +grammarinator-generate -p generated/AquaUnparser.py -l generated/AquaUnlexer -r prog -n N -d D +``` \ No newline at end of file diff --git a/fuzzing-tests/requirements.txt b/fuzzing-tests/requirements.txt new file mode 100644 index 00000000..5979d3b1 --- /dev/null +++ b/fuzzing-tests/requirements.txt @@ -0,0 +1 @@ +grammarinator==19.3 \ No newline at end of file