summaryrefslogtreecommitdiff
path: root/tools/d2c/d2c_gram.y
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2016-01-28 23:32:25 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2016-01-28 23:32:25 (GMT)
commit16e0fd9d89ef433848678dfc8dd20426844a2868 (patch)
tree79075ae02c133cea21ffb555b1086aae833b3aac /tools/d2c/d2c_gram.y
parent66c99d59d6a6d533de0bb65488de8243213bcdea (diff)
Cleaned, rewritten and improved the whole code of the compiler.
Diffstat (limited to 'tools/d2c/d2c_gram.y')
-rw-r--r--tools/d2c/d2c_gram.y472
1 files changed, 0 insertions, 472 deletions
diff --git a/tools/d2c/d2c_gram.y b/tools/d2c/d2c_gram.y
deleted file mode 100644
index 9827b05..0000000
--- a/tools/d2c/d2c_gram.y
+++ /dev/null
@@ -1,472 +0,0 @@
-
-%{
-
-#include <getopt.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-#include "coder.h"
-#include "d2c_tok.h"
-
-
-extern int yylex();
-
-extern void free_flex_memory(void);
-
-
-/* Affiche un message d'erreur suite à l'analyse en échec. */
-static int d2c_error(rented_coder *, char *);
-
-/* Affiche des indications sur l'utilisation du programme. */
-static void show_usage(const char *);
-
-
-%}
-
-
-%code requires {
-
-/* Pour la définition des expressions conditionnelles... */
-#include "coder.h"
-
-#include "conv.h"
-#include "helpers.h"
-
-struct action_tmp
-{
- CondActionType action;
- const char *details;
-};
-
-
-#define register_named_field_in_coder(c, n, l) \
- ({ \
- encoding_spec *__spec; \
- coding_bits *__bits; \
- __spec = get_current_encoding_spec(c); \
- __bits = get_bits_in_encoding_spec(__spec); \
- register_named_field_in_bits(__bits, n, l); \
- })
-
-#define register_bit_in_coder(c, v) \
- ({ \
- encoding_spec *__spec; \
- coding_bits *__bits; \
- __spec = get_current_encoding_spec(c); \
- __bits = get_bits_in_encoding_spec(__spec); \
- register_bit_in_bits(__bits, v); \
- })
-
-#define count_coder_bits(c) \
- ({ \
- encoding_spec *__spec; \
- coding_bits *__bits; \
- __spec = get_current_encoding_spec(c); \
- __bits = get_bits_in_encoding_spec(__spec); \
- count_coded_bits(__bits); \
- })
-
-#define register_syntax_item_in_coder(c, n, i) \
- ({ \
- encoding_spec *__spec; \
- asm_syntax *__syntax; \
- __spec = get_current_encoding_spec(c); \
- __syntax = get_syntax_in_encoding_spec(__spec); \
- register_syntax_item(__syntax, n, i); \
- })
-
-#define register_conversion_in_coder(c, f) \
- ({ \
- encoding_spec *__spec; \
- conv_list *__list; \
- __spec = get_current_encoding_spec(c); \
- __list = get_conversions_in_encoding_spec(__spec); \
- register_conversion(__list, f); \
- })
-
-#define register_hook_in_coder(c, t, f) \
- ({ \
- encoding_spec *__spec; \
- instr_hooks *__hooks;; \
- __spec = get_current_encoding_spec(c); \
- __hooks = get_hooks_in_encoding_spec(__spec); \
- register_hook_function(__hooks, t, f); \
- })
-
-#define add_conditional_rule_to_coder(c, e, a) \
- ({ \
- encoding_spec *__spec; \
- decoding_rules *__rules; \
- __spec = get_current_encoding_spec(c); \
- __rules = get_rules_in_encoding_spec(__spec); \
- register_conditional_rule(__rules, e, a); \
- })
-
-}
-
-%union {
-
- char *string; /* Chaîne de caractères #1 */
- const char *cstring; /* Chaîne de caractères #2 */
-
-
- int integer;
-
- conv_func *subst; /* Fonction de conversion */
- arg_list_t *args; /* Liste d'arguments */
-
- arg_expr_t *arg; /* Argument multi-usages */
- ConvUnaryOperation un_op; /* Opération unaire */
- ConvBinaryOperation bin_op; /* Opération bianire */
-
-
- cond_expr *expr; /* Expression de déclenchement */
- rule_action raction; /* Action et éléments associés */
-
-}
-
-%parse-param { rented_coder *coder }
-
-
-%token COPYRIGHT
-%token TITLE
-%token INS_NAME INS_DETAILS
-
-%token ENCODING
-%token TYPE NUMBER
-%token ENC_START ENC_END
-
-%token WORD HALF NAME SIZE BIT
-
-%token SYNTAX OPERAND_NAME OPERAND_INTERNAL OPERAND_VISIBLE
-
-%token CONV EQ OP COMMA CP NOT AND_LOG EOR COLON
-
-%token HOOKS
-
-%token RULES IF EXPR_START EQUAL BINVAL HEXVAL EXPR_END AND THEN SEE CALL CHK_CALL UNPREDICTABLE
-
-
-%type <string> COPYRIGHT INS_NAME
-%type <cstring> INS_DETAILS
-
-%type <string> TYPE
-%type <integer> NUMBER
-
-%type <string> NAME
-%type <integer> SIZE BIT
-
-%type <string> OPERAND_NAME OPERAND_INTERNAL OPERAND_VISIBLE
-
-%type <subst> substitution
-
-%type <args> arg_list
-%type <arg> arg_expr arg_composed
-%type <un_op> arg_expr_un_op
-%type <bin_op> arg_expr_bin_op
-%type <string> arg_field
-
-%type <expr> rule_cond
-%type <string> BINVAL HEXVAL
-%type <raction> action
-
-
-%%
-
-
-input : name encodings { if (!dump_all_routines_using_coder(coder)) YYABORT; }
-
-name : COPYRIGHT TITLE INS_NAME { save_notes_for_coder(coder, $1, $3, NULL); }
- | COPYRIGHT TITLE INS_NAME INS_DETAILS { save_notes_for_coder(coder, $1, $3, $4); }
-
-
-
-
-encodings : /* empty */
- | encoding encodings
-
-encoding : ENCODING TYPE NUMBER content { push_encoding_spec(coder, $2, $3); }
-
-
-content : /* empty */
- | bitfield content
- | syntax content
- | conversions content
- | hooks content
- | rules content
-
-
-bitfield : HALF bits {
- if (count_coder_bits(coder) != 16)
- {
- fprintf(stderr, "Unexpected word size: %u vs 16\n", count_coder_bits(coder));
- YYABORT;
- }
- }
- | WORD bits {
- if (count_coder_bits(coder) != 32)
- {
- fprintf(stderr, "Unexpected word size: %u vs 32\n", count_coder_bits(coder));
- YYABORT;
- }
- }
-
-bits : /* empty */
- | NAME SIZE bits { register_named_field_in_coder(coder, $1, $2); }
- | BIT bits { register_bit_in_coder(coder, $1); }
-
-
-syntax : SYNTAX operands
-
-operands : /* empty */
- | operands OPERAND_NAME { register_syntax_item_in_coder(coder, $2, SIT_KEYWORD); }
- | operands OPERAND_INTERNAL { register_syntax_item_in_coder(coder, $2, SIT_INT_OPERAND); }
- | operands OPERAND_VISIBLE { register_syntax_item_in_coder(coder, $2, SIT_EXT_OPERAND); }
-
-
-conversions : CONV substitutions
-
-substitutions : /* empty */
- | substitutions substitution { register_conversion_in_coder(coder, $2); }
-
-substitution : NAME EQ arg_expr { $$ = make_conv_from_expr($1, $3); }
- | NAME EQ NAME OP arg_list CP { $$ = make_conv_from_func($1, $3, $5); }
-
-
-arg_list : arg_expr { $$ = build_arg_list($1); }
- | arg_list COMMA arg_expr { $$ = extend_arg_list($1, $3); }
-
-arg_expr : NAME { $$ = build_arg_expr_from_name($1); }
- | NUMBER { $$ = build_arg_expr_from_number($1); }
- | BINVAL { $$ = build_arg_expr_from_binval($1); }
- | HEXVAL { $$ = build_arg_expr_from_hexval($1); }
- | arg_composed { $$ = $1; }
- | OP arg_expr CP { $$ = $2; }
- | arg_expr_un_op arg_expr { $$ = build_unary_arg_expr($2, $1); }
- | arg_expr arg_expr_bin_op arg_expr { $$ = build_binary_arg_expr($1, $3, $2); }
-
-arg_expr_un_op : NOT { $$ = CUO_NOT; }
-
-arg_expr_bin_op : AND_LOG { $$ = CBO_AND; }
- | EOR { $$ = CBO_EOR; }
-
-arg_composed : arg_field COLON arg_field { $$ = build_composed_arg_expr($1, $3); }
- | arg_composed COLON arg_field { $$ = extend_composed_arg_expr($1, $3); }
-
-arg_field : NAME { $$ = $1; }
- | BINVAL { $$ = $1; }
-
-
-hooks : HOOKS hookings
-
-hookings : /* empty */
- | hookings hooking
-
-hooking : NAME EQ NAME { register_hook_in_coder(coder, $1, $3); }
-
-
-rules : RULES rules_list
-
-rules_list : /* empty */
- | rules_list rule
-
-rule : IF EXPR_START rule_cond EXPR_END THEN action { add_conditional_rule_to_coder(coder, $3, &$6); }
- | action { add_conditional_rule_to_coder(coder, NULL, &$1); }
-
-rule_cond : NAME EQUAL BINVAL { $$ = build_simple_cond_expression($1, CCT_EQUAL, $3, true); }
- | NAME EQUAL HEXVAL { $$ = build_simple_cond_expression($1, CCT_EQUAL, $3, false); }
- | NAME AND_LOG BINVAL { $$ = build_simple_cond_expression($1, CCT_AND, $3, true); }
- | NAME AND_LOG HEXVAL { $$ = build_simple_cond_expression($1, CCT_AND, $3, false); }
- | EXPR_START rule_cond EXPR_END AND EXPR_START rule_cond EXPR_END
- { $$ = build_composed_cond_expression($2, COT_AND, $6); }
-
-action : SEE INS_DETAILS { $$.type = CAT_SEE; $$.details = make_callable($2, false); }
- | UNPREDICTABLE { $$.type = CAT_UNPREDICTABLE; }
- | CALL NAME OP arg_list CP { $$.type = CAT_CALL; $$.callee = $2; $$.args = $4; }
- | CHK_CALL NAME OP arg_list CP { $$.type = CAT_CHECKED_CALL; $$.callee = $2; $$.args = $4; }
-
-
-%%
-
-
-/******************************************************************************
-* *
-* Paramètres : coder = codeur impliqué dans le processus. *
-* msg = message d'erreur. *
-* *
-* Description : Affiche un message d'erreur suite à l'analyse en échec. *
-* *
-* Retour : 0 *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static int d2c_error(rented_coder *coder, char *msg)
-{
- printf("yyerror line %d: %s\n", d2c_get_lineno(), msg);
-
- return 0;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : argv0 = nombre du programme exécuté. *
-* *
-* Description : Affiche des indications sur l'utilisation du programme. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void show_usage(const char *argv0)
-{
- printf("\n");
-
- printf("Usage: %s [options] < file\n", argv0);
-
- printf("\n");
-
- printf("Options:\n");
-
- printf("\n");
-
- printf("\t-h | --help\t\t\tDisplay this messsage.\n");
- printf("\t-d | --dir <string>\t\tSpecify the main output directory.\n");
- printf("\t-a | --arch <string>\t\tDefine the archicture to handle.\n");
- printf("\t-H | --header <string>\t\tSet the base of the #ifndef / #define game.\n");
- printf("\t-e | --encoding <string>\tDefine encoding prefixes for files.\n");
- printf("\t-m | --macro <string>\t\tRegister some conversion functions.\n");
-
- printf("\n");
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : argc = nombre d'arguments dans la ligne de commande. *
-* argv = arguments de la ligne de commande. *
-* *
-* Description : Point d'entrée du programme. *
-* *
-* Retour : EXIT_SUCCESS si le prgm s'est déroulé sans encombres. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-int main(int argc, char **argv)
-{
- int result; /* Bilan à retourner */
- rented_coder *coder; /* Codeur à briffer & employer */
- int index; /* Indice de fichier à traiter */
- bool need_help; /* Affichage de l'aide ? */
- bool has_error; /* Erreur dans la ligne de cmd.*/
- int ret; /* Bilan d'une lecture d'arg. */
- char *sep; /* Caratère '=' en coupure */
-
- static struct option long_options[] = {
-
- { "help", no_argument, NULL, 'h' },
- { "input", required_argument, NULL, 'i' },
- { "dir", required_argument, NULL, 'd' },
- { "arch", required_argument, NULL, 'a' },
- { "header", required_argument, NULL, 'H' },
- { "encoding", required_argument, NULL, 'e' },
- { "macro", required_argument, NULL, 'M' },
- { NULL, 0, NULL, 0 }
-
- };
-
- result = EXIT_SUCCESS;
-
- coder = create_coder();
-
- index = 0;
-
- need_help = false;
- has_error = false;
-
- while (!has_error)
- {
- ret = getopt_long(argc, argv, "hi:d:a:H:e:M:", long_options, &index);
- if (ret == -1) break;
-
- switch (ret)
- {
- case 'h':
- need_help = true;
- break;
-
- case 'i':
- set_coder_input_file(coder, optarg);
- break;
-
- case 'd':
- set_coder_output_directory(coder, optarg);
- break;
-
- case 'a':
- set_coder_arch(coder, optarg);
- break;
-
- case 'H':
- set_coder_header_base(coder, optarg);
- break;
-
- case 'e':
-
- sep = strchr(optarg, '=');
- has_error = (sep == NULL);
-
- if (!has_error)
- {
- *sep = '\0';
- register_encoding(get_coder_pre_proc(coder), optarg, sep + 1);
- }
-
- break;
-
- case 'M':
-
- sep = strchr(optarg, '=');
- has_error = (sep == NULL);
-
- if (!has_error)
- {
- *sep = '\0';
- define_macro(get_coder_pre_proc(coder), optarg, sep + 1);
- }
-
- break;
-
- }
-
- }
-
- if (need_help || has_error || !do_basic_checks_with_coder(coder) || optind != argc)
- {
- show_usage(argv[0]);
- result = (need_help ? EXIT_SUCCESS : EXIT_FAILURE);
- goto exit;
- }
-
- result = yyparse(coder);
-
- exit:
-
- free_flex_memory();
-
- delete_coder(coder);
-
- return result;
-
-}