precompute lemon artifacts

This commit is contained in:
John Kerl 2021-11-16 22:05:06 -05:00
parent 1192f8de21
commit dbff6b4cb3
6 changed files with 13107 additions and 68 deletions

View file

@ -1,71 +1,11 @@
AM_CPPFLAGS= -I${srcdir}
AM_CFLAGS= -std=gnu99
noinst_PROGRAMS= lemon
lemon_SOURCES= lemon_action.c \
lemon_action.h \
lemon_assert.c \
lemon_assert.h \
lemon_config_list.c \
lemon_config_list.h \
lemon_dims.h \
lemon_error.c \
lemon_error.h \
lemon_fsm.c \
lemon_fsm.h \
lemon_main.c \
lemon_memory.c \
lemon_memory.h \
lemon_msort.c \
lemon_msort.h \
lemon_option.c \
lemon_option.h \
lemon_parse.c \
lemon_parse.h \
lemon_plink.c \
lemon_plink.h \
lemon_report.c \
lemon_report.h \
lemon_set.c \
lemon_set.h \
lemon_state_table.c \
lemon_state_table.h \
lemon_string.c \
lemon_string.h \
lemon_structs.h \
lemon_symbol.c \
lemon_symbol.h
noinst_LTLIBRARIES= libdsl.la
# if we don't want to distribute the generated sources, move them to a nodist_libfoo_la_SOURCES variable
libdsl_la_SOURCES= mlr_dsl_lexer.c mlr_dsl_lexer.h mlr_dsl_parse.c mlr_dsl_parse.h mlr_dsl_wrapper.c mlr_dsl_wrapper.h
CLEANFILES= mlr_dsl_lexer.c mlr_dsl_lexer.h mlr_dsl_parse.c mlr_dsl_parse.h mlr_dsl_parse.out
EXTRA_DIST= lempar.c mlr_dsl_lexer.l mlr_dsl_parse.y
libdsl_la_SOURCES= mlr_dsl_lexer.c \
mlr_dsl_lexer.h \
mlr_dsl_parse.c \
mlr_dsl_parse.h \
mlr_dsl_wrapper.c \
mlr_dsl_wrapper.h
mlr_dsl_wrapper.c: mlr_dsl_lexer.h
mlr_dsl_parse.h: mlr_dsl_parse.c
mlr_dsl_parse.c: mlr_dsl_parse.y lempar.c lemon${EXEEXT}
./lemon -s mlr_dsl_parse.y
# lemon does not re-generate the file if it exists and is the same
# this causes problems with the dependency above
touch mlr_dsl_parse.h
mv mlr_dsl_parse.c mlr_dsl_parse.c.tmp
sed \
-e 's/ParseTrace/mlr_dsl_ParseTrace/g' \
-e 's/ParseTokenName/mlr_dsl_ParseTokenName/g' \
-e 's/lemon_parser_alloc/mlr_dsl_lemon_parser_alloc/g' \
-e 's/lemon_parser_free/mlr_dsl_lemon_parser_free/g' \
-e 's/lemon_parser_parse_token/mlr_dsl_lemon_parser_parse_token/g' \
-e 's/yy_destructor/mlr_dsl_yy_destructor/g' \
mlr_dsl_parse.c.tmp > mlr_dsl_parse.c
rm -f mlr_dsl_parse.c.tmp
mlr_dsl_lexer.h: mlr_dsl_lexer.c
mlr_dsl_lexer.c: mlr_dsl_lexer.l mlr_dsl_parse.h
flex --prefix=mlr_dsl_lexer_ --outfile=mlr_dsl_lexer.c --header-file=mlr_dsl_lexer.h ${srcdir}/mlr_dsl_lexer.l
distclean-local:
if [ "${srcdir}" != "." ]; then \
rm -f lempar.c mlr_dsl_parse.y; \
fi

View file

@ -172,8 +172,6 @@ lemon: \
# ----------------------------------------------------------------
clean:
rm -f *.o
rm -f mlr_dsl_parse.c mlr_dsl_parse.h mlr_dsl_parse.out
rm -f mlr_dsl_lexer.c mlr_dsl_lexer.h
rm -f ex0_parse.c ex0_parse.h ex0_parse.out
rm -f ex0_lexer.c ex0_lexer.h
rm -f ex0

