sel-gram.y revision 226031
1169691Skan/* 2169691Skan * Copyright (c) 2008 Kungliga Tekniska H��gskolan 3169691Skan * (Royal Institute of Technology, Stockholm, Sweden). 4169691Skan * All rights reserved. 5169691Skan * 6169691Skan * Redistribution and use in source and binary forms, with or without 7169691Skan * modification, are permitted provided that the following conditions 8169691Skan * are met: 9169691Skan * 10169691Skan * 1. Redistributions of source code must retain the above copyright 11169691Skan * notice, this list of conditions and the following disclaimer. 12169691Skan * 13169691Skan * 2. Redistributions in binary form must reproduce the above copyright 14169691Skan * notice, this list of conditions and the following disclaimer in the 15169691Skan * documentation and/or other materials provided with the distribution. 16169691Skan * 17169691Skan * 3. Neither the name of the Institute nor the names of its contributors 18169691Skan * may be used to endorse or promote products derived from this software 19169691Skan * without specific prior written permission. 20169691Skan * 21169691Skan * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22169691Skan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23169691Skan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24169691Skan * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25169691Skan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26169691Skan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27169691Skan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28169691Skan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29169691Skan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30169691Skan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31169691Skan * SUCH DAMAGE. 32169691Skan */ 33169691Skan 34169691Skan%{ 35169691Skan#ifdef HAVE_CONFIG_H 36169691Skan#include <config.h> 37169691Skan#endif 38169691Skan#include <stdio.h> 39169691Skan#include <stdlib.h> 40169691Skan#include <hx_locl.h> 41169691Skan 42169691Skan 43169691Skan%} 44169691Skan 45169691Skan%union { 46169691Skan char *string; 47169691Skan struct hx_expr *expr; 48169691Skan} 49169691Skan 50169691Skan%token kw_TRUE 51169691Skan%token kw_FALSE 52169691Skan%token kw_AND 53169691Skan%token kw_OR 54169691Skan%token kw_IN 55169691Skan%token kw_TAILMATCH 56169691Skan 57169691Skan%type <expr> expr 58169691Skan%type <expr> comp 59169691Skan%type <expr> word words 60169691Skan%type <expr> number 61169691Skan%type <expr> string 62169691Skan%type <expr> function 63169691Skan%type <expr> variable variables 64169691Skan 65169691Skan%token <string> NUMBER 66169691Skan%token <string> STRING 67169691Skan%token <string> IDENTIFIER 68169691Skan 69169691Skan%start start 70169691Skan 71169691Skan%% 72169691Skan 73169691Skanstart: expr { _hx509_expr_input.expr = $1; } 74169691Skan 75169691Skanexpr : kw_TRUE { $$ = _hx509_make_expr(op_TRUE, NULL, NULL); } 76169691Skan | kw_FALSE { $$ = _hx509_make_expr(op_FALSE, NULL, NULL); } 77169691Skan | '!' expr { $$ = _hx509_make_expr(op_NOT, $2, NULL); } 78169691Skan | expr kw_AND expr { $$ = _hx509_make_expr(op_AND, $1, $3); } 79169691Skan | expr kw_OR expr { $$ = _hx509_make_expr(op_OR, $1, $3); } 80169691Skan | '(' expr ')' { $$ = $2; } 81169691Skan | comp { $$ = _hx509_make_expr(op_COMP, $1, NULL); } 82169691Skan ; 83169691Skan 84169691Skanwords : word { $$ = _hx509_make_expr(expr_WORDS, $1, NULL); } 85169691Skan | word ',' words { $$ = _hx509_make_expr(expr_WORDS, $1, $3); } 86169691Skan ; 87169691Skan 88169691Skancomp : word '=' '=' word { $$ = _hx509_make_expr(comp_EQ, $1, $4); } 89169691Skan | word '!' '=' word { $$ = _hx509_make_expr(comp_NE, $1, $4); } 90169691Skan | word kw_TAILMATCH word { $$ = _hx509_make_expr(comp_TAILEQ, $1, $3); } 91169691Skan | word kw_IN '(' words ')' { $$ = _hx509_make_expr(comp_IN, $1, $4); } 92169691Skan | word kw_IN variable { $$ = _hx509_make_expr(comp_IN, $1, $3); } 93169691Skan ; 94169691Skan 95169691Skanword : number { $$ = $1; } 96169691Skan | string { $$ = $1; } 97169691Skan | function { $$ = $1; } 98169691Skan | variable { $$ = $1; } 99169691Skan ; 100169691Skan 101169691Skannumber : NUMBER { $$ = _hx509_make_expr(expr_NUMBER, $1, NULL); }; 102169691Skanstring : STRING { $$ = _hx509_make_expr(expr_STRING, $1, NULL); }; 103169691Skan 104169691Skanfunction: IDENTIFIER '(' words ')' { 105169691Skan $$ = _hx509_make_expr(expr_FUNCTION, $1, $3); } 106169691Skan ; 107169691Skanvariable: '%' '{' variables '}' { $$ = $3; } 108169691Skan ; 109169691Skan 110169691Skanvariables: IDENTIFIER '.' variables { 111169691Skan $$ = _hx509_make_expr(expr_VAR, $1, $3); } 112169691Skan | IDENTIFIER { 113169691Skan $$ = _hx509_make_expr(expr_VAR, $1, NULL); } 114169691Skan ; 115169691Skan