Alien-LibJIT
view release on metacpan or search on metacpan
libjit/tools/gen-rules-parser.y view on Meta::CPAN
%{
/*
* gen-rules-parser.y - Bison grammar for the "gen-rules" program.
*
* Copyright (C) 2004, 2006-2007 Southern Storm Software, Pty Ltd.
*
* This file is part of the libjit library.
*
* The libjit library is free software: you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 2.1 of
* the License, or (at your option) any later version.
*
* The libjit library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with the libjit library. If not, see
* <http://www.gnu.org/licenses/>.
*/
#include <config.h>
#include <ctype.h>
#include <stdio.h>
#ifdef HAVE_STDLIB_H
# include <stdlib.h>
#endif
#ifdef HAVE_STRING_H
# include <string.h>
#elif defined(HAVE_STRINGS_H)
# include <strings.h>
#endif
/*
* Imports from the lexical analyser.
*/
extern int yylex(void);
extern void yyrestart(FILE *file);
#ifdef YYTEXT_POINTER
extern char *yytext;
#else
extern char yytext[];
#endif
/*
* Current file and line number.
*/
extern char *gensel_filename;
extern long gensel_linenum;
/*
* Report error message.
*/
static void
gensel_error_message(char *filename, long linenum, char *msg)
{
fprintf(stderr, "%s(%ld): %s\n", filename, linenum, msg);
}
/*
* Report error message and exit.
*/
static void
gensel_error(char *filename, long linenum, char *msg)
{
gensel_error_message(filename, linenum, msg);
exit(1);
}
/*
* Report error messages from the parser.
*/
static void
yyerror(char *msg)
{
gensel_error_message(gensel_filename, gensel_linenum, msg);
}
/*
* Instruction type for the "inst" variable.
*/
static char *gensel_inst_type = "unsigned char *";
static int gensel_new_inst_type = 0;
/*
* Amount of space to reserve for the primary instruction output.
*/
static int gensel_reserve_space = 32;
static int gensel_reserve_more_space = 128;
/*
* Maximal number of input values in a pattern.
*/
#define MAX_INPUT 3
/*
* Maximal number of scratch registers in a pattern.
*/
#define MAX_SCRATCH 6
/*
* Maximal number of pattern elements.
*/
#define MAX_PATTERN (MAX_INPUT + MAX_SCRATCH)
/*
* Rule Options.
*/
#define GENSEL_OPT_TERNARY 1
#define GENSEL_OPT_BRANCH 2
#define GENSEL_OPT_NOTE 3
#define GENSEL_OPT_COPY 4
#define GENSEL_OPT_COMMUTATIVE 5
#define GENSEL_OPT_STACK 6
#define GENSEL_OPT_X87_ARITH 7
#define GENSEL_OPT_X87_ARITH_REVERSIBLE 8
libjit/tools/gen-rules-parser.y view on Meta::CPAN
| K_IMMS32 { $$ = GENSEL_PATT_IMMS32; }
| K_IMMU32 { $$ = GENSEL_PATT_IMMU32; }
| K_LOCAL { $$ = GENSEL_PATT_LOCAL; }
| K_FRAME { $$ = GENSEL_PATT_FRAME; }
| K_ANY { $$ = GENSEL_PATT_ANY; }
;
DestFlag
: /* empty */ { $$ = 0; }
| '=' { $$ = 1; }
;
RegFlag
: /* empty */ { $$ = 0; }
| '*' { $$ = GENSEL_VALUE_CLOBBER; }
| '+' { $$ = GENSEL_VALUE_EARLY_CLOBBER; }
;
Literal
: LITERAL { $$ = $1; }
| Literal LITERAL {
char *cp = malloc(strlen($1) + strlen($2) + 1);
if(!cp)
{
exit(1);
}
strcpy(cp, $1);
strcat(cp, $2);
free($1);
free($2);
$$ = cp;
}
;
%%
#define COPYRIGHT_MSG \
" * Copyright (C) 2004, 2006-2007 Southern Storm Software, Pty Ltd.\n" \
" *\n" \
" * This file is part of the libjit library.\n" \
" *\n" \
" * The libjit library is free software: you can redistribute it and/or\n" \
" * modify it under the terms of the GNU Lesser General Public License\n" \
" * as published by the Free Software Foundation, either version 2.1 of\n" \
" * the License, or (at your option) any later version.\n" \
" *\n" \
" * The libjit library is distributed in the hope that it will be useful,\n" \
" * but WITHOUT ANY WARRANTY; without even the implied warranty of\n" \
" * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" \
" * Lesser General Public License for more details.\n" \
" *\n" \
" * You should have received a copy of the GNU Lesser General Public\n" \
" * License along with the libjit library. If not, see\n" \
" * <http://www.gnu.org/licenses/>.\n"
int main(int argc, char *argv[])
{
FILE *file;
if(argc != 2)
{
fprintf(stderr, "Usage: %s input.sel >output.slc\n", argv[0]);
return 1;
}
file = fopen(argv[1], "r");
if(!file)
{
perror(argv[1]);
return 1;
}
printf("/%c Automatically generated from %s - DO NOT EDIT %c/\n",
'*', argv[1], '*');
printf("/%c\n%s%c/\n\n", '*', COPYRIGHT_MSG, '*');
printf("#if defined(JIT_INCLUDE_RULES)\n\n");
gensel_filename = argv[1];
gensel_linenum = 1;
yyrestart(file);
if(yyparse())
{
fclose(file);
return 1;
}
fclose(file);
printf("#elif defined(JIT_INCLUDE_SUPPORTED)\n\n");
gensel_output_supported();
printf("#endif\n");
return 0;
}
( run in 0.983 second using v1.01-cache-2.11-cpan-f5b5a18a01a )