blob: 2b985079ccbd0c6e62b75b05d7f2f938549ed6ec [file] [log] [blame]
/*
Copyright 2002-2003 John Plevyak, All Rights Reserved
*/
#include "gramgram.h"
#include "d.h"
static void help(ArgumentState *arg_state, char *arg_unused);
static int set_op_priority_from_rule = 0;
static int right_recursive_BNF = 0;
static int states_for_whitespace = 1;
static int states_for_all_nterms = 0;
static int tokenizer = 0;
static int longest_match = 0;
static char grammar_ident[256] = "gram";
static int scanner_blocks = 4;
static int scanner_block_size;
static int write_line_directives = 1;
static int write_header = -1;
static int token_type = 0;
static ArgumentDescription arg_desc[] = {
{"longest_match", 'l', "Use Longest Match Rule for Tokens", "T",
&longest_match, "D_MAKE_LONGEST_MATCH", NULL},
{"tokenizer", 'T', "Tokenizer for START", "T", &tokenizer,
"D_MAKE_PARSER_TOKENIZER", NULL},
{"write_header", 'H', "Write Header (-1:if not empty)", "I", &write_header,
"D_MAKE_PARSER_HEADER", NULL},
{"token_type", 't', "Token Type (0:define, 1:enum)", "I", &token_type,
"D_MAKE_PARSER_TOKEN", NULL},
{"whitespace_states", 'C', "Compute Whitespace States", "T",
&states_for_whitespace, "D_MAKE_PARSER_WHITESPACE", NULL},
{"all_states", 'A', "Compute States For All NTERMs", "T",
&states_for_all_nterms, "D_MAKE_PARSER_ALL_NTERMS", NULL},
{"grammar_ident", 'i', "Grammar Identifier", "S255", grammar_ident,
"D_MAKE_PARSER_GRAMMAR_IDENT", NULL},
{"scanner_blocks", 'b', "Scanner Blocks", "I", &scanner_blocks,
"D_MAKE_PARSER_SCANNER_BLOCKS", NULL},
{"op_pri_from_rule", 'p', "Set Operator Priority From Rule", "T",
&set_op_priority_from_rule, "D_MAKE_PARSER_SET_PRIORITY", NULL},
{"right_recurse_BNF", 'r', "Use Right Recursion For */+", "T",
&right_recursive_BNF, "D_MAKE_PARSER_RIGHT_RECURSIVE_BNF", NULL},
{"write_lines", 'L', "Write #line(s)", "T",
&write_line_directives, "D_MAKE_PARSER_WRITE_LINE_DIRECTIVES", NULL},
{"verbose", 'v', "Verbose", "+", &verbose_level,
"D_MAKE_PARSER_VERBOSE", NULL},
{"debug", 'd', "Debug", "+", &debug_level,
"D_MAKE_PARSER_DEBUG", NULL},
{"help", 'h', "Help", NULL, NULL, NULL, help},
{0}
};
static ArgumentState arg_state = {
0, 0,
"program",
arg_desc
};
extern D_ParserTables parser_tables_dparser_gram;
static void
help(ArgumentState *arg_state, char *arg_unused) {
char ver[30];
d_version(ver);
fprintf(stderr, "D Make Parser Version %s ", ver);
fprintf(stderr, "Copyright (c) 2002-2003 John Plevyak\n");
usage(arg_state, arg_unused);
}
int
main(int argc, char *argv[]) {
char *grammar_pathname;
Grammar *g;
process_args(&arg_state, argv);
if (arg_state.nfile_arguments != 1)
help(&arg_state, NULL);
grammar_pathname = arg_state.file_argument[0];
g = new_D_Grammar(grammar_pathname);
/* grammar construction options */
g->set_op_priority_from_rule = set_op_priority_from_rule;
g->right_recursive_BNF = right_recursive_BNF;
g->states_for_whitespace = states_for_whitespace;
g->states_for_all_nterms = states_for_all_nterms;
g->tokenizer = tokenizer;
g->longest_match = longest_match;
/* grammar writing options */
strcpy(g->grammar_ident, grammar_ident);
g->scanner_blocks = scanner_blocks;
g->scanner_block_size = scanner_block_size;
g->write_line_directives = write_line_directives;
g->write_header = write_header;
g->token_type = token_type;
if (parse_grammar(g, &parser_tables_dparser_gram, sizeof(ParseNode_User)) < 0)
d_fail("unable to parse grammar '%s'", grammar_pathname);
if (build_grammar(g) < 0)
d_fail("unable to load grammar '%s'", grammar_pathname);
if (write_ctables(g) < 0)
d_fail("unable to write C tables '%s'", grammar_pathname);
free_D_Grammar(g);
return 0;
}