jitters: add option parsing
This commit is contained in:
parent
fe05cff2c8
commit
f33e445562
|
@ -1,21 +1,105 @@
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <argp.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#include "ast/ast.h"
|
#include "ast/ast.h"
|
||||||
#include "print/printer.h"
|
#include "compile/compiler.h"
|
||||||
|
#include "eval/evaluator.h"
|
||||||
#include "parse/parse-jitters.h"
|
#include "parse/parse-jitters.h"
|
||||||
|
#include "print/printer.h"
|
||||||
|
|
||||||
int main(void)
|
const char *argp_program_version = PACKAGE_STRING;
|
||||||
|
const char *argp_program_bug_address = "<" PACKAGE_BUGREPORT ">";
|
||||||
|
|
||||||
|
static char doc[] =
|
||||||
|
PACKAGE_NAME " -- an experiment in interpreters and compilers";
|
||||||
|
|
||||||
|
|
||||||
|
static struct argp_option options[] = {
|
||||||
|
{"evaluate", 'e', 0, 0, "Evaluate input by walking the tree" },
|
||||||
|
{"compile", 'c', 0, 0, "Compile input to assembly" },
|
||||||
|
{"print", 'p', 0, 0, "Print parsed expression" },
|
||||||
|
{"output", 'o', "FILE", 0, "Output to FILE instead of standard output" },
|
||||||
|
{"debug", 'd', 0, 0, "Emit debug output from parser" },
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct arguments
|
||||||
|
{
|
||||||
|
bool debug; // Whether to activate Bison using debug trace
|
||||||
|
bool compile; // Whether to compile the input
|
||||||
|
bool evaluate; // Whether to evaluate the input
|
||||||
|
bool print; // Whether to print the input
|
||||||
|
const char *output_file; // Where to output
|
||||||
|
};
|
||||||
|
|
||||||
|
static error_t parse_opt(int key, char *arg, struct argp_state *state)
|
||||||
|
{
|
||||||
|
struct arguments *arguments = state->input;
|
||||||
|
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case 'c':
|
||||||
|
arguments->compile = true;
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
arguments->debug = true;
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
arguments->evaluate = true;
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
arguments->print = true;
|
||||||
|
break;
|
||||||
|
case 'o':
|
||||||
|
arguments->output_file = arg;
|
||||||
|
break;
|
||||||
|
case ARGP_KEY_ARG:
|
||||||
|
argp_usage(state);
|
||||||
|
break;
|
||||||
|
case ARGP_KEY_END:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return ARGP_ERR_UNKNOWN;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct argp argp = { options, parse_opt, 0, doc };
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct ast_node *ast = NULL;
|
struct ast_node *ast = NULL;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
yydebug = getenv("PARSE") != NULL;
|
struct arguments arguments = {
|
||||||
|
.output_file = "-",
|
||||||
|
};
|
||||||
|
FILE *output = stdout;
|
||||||
|
|
||||||
|
argp_parse(&argp, argc, argv, 0, 0, &arguments);
|
||||||
|
|
||||||
|
yydebug = getenv("PARSE") != NULL || arguments.debug;
|
||||||
|
|
||||||
|
if (strcmp(arguments.output_file, "-"))
|
||||||
|
output = fopen(arguments.output_file, "w");
|
||||||
|
|
||||||
if ((ret = yyparse(&ast)) == 0) {
|
if ((ret = yyparse(&ast)) == 0) {
|
||||||
printer_ast(ast);
|
if (arguments.compile)
|
||||||
putchar('\n');
|
compile_ast(ast, output);
|
||||||
|
if (arguments.evaluate)
|
||||||
|
fprintf(output, "%d\n", evaluate_ast(ast));
|
||||||
|
if (arguments.print)
|
||||||
|
print_ast(ast, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
destroy_ast(ast);
|
destroy_ast(ast);
|
||||||
|
if (strcmp(arguments.output_file, "-"))
|
||||||
|
fclose(output);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue