This project involves implementing a parser for a subset of Elixir data literals using a recursive descent parser. The goal is to create a program that can take input in the specified format and produce JSON output representing the parsed data.

Here's a breakdown of the project requirements:

1. Implement a recursive descent parser for a subset of Elixir data literals.
2. Use regular expressions to implement a trivial scanner.
3. Produce JSON output representing the parsed data.
4. Use the implementation of either Java, Node, or Python3 available on remote.cs to implement the parser.
5. Provide all necessary steps to compile the chosen language to one of the above languages.
6. The parser should handle the following grammar:

A sentence in the language consists of a sequence of zero-or-more data-literal's.

A data-literal is either a list literal, a tuple literal, a map literal, or a primitive literal.

* A list literal is a sequence of 0-or-more comma-separated data-literal's within square brackets [ and ].
* A tuple literal is a sequence of 0-or-more comma-separated data-literal's within braces { and }.
* A map literal is a sequence of 0-or-more comma-separated key-pair's within a decorated left brace %{ and a regular right brace }.
* A key-pair is either a sequence consisting of a data-literal, a right-arrow => followed by a data-literal, or a sequence consisting of a key followed by a data-literal.
* An integer consists of a sequence of one-or-more digits, possibly containing internal underscores _.
* An atom consists of a colon :, followed by an alphabetic character or underscore _ followed by a sequence of zero-or-more alphanumeric characters or underscores _.
* A boolean is one of the words true or false.
7. Whitespace and #-to-end-of-line comments should be ignored.
8. Create a zip-archive containing two shell scripts, make.sh and run.sh, that meet the following criteria:
* Running make.sh from any directory should build any artifacts needed to run the program within the prj1-sol directory.
* Running run.sh from any directory should read and parse a sentence of the above language from standard input and output on standard output a single line containing the JSON representation of the parse.
9. Different kinds of data literals should be output as a JSON object having two properties: %k and %v.
* %k represents the kind of the literal, which can be int, atom, bool, list, tuple, or map.
* %v represents the value of the literal, which depends on the type of literal.
10. The JSON representation of the different kinds of literals should be as follows:
* An integer has the JSON representation { "%k": "int", "%v": value } where value is a JSON integer representing the value of the integer.
* An atom has the JSON representation { "%k": "atom", "%v": value } where value is a JSON string spelling out the atom.
* A boolean has the JSON representation { "%k": "bool", "%v": value } where value is a JSON boolean representing the value of the boolean.
* A key has the JSON representation { "%k": "atom", "%v": value } where value is a JSON string spelling out the key lexeme, but with the : moved to the front.
* A list has the JSON representation { "%k": "list", "%v": value } where value is a JSON list containing the JSON representations of the individual items in the list.
* A tuple has the JSON representation { "%k": "tuple", "%v": value } where value is a JSON list containing the JSON representations of the individual items in the tuple.
* A map has the JSON representation { "%k": "map", "%v": value } where value is a JSON list containing the 2-element JSON lists representing the individual elements in the map.
11. The JSON output should consist of a single line without any whitespace other than the newline terminator. The members of a JSON object may be output in any order.
12. If there are errors in the content, the program should exit with a non-zero status after detecting the first syntax error. It should output a suitable error message on standard error.