3182
c/parsing/mlr_dsl_lexer.c Normal file

File diff suppressed because it is too large Load diff

334
c/parsing/mlr_dsl_lexer.h Normal file
View file

@ -0,0 +1,334 @@
#ifndef mlr_dsl_lexer_HEADER_H
#define mlr_dsl_lexer_HEADER_H 1
#define mlr_dsl_lexer_IN_HEADER 1
#line 6 "mlr_dsl_lexer.h"
#line 8 "mlr_dsl_lexer.h"
#define YY_INT_ALIGNED short int
/* A lexical scanner generated by flex */
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
#define YY_FLEX_SUBMINOR_VERSION 35
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif
/* First, we deal with platform-specific or compiler-specific issues. */
/* begin standard C headers. */
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
/* end standard C headers. */
/* flex integer type definitions */
#ifndef FLEXINT_H
#define FLEXINT_H
/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
* if you want the limit (max/min) macros for int types.
*/
#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS 1
#endif
#include <inttypes.h>
typedef int8_t flex_int8_t;
typedef uint8_t flex_uint8_t;
typedef int16_t flex_int16_t;
typedef uint16_t flex_uint16_t;
typedef int32_t flex_int32_t;
typedef uint32_t flex_uint32_t;
typedef uint64_t flex_uint64_t;
#else
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
typedef int flex_int32_t;
typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
#endif /* ! C99 */
/* Limits of integral types. */
#ifndef INT8_MIN
#define INT8_MIN (-128)
#endif
#ifndef INT16_MIN
#define INT16_MIN (-32767-1)
#endif
#ifndef INT32_MIN
#define INT32_MIN (-2147483647-1)
#endif
#ifndef INT8_MAX
#define INT8_MAX (127)
#endif
#ifndef INT16_MAX
#define INT16_MAX (32767)
#endif
#ifndef INT32_MAX
#define INT32_MAX (2147483647)
#endif
#ifndef UINT8_MAX
#define UINT8_MAX (255U)
#endif
#ifndef UINT16_MAX
#define UINT16_MAX (65535U)
#endif
#ifndef UINT32_MAX
#define UINT32_MAX (4294967295U)
#endif
#endif /* ! FLEXINT_H */
#ifdef __cplusplus
/* The "const" storage-class-modifier is valid. */
#define YY_USE_CONST
#else /* ! __cplusplus */
/* C99 requires __STDC__ to be defined as 1. */
#if defined (__STDC__)
#define YY_USE_CONST
#endif /* defined (__STDC__) */
#endif /* ! __cplusplus */
#ifdef YY_USE_CONST
#define yyconst const
#else
#define yyconst
#endif
/* An opaque pointer. */
#ifndef YY_TYPEDEF_YY_SCANNER_T
#define YY_TYPEDEF_YY_SCANNER_T
typedef void* yyscan_t;
#endif
/* For convenience, these vars (plus the bison vars far below)
are macros in the reentrant scanner. */
#define yyin yyg->yyin_r
#define yyout yyg->yyout_r
#define yyextra yyg->yyextra_r
#define yyleng yyg->yyleng_r
#define yytext yyg->yytext_r
#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
#define yy_flex_debug yyg->yy_flex_debug_r
/* Size of default input buffer. */
#ifndef YY_BUF_SIZE
#define YY_BUF_SIZE 16384
#endif
#ifndef YY_TYPEDEF_YY_BUFFER_STATE
#define YY_TYPEDEF_YY_BUFFER_STATE
typedef struct yy_buffer_state *YY_BUFFER_STATE;
#endif
#ifndef YY_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
typedef size_t yy_size_t;
#endif
#ifndef YY_STRUCT_YY_BUFFER_STATE
#define YY_STRUCT_YY_BUFFER_STATE
struct yy_buffer_state
{
FILE *yy_input_file;
char *yy_ch_buf; /* input buffer */
char *yy_buf_pos; /* current position in input buffer */
/* Size of input buffer in bytes, not including room for EOB
* characters.
*/
yy_size_t yy_buf_size;
/* Number of characters read into yy_ch_buf, not including EOB
* characters.
*/
yy_size_t yy_n_chars;
/* Whether we "own" the buffer - i.e., we know we created it,
* and can realloc() it to grow it, and should free() it to
* delete it.
*/
int yy_is_our_buffer;
/* Whether this is an "interactive" input source; if so, and
* if we're using stdio for input, then we want to use getc()
* instead of fread(), to make sure we stop fetching input after
* each newline.
*/
int yy_is_interactive;
/* Whether we're considered to be at the beginning of a line.
* If so, '^' rules will be active on the next match, otherwise
* not.
*/
int yy_at_bol;
int yy_bs_lineno; /**< The line count. */
int yy_bs_column; /**< The column count. */
/* Whether to try to fill the input buffer when we reach the
* end of it.
*/
int yy_fill_buffer;
int yy_buffer_status;
};
#endif /* !YY_STRUCT_YY_BUFFER_STATE */
void mlr_dsl_lexer_restart (FILE *input_file ,yyscan_t yyscanner );
void mlr_dsl_lexer__switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
YY_BUFFER_STATE mlr_dsl_lexer__create_buffer (FILE *file,int size ,yyscan_t yyscanner );
void mlr_dsl_lexer__delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
void mlr_dsl_lexer__flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
void mlr_dsl_lexer_push_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
void mlr_dsl_lexer_pop_buffer_state (yyscan_t yyscanner );
YY_BUFFER_STATE mlr_dsl_lexer__scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
YY_BUFFER_STATE mlr_dsl_lexer__scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
YY_BUFFER_STATE mlr_dsl_lexer__scan_bytes (yyconst char *bytes,yy_size_t len ,yyscan_t yyscanner );
void *mlr_dsl_lexer_alloc (yy_size_t ,yyscan_t yyscanner );
void *mlr_dsl_lexer_realloc (void *,yy_size_t ,yyscan_t yyscanner );
void mlr_dsl_lexer_free (void * ,yyscan_t yyscanner );
/* Begin user sect3 */
#define mlr_dsl_lexer_wrap(n) 1
#define YY_SKIP_YYWRAP
#define yytext_ptr yytext_r
#ifdef YY_HEADER_EXPORT_START_CONDITIONS
#define INITIAL 0
#endif
#ifndef YY_NO_UNISTD_H
/* Special case for "unistd.h", since it is non-ANSI. We include it way
* down here because we want the user's section 1 to have been scanned first.
* The user has a chance to override it with an option.
*/
#include <unistd.h>
#endif
#define YY_EXTRA_TYPE struct _mlr_dsl_ast_node_t **
int mlr_dsl_lexer_lex_init (yyscan_t* scanner);
int mlr_dsl_lexer_lex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);
/* Accessor methods to globals.
These are made visible to non-reentrant scanners for convenience. */
int mlr_dsl_lexer_lex_destroy (yyscan_t yyscanner );
int mlr_dsl_lexer_get_debug (yyscan_t yyscanner );
void mlr_dsl_lexer_set_debug (int debug_flag ,yyscan_t yyscanner );
YY_EXTRA_TYPE mlr_dsl_lexer_get_extra (yyscan_t yyscanner );
void mlr_dsl_lexer_set_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );
FILE *mlr_dsl_lexer_get_in (yyscan_t yyscanner );
void mlr_dsl_lexer_set_in (FILE * in_str ,yyscan_t yyscanner );
FILE *mlr_dsl_lexer_get_out (yyscan_t yyscanner );
void mlr_dsl_lexer_set_out (FILE * out_str ,yyscan_t yyscanner );
yy_size_t mlr_dsl_lexer_get_leng (yyscan_t yyscanner );
char *mlr_dsl_lexer_get_text (yyscan_t yyscanner );
int mlr_dsl_lexer_get_lineno (yyscan_t yyscanner );
void mlr_dsl_lexer_set_lineno (int line_number ,yyscan_t yyscanner );
/* Macros after this point can all be overridden by user definitions in
* section 1.
*/
#ifndef YY_SKIP_YYWRAP
#ifdef __cplusplus
extern "C" int mlr_dsl_lexer_wrap (yyscan_t yyscanner );
#else
extern int mlr_dsl_lexer_wrap (yyscan_t yyscanner );
#endif
#endif
#ifndef yytext_ptr
static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
#endif
#ifdef YY_NEED_STRLEN
static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner);
#endif
#ifndef YY_NO_INPUT
#endif
/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
#define YY_READ_BUF_SIZE 8192
#endif
/* Number of entries by which start-condition stack grows. */
#ifndef YY_START_STACK_INCR
#define YY_START_STACK_INCR 25
#endif
/* Default declaration of generated scanner - a define so the user can
* easily add parameters.
*/
#ifndef YY_DECL
#define YY_DECL_IS_OURS 1
extern int mlr_dsl_lexer_lex (yyscan_t yyscanner);
#define YY_DECL int mlr_dsl_lexer_lex (yyscan_t yyscanner)
#endif /* !YY_DECL */
/* yy_get_previous_state - get the state just before the EOB char was reached */
#undef YY_NEW_FILE
#undef YY_FLUSH_BUFFER
#undef yy_set_bol
#undef yy_new_buffer
#undef yy_set_interactive
#undef YY_DO_BEFORE_ACTION
#ifdef YY_DECL_IS_OURS
#undef YY_DECL_IS_OURS
#undef YY_DECL
#endif
#line 592 "mlr_dsl_lexer.l"
#line 333 "mlr_dsl_lexer.h"
#undef mlr_dsl_lexer_IN_HEADER
#endif /* mlr_dsl_lexer_HEADER_H */

