view sexpr.y @ 812:59a473863eaa

cmake: add a way to force 64-bit build This is useful on OSes that support 64-bit binaries but default to 32-bit. To force 64-bits, pass FORCE_64_BIT_BUILD to cmake. E.g., $ cmake . -DFORCE_64_BIT_BUILD=1 Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Sat, 18 Jul 2020 10:16:00 -0400
parents c77da29aa2a6
children f9a9816e0142
line wrap: on
line source

/*
 * Copyright (c) 2015-2017 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

%pure-parser
%lex-param {void *scanner}
%parse-param {struct sexpr_parser_state *data}

%{
#include <jeffpc/error.h>

#include "sexpr_impl.h"

#define scanner data->scanner

#define YYERROR_VERBOSE

extern int sexpr_reader_lex(void *, void *);

void yyerror(void *scan, const char *e)
{
	cmn_err(CE_ERROR, "sexpr: %s", e);
}

void sexpr_error2(const char *e, const char *yytext)
{
	cmn_err(CE_ERROR, "sexpr: %s (%s)", e, yytext);
}

%}

%union {
	struct str *s;
	uint64_t i;
	bool b;
	struct val *lv;
};

%token <s> SYMBOL STRING
%token <i> NUMBER CHAR
%token <b> BOOL
%token VNULL	/* can't be called NULL because of stdlib collision */
%token ERROR

%type <lv> document tok list toklist

%%
document : tok			{ data->output = $1; }
	 ;

tok : SYMBOL			{ $$ = VAL_DUP_SYM(str_cstr($1)); str_putref($1); }
    | STRING			{ $$ = str_cast_to_val($1); }
    | NUMBER			{ $$ = VAL_ALLOC_INT($1); }
    | BOOL			{ $$ = VAL_ALLOC_BOOL($1); }
    | CHAR			{ $$ = VAL_ALLOC_CHAR($1); }
    | VNULL			{ $$ = VAL_ALLOC_NULL(); }
    | list			{ $$ = $1; }
    | '\'' tok			{ $$ = VAL_ALLOC_CONS(
                                         sym_cast_to_val(STATIC_SYM("quote")),
				         VAL_ALLOC_CONS($2, val_empty_cons())); }
    ;

/*
 * We are not left-recursive because we want to make cons cells right
 * recursively.
 */
toklist : tok toklist		{ $$ = VAL_ALLOC_CONS($1, $2); }
	| tok			{ $$ = VAL_ALLOC_CONS($1, val_empty_cons()); }
	;

list : '(' ')'			{ $$ = val_empty_cons(); }
     | '(' toklist ')'		{ $$ = $2; }
     | '(' tok '.' tok ')'	{ $$ = VAL_ALLOC_CONS($2, $4); }
     ;

%%