diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2018-04-02 11:58:42 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2018-04-02 12:39:30 (GMT) |
commit | 1db4ef323b7a76093356ae76268132f3760e1631 (patch) | |
tree | fec36ee0ec1b6b2010b62ca4177edca0e31e2114 /tools/d2c/assert/grammar.y | |
parent | 1bc80837dde03a32b5ab185067f7bd4c499a9850 (diff) |
Rewritten the whole instruction definition format.
Diffstat (limited to 'tools/d2c/assert/grammar.y')
-rw-r--r-- | tools/d2c/assert/grammar.y | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/tools/d2c/assert/grammar.y b/tools/d2c/assert/grammar.y new file mode 100644 index 0000000..3db47e6 --- /dev/null +++ b/tools/d2c/assert/grammar.y @@ -0,0 +1,133 @@ + +%{ + +#include "tokens.h" + + +/* Affiche un message d'erreur suite à l'analyse en échec. */ +static int yyerror(disass_assert *, char *); + +%} + + +%code requires { + +#include "decl.h" + +} + + +%union { + + char *string; /* Chaîne de caractères */ + + struct + { + char *field; /* Nom de champ de bits */ + DisassCondOp op; /* Opération impliquée */ + char *value; /* Valeur soumise à condition */ + + } cond_info; + +} + + +%define api.pure full + +%parse-param { disass_assert *dassert } + +%code provides { + +#define YY_DECL \ + int assert_lex(YYSTYPE *yylvalp) + +YY_DECL; + +} + + +%token CR +%token EQ NE +%token AND OR +%token FIELD VALUE + +%type <cond_info> condition +%type <string> FIELD +%type <string> VALUE + + +%% + + +assert : /* empty */ + | conditions assert + +conditions : condition { register_disass_assert(dassert, DCG_UNIQ, $1.field, $1.op, $1.value); } + | condition AND and_conds { extend_disass_assert(dassert, $1.field, $1.op, $1.value); } + | condition OR or_conds { extend_disass_assert(dassert, $1.field, $1.op, $1.value); } + +and_conds : condition { register_disass_assert(dassert, DCG_AND, $1.field, $1.op, $1.value); } + | condition AND and_conds { extend_disass_assert(dassert, $1.field, $1.op, $1.value); } + +or_conds : condition { register_disass_assert(dassert, DCG_OR, $1.field, $1.op, $1.value); } + | condition AND or_conds { extend_disass_assert(dassert, $1.field, $1.op, $1.value); } + +condition : FIELD EQ VALUE { $$.field = $1; $$.op = DCO_EQ; $$.value = $3; } + | FIELD NE VALUE { $$.field = $1; $$.op = DCO_NE; $$.value = $3; } + + +%% + + +/****************************************************************************** +* * +* Paramètres : dassert = structure impliquée dans le processus. * +* msg = message d'erreur. * +* * +* Description : Affiche un message d'erreur suite à l'analyse en échec. * +* * +* Retour : 0 * +* * +* Remarques : - * +* * +******************************************************************************/ + +static int yyerror(disass_assert *dassert, char *msg) +{ + printf("assert yyerror line %d: %s\n", yyget_lineno(), msg); + + return 0; + +} + + +/****************************************************************************** +* * +* Paramètres : dassert = structure à constituer à partir de données lues. * +* raw = données brutes à analyser. * +* * +* Description : Interprête des données relatives à une série de conditions. * +* * +* Retour : true si l'opération s'est bien déroulée, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool load_assertions_from_raw_block(disass_assert *dassert, const char *raw) +{ + bool result; /* Bilan à faire remonter */ + YY_BUFFER_STATE state; /* Support d'analyse */ + int status; /* Bilan de l'analyse */ + + state = yy_scan_string(raw); + + status = yyparse(dassert); + + result = (status == 0); + + yy_delete_buffer(state); + + return result; + +} |