9462
c/parsing/mlr_dsl_parse.c Normal file

File diff suppressed because it is too large Load diff

123
c/parsing/mlr_dsl_parse.h Normal file
View file

@ -0,0 +1,123 @@
#ifndef MLR_DSL_PARSE_H
#define MLR_DSL_PARSE_H
#define MD_TOKEN_SEMICOLON 1
#define MD_TOKEN_RETURN 2
#define MD_TOKEN_FULL_SREC 3
#define MD_TOKEN_FULL_OOSVAR 4
#define MD_TOKEN_SUBR_CALL 5
#define MD_TOKEN_BREAK 6
#define MD_TOKEN_CONTINUE 7
#define MD_TOKEN_FUNC_DEF 8
#define MD_TOKEN_NON_SIGIL_NAME 9
#define MD_TOKEN_LPAREN 10
#define MD_TOKEN_RPAREN 11
#define MD_TOKEN_LBRACE 12
#define MD_TOKEN_RBRACE 13
#define MD_TOKEN_COLON 14
#define MD_TOKEN_SUBR_DEF 15
#define MD_TOKEN_COMMA 16
#define MD_TOKEN_VAR 17
#define MD_TOKEN_NUMERIC 18
#define MD_TOKEN_INT 19
#define MD_TOKEN_FLOAT 20
#define MD_TOKEN_STRING 21
#define MD_TOKEN_BOOLEAN 22
#define MD_TOKEN_MAP 23
#define MD_TOKEN_BEGIN 24
#define MD_TOKEN_END 25
#define MD_TOKEN_WHILE 26
#define MD_TOKEN_DO 27
#define MD_TOKEN_FOR 28
#define MD_TOKEN_IN 29
#define MD_TOKEN_IF 30
#define MD_TOKEN_ELIF 31
#define MD_TOKEN_ELSE 32
#define MD_TOKEN_FILTER 33
#define MD_TOKEN_ASSIGN 34
#define MD_TOKEN_DOLLAR_SIGN 35
#define MD_TOKEN_LEFT_BRACKET 36
#define MD_TOKEN_RIGHT_BRACKET 37
#define MD_TOKEN_LOGICAL_OR_EQUALS 38
#define MD_TOKEN_LOGICAL_XOR_EQUALS 39
#define MD_TOKEN_LOGICAL_AND_EQUALS 40
#define MD_TOKEN_BITWISE_OR_EQUALS 41
#define MD_TOKEN_BITWISE_XOR_EQUALS 42
#define MD_TOKEN_BITWISE_AND_EQUALS 43
#define MD_TOKEN_BITWISE_LSH_EQUALS 44
#define MD_TOKEN_BITWISE_RSH_EQUALS 45
#define MD_TOKEN_PLUS_EQUALS 46
#define MD_TOKEN_MINUS_EQUALS 47
#define MD_TOKEN_DOT_EQUALS 48
#define MD_TOKEN_TIMES_EQUALS 49
#define MD_TOKEN_DIVIDE_EQUALS 50
#define MD_TOKEN_INT_DIVIDE_EQUALS 51
#define MD_TOKEN_OPLUS_EQUALS 52
#define MD_TOKEN_OMINUS_EQUALS 53
#define MD_TOKEN_OTIMES_EQUALS 54
#define MD_TOKEN_ODIVIDE_EQUALS 55
#define MD_TOKEN_INT_ODIVIDE_EQUALS 56
#define MD_TOKEN_MOD_EQUALS 57
#define MD_TOKEN_POW_EQUALS 58
#define MD_TOKEN_OINT_DIVIDE_EQUALS 59
#define MD_TOKEN_OMOD_EQUALS 60
#define MD_TOKEN_OPOW_EQUALS 61
#define MD_TOKEN_UNSET 62
#define MD_TOKEN_ALL 63
#define MD_TOKEN_TEE 64
#define MD_TOKEN_GT 65
#define MD_TOKEN_BITWISE_RSH 66
#define MD_TOKEN_BITWISE_OR 67
#define MD_TOKEN_EMITF 68
#define MD_TOKEN_EMITP 69
#define MD_TOKEN_EMIT 70
#define MD_TOKEN_DUMP 71
#define MD_TOKEN_EDUMP 72
#define MD_TOKEN_PRINT 73
#define MD_TOKEN_EPRINT 74
#define MD_TOKEN_PRINTN 75
#define MD_TOKEN_EPRINTN 76
#define MD_TOKEN_STDOUT 77
#define MD_TOKEN_STDERR 78
#define MD_TOKEN_QUESTION_MARK 79
#define MD_TOKEN_LOGICAL_OR 80
#define MD_TOKEN_LOGICAL_XOR 81
#define MD_TOKEN_LOGICAL_AND 82
#define MD_TOKEN_MATCHES 83
#define MD_TOKEN_DOES_NOT_MATCH 84
#define MD_TOKEN_EQ 85
#define MD_TOKEN_NE 86
#define MD_TOKEN_GE 87
#define MD_TOKEN_LT 88
#define MD_TOKEN_LE 89
#define MD_TOKEN_BITWISE_XOR 90
#define MD_TOKEN_BITWISE_AND 91
#define MD_TOKEN_BITWISE_LSH 92
#define MD_TOKEN_PLUS 93
#define MD_TOKEN_MINUS 94
#define MD_TOKEN_OPLUS 95
#define MD_TOKEN_OMINUS 96
#define MD_TOKEN_DOT 97
#define MD_TOKEN_TIMES 98
#define MD_TOKEN_DIVIDE 99
#define MD_TOKEN_INT_DIVIDE 100
#define MD_TOKEN_MOD 101
#define MD_TOKEN_OTIMES 102
#define MD_TOKEN_ODIVIDE 103
#define MD_TOKEN_INT_ODIVIDE 104
#define MD_TOKEN_LOGICAL_NOT 105
#define MD_TOKEN_BITWISE_NOT 106
#define MD_TOKEN_POW 107
#define MD_TOKEN_FIELD_NAME 108
#define MD_TOKEN_BRACED_FIELD_NAME 109
#define MD_TOKEN_UNBRACED_OOSVAR_NAME 110
#define MD_TOKEN_BRACED_OOSVAR_NAME 111
#define MD_TOKEN_AT_SIGN 112
#define MD_TOKEN_NUMBER 113
#define MD_TOKEN_TRUE 114
#define MD_TOKEN_FALSE 115
#define MD_TOKEN_REGEXI 116
#define MD_TOKEN_CONTEXT_VARIABLE 117
#define MD_TOKEN_ENV 118
#endif // MLR_DSL_PARSE_H