diff options
-rw-r--r-- | Makefile | 10 | ||||
-rw-r--r-- | ast.c | 4 | ||||
-rw-r--r-- | ast.h | 2 | ||||
-rw-r--r-- | cibic.y | 28 | ||||
-rw-r--r-- | main.c | 74 |
5 files changed, 82 insertions, 36 deletions
@@ -1,17 +1,19 @@ all: cibic run: - ./cibic + ./cibic --ast -debug: +db: gdb cibic -cibic: lex.yy.o cibic.tab.o ast.o - gcc -o cibic lex.yy.o cibic.tab.o ast.o +cibic: lex.yy.o cibic.tab.o ast.o main.o + gcc -o cibic lex.yy.o cibic.tab.o ast.o main.o lex.yy.o: lex.yy.c gcc -c lex.yy.c cibic.tab.o: cibic.tab.c gcc -c cibic.tab.c +main.o: main.c + gcc -c main.c -g -Wall -Wextra ast.o: ast.c gcc -c ast.c -g -Wall -Wextra -DCNODE_DEBUG lex.yy.c: cibic.l @@ -1,6 +1,5 @@ #include <stdlib.h> #include <assert.h> -#include <stdarg.h> #include <stdio.h> #include "ast.h" #include "cibic.tab.h" @@ -8,9 +7,6 @@ CNode *ast_root; -void cnode_init() { -} - void cnode_reverse_chd(CNode *node) { static CNode *chdn[MAX_CHDN]; CNode *p; @@ -1,5 +1,6 @@ #ifndef AST_H #define AST_H +#include <stdarg.h> #define EXP_POSTFIX 1024 #define POSTFIX_ARR 1025 @@ -68,7 +69,6 @@ typedef struct CNode { } loc; } CNode; -void cnode_init(); CNode *cnode_create_ast(CNode *wrapped); CNode *cnode_create_nop(); CNode *cnode_create_general(int type, int subtype, int pnum, va_list ap); @@ -17,10 +17,7 @@ %type<intval> INT_CONST CHAR_CONST %type<strval> IDENTIFIER STR_CONST %type<intval> assignment_operator equality_operator relational_operator shift_operator additive_operator multiplicative_operator unary_operator struct_or_union -%type<cnode> expression assignment_expression constant_expression -%type<cnode> logical_or_expression logical_and_expression inclusive_or_expression exclusive_or_expression and_expression equality_expression relational_expression shift_expression additive_expression multiplicative_expression cast_expression type_name -%type<cnode> unary_expression postfix_expression identifier primary_expression arguments postfix type_specifier program declaration function_definition parameters declarators init_declarators init_declarator initializer array_initializer struct_fields struct_field plain_declaration declarator_array plain_declarator expression_statement compound_statement statement -%type<cnode> comp_decls comp_stmts selection_statement iteration_statement jump_statement optional_exp declarator prog_list +%type<cnode> expression assignment_expression constant_expression logical_or_expression logical_and_expression inclusive_or_expression exclusive_or_expression and_expression equality_expression relational_expression shift_expression additive_expression multiplicative_expression cast_expression type_name unary_expression postfix_expression identifier primary_expression arguments postfix type_specifier program declaration function_definition parameters declarators init_declarators init_declarator initializer array_initializer struct_fields struct_field plain_declaration declarator_array plain_declarator expression_statement compound_statement statement comp_decls comp_stmts selection_statement iteration_statement jump_statement optional_exp declarator prog_list %start program %% program @@ -324,26 +321,3 @@ primary_expression identifier : IDENTIFIER { $$ = cnode_create_identifier($1); } %% -int yywrap() { - return 1; -} - -int yyerror(char *s) { -} - -extern FILE *yyin; -void test_ast() { - yyparse(); - cnode_init(); - if (ast_root) - cnode_debug_print(ast_root, 1); - else - fprintf(stderr, "Syntax Error\n"); -} - -int main() { - int ret; - yyin = fopen("in.c", "r"); - test_ast(); - return 0; -} @@ -0,0 +1,74 @@ +#include <stdio.h> +#include <getopt.h> +#include "cibic.tab.h" +#include "ast.h" + +extern int yyparse(); +extern FILE *yyin; + +int yywrap() { + return 1; +} + +int yyerror(char *s) { +} + +void print_ast() { + yyparse(); + if (ast_root) + cnode_debug_print(ast_root, 1); + else + fprintf(stderr, "Syntax Error\n"); +} + +void print_help() { +} + +static struct option lopts[] = { + { "ast", no_argument, 0, 'a'}, + { "help", no_argument, 0, 'h'}, + {0, 0, 0, 0} +}; + +enum { + PRINT_AST, + PRINT_HELP +} mode = PRINT_HELP; + +int main(int argc, char **argv) { + int option_index = 0, i; + while (1) + { + int c = getopt_long(argc, argv, "ah", lopts, &option_index); + if (c == -1) + break; + switch (c) + { + case 0: break; + case 'a': mode = PRINT_AST; break; + case 'h': mode = PRINT_HELP; break; + } + } + if (optind == argc - 1) + { + yyin = fopen(argv[argc - 1], "r"); + if (!yyin) + { + fprintf(stderr, "Error while opening file."); + return 1; + } + } + else if (optind == argc) + yyin = stdin; + else + { + fprintf(stderr, "Only one source file is exepected.\n"); + return 1; + } + switch (mode) + { + case PRINT_AST: print_ast(); break; + case PRINT_HELP: print_help(); break; + } + return 0; +} |