prparser.y revision 233250
1249259Sdim%{ 2249259Sdim/****************************************************************************** 3249259Sdim * 4249259Sdim * Module Name: prparser.y - Bison input file for preprocessor parser 5249259Sdim * 6249259Sdim *****************************************************************************/ 7249259Sdim 8249259Sdim/* 9249259Sdim * Copyright (C) 2000 - 2012, Intel Corp. 10249259Sdim * All rights reserved. 11249259Sdim * 12249259Sdim * Redistribution and use in source and binary forms, with or without 13249259Sdim * modification, are permitted provided that the following conditions 14249259Sdim * are met: 15249259Sdim * 1. Redistributions of source code must retain the above copyright 16249259Sdim * notice, this list of conditions, and the following disclaimer, 17249259Sdim * without modification. 18249259Sdim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19249259Sdim * substantially similar to the "NO WARRANTY" disclaimer below 20249259Sdim * ("Disclaimer") and any redistribution must be conditioned upon 21249259Sdim * including a substantially similar Disclaimer requirement for further 22249259Sdim * binary redistribution. 23249259Sdim * 3. Neither the names of the above-listed copyright holders nor the names 24249259Sdim * of any contributors may be used to endorse or promote products derived 25249259Sdim * from this software without specific prior written permission. 26249259Sdim * 27249259Sdim * Alternatively, this software may be distributed under the terms of the 28249259Sdim * GNU General Public License ("GPL") version 2 as published by the Free 29249259Sdim * Software Foundation. 30249259Sdim * 31249259Sdim * NO WARRANTY 32249259Sdim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33249259Sdim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34249259Sdim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35249259Sdim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36249259Sdim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37249259Sdim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38249259Sdim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39249259Sdim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40249259Sdim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41249259Sdim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42249259Sdim * POSSIBILITY OF SUCH DAMAGES. 43249259Sdim */ 44249259Sdim 45249259Sdim#include <contrib/dev/acpica/compiler/aslcompiler.h> 46249259Sdim#include <contrib/dev/acpica/compiler/dtcompiler.h> 47249259Sdim 48249259Sdim#define _COMPONENT ASL_PREPROCESSOR 49249259Sdim ACPI_MODULE_NAME ("prparser") 50249259Sdim 51249259Sdimint PrParserlex (void); 52249259Sdimint PrParserparse (void); 53249259Sdimvoid PrParsererror (char const *msg); 54249259Sdimextern char *PrParsertext; 55249259Sdim 56249259SdimUINT64 PrParserResult; /* Expression return value */ 57249259Sdim 58249259Sdim/* Bison/yacc configuration */ 59249259Sdim 60249259Sdim#define yytname PrParsername 61249259Sdim#define YYDEBUG 1 /* Enable debug output */ 62249259Sdim#define YYERROR_VERBOSE 1 /* Verbose error messages */ 63249259Sdim#define YYFLAG -32768 64249259Sdim 65249259Sdim/* Define YYMALLOC/YYFREE to prevent redefinition errors */ 66249259Sdim 67249259Sdim#define YYMALLOC malloc 68249259Sdim#define YYFREE free 69249259Sdim%} 70249259Sdim 71249259Sdim%union 72249259Sdim{ 73249259Sdim UINT64 value; 74249259Sdim UINT32 op; 75249259Sdim char *str; 76249259Sdim} 77249259Sdim 78249259Sdim/*! [Begin] no source code translation */ 79249259Sdim 80249259Sdim%type <value> Expression 81249259Sdim 82249259Sdim%token <op> EXPOP_EOF 83249259Sdim%token <op> EXPOP_NEW_LINE 84249259Sdim%token <op> EXPOP_NUMBER 85249259Sdim%token <op> EXPOP_HEX_NUMBER 86249259Sdim%token <op> EXPOP_RESERVED1 87249259Sdim%token <op> EXPOP_RESERVED2 88249259Sdim%token <op> EXPOP_PAREN_OPEN 89249259Sdim%token <op> EXPOP_PAREN_CLOSE 90249259Sdim 91249259Sdim%left <op> EXPOP_LOGICAL_OR 92249259Sdim%left <op> EXPOP_LOGICAL_AND 93249259Sdim%left <op> EXPOP_OR 94249259Sdim%left <op> EXPOP_XOR 95249259Sdim%left <op> EXPOP_AND 96249259Sdim%left <op> EXPOP_EQUAL EXPOP_NOT_EQUAL 97249259Sdim%left <op> EXPOP_GREATER EXPOP_LESS EXPOP_GREATER_EQUAL EXPOP_LESS_EQUAL 98249259Sdim%left <op> EXPOP_SHIFT_RIGHT EXPOP_SHIFT_LEFT 99249259Sdim%left <op> EXPOP_ADD EXPOP_SUBTRACT 100249259Sdim%left <op> EXPOP_MULTIPLY EXPOP_DIVIDE EXPOP_MODULO 101249259Sdim%right <op> EXPOP_ONES_COMPLIMENT EXPOP_LOGICAL_NOT 102249259Sdim 103249259Sdim/* Tokens above must be kept in synch with dtparser.y */ 104249259Sdim 105249259Sdim%token <op> EXPOP_DEFINE 106249259Sdim%token <op> EXPOP_IDENTIFIER 107249259Sdim 108249259Sdim%% 109249259Sdim 110249259Sdim/* 111249259Sdim * Operator precedence rules (from K&R) 112249259Sdim * 113249259Sdim * 1) ( ) 114249259Sdim * 2) ! ~ (unary operators that are supported here) 115249259Sdim * 3) * / % 116249259Sdim * 4) + - 117249259Sdim * 5) >> << 118249259Sdim * 6) < > <= >= 119249259Sdim * 7) == != 120249259Sdim * 8) & 121249259Sdim * 9) ^ 122249259Sdim * 10) | 123249259Sdim * 11) && 124249259Sdim * 12) || 125249259Sdim */ 126249259Sdim 127249259Sdim/*! [End] no source code translation !*/ 128249259Sdim 129249259SdimValue 130249259Sdim : Expression EXPOP_NEW_LINE { PrParserResult=$1; return 0; } /* End of line (newline) */ 131249259Sdim | Expression EXPOP_EOF { PrParserResult=$1; return 0; } /* End of string (0) */ 132249259Sdim ; 133249259Sdim 134249259SdimExpression 135249259Sdim 136249259Sdim /* Unary operators */ 137249259Sdim 138249259Sdim : EXPOP_LOGICAL_NOT Expression { $$ = DtDoOperator ($2, EXPOP_LOGICAL_NOT, $2);} 139249259Sdim | EXPOP_ONES_COMPLIMENT Expression { $$ = DtDoOperator ($2, EXPOP_ONES_COMPLIMENT, $2);} 140249259Sdim 141249259Sdim /* Binary operators */ 142249259Sdim 143249259Sdim | Expression EXPOP_MULTIPLY Expression { $$ = DtDoOperator ($1, EXPOP_MULTIPLY, $3);} 144249259Sdim | Expression EXPOP_DIVIDE Expression { $$ = DtDoOperator ($1, EXPOP_DIVIDE, $3);} 145249259Sdim | Expression EXPOP_MODULO Expression { $$ = DtDoOperator ($1, EXPOP_MODULO, $3);} 146249259Sdim | Expression EXPOP_ADD Expression { $$ = DtDoOperator ($1, EXPOP_ADD, $3);} 147249259Sdim | Expression EXPOP_SUBTRACT Expression { $$ = DtDoOperator ($1, EXPOP_SUBTRACT, $3);} 148249259Sdim | Expression EXPOP_SHIFT_RIGHT Expression { $$ = DtDoOperator ($1, EXPOP_SHIFT_RIGHT, $3);} 149249259Sdim | Expression EXPOP_SHIFT_LEFT Expression { $$ = DtDoOperator ($1, EXPOP_SHIFT_LEFT, $3);} 150249259Sdim | Expression EXPOP_GREATER Expression { $$ = DtDoOperator ($1, EXPOP_GREATER, $3);} 151249259Sdim | Expression EXPOP_LESS Expression { $$ = DtDoOperator ($1, EXPOP_LESS, $3);} 152249259Sdim | Expression EXPOP_GREATER_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_GREATER_EQUAL, $3);} 153249259Sdim | Expression EXPOP_LESS_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_LESS_EQUAL, $3);} 154249259Sdim | Expression EXPOP_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_EQUAL, $3);} 155249259Sdim | Expression EXPOP_NOT_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_NOT_EQUAL, $3);} 156249259Sdim | Expression EXPOP_AND Expression { $$ = DtDoOperator ($1, EXPOP_AND, $3);} 157249259Sdim | Expression EXPOP_XOR Expression { $$ = DtDoOperator ($1, EXPOP_XOR, $3);} 158249259Sdim | Expression EXPOP_OR Expression { $$ = DtDoOperator ($1, EXPOP_OR, $3);} 159249259Sdim | Expression EXPOP_LOGICAL_AND Expression { $$ = DtDoOperator ($1, EXPOP_LOGICAL_AND, $3);} 160249259Sdim | Expression EXPOP_LOGICAL_OR Expression { $$ = DtDoOperator ($1, EXPOP_LOGICAL_OR, $3);} 161249259Sdim 162249259Sdim /* Parentheses: '(' Expression ')' */ 163249259Sdim 164249259Sdim | EXPOP_PAREN_OPEN Expression 165249259Sdim EXPOP_PAREN_CLOSE { $$ = $2;} 166249259Sdim 167249259Sdim /* #if defined (ID) or #if defined ID */ 168249259Sdim 169249259Sdim | EXPOP_DEFINE EXPOP_PAREN_OPEN EXPOP_IDENTIFIER 170249259Sdim EXPOP_PAREN_CLOSE { $$ = PrIsDefined (PrParserlval.str);} 171249259Sdim 172249259Sdim | EXPOP_DEFINE EXPOP_IDENTIFIER { $$ = PrIsDefined (PrParserlval.str);} 173249259Sdim 174249259Sdim | EXPOP_IDENTIFIER { $$ = PrResolveDefine (PrParserlval.str);} 175249259Sdim 176249259Sdim /* Default base for a non-prefixed integer is 10 */ 177249259Sdim 178249259Sdim | EXPOP_NUMBER { UtStrtoul64 (PrParsertext, 10, &$$);} 179249259Sdim 180249259Sdim /* Standard hex number (0x1234) */ 181249259Sdim 182249259Sdim | EXPOP_HEX_NUMBER { UtStrtoul64 (PrParsertext, 16, &$$);} 183249259Sdim ; 184249259Sdim%% 185249259Sdim 186249259Sdim/* 187249259Sdim * Local support functions, including parser entry point 188249259Sdim */ 189249259Sdim#define PR_FIRST_PARSE_OPCODE EXPOP_EOF 190249259Sdim#define PR_YYTNAME_START 3 191249259Sdim 192249259Sdim 193249259Sdim/****************************************************************************** 194249259Sdim * 195249259Sdim * FUNCTION: PrParsererror 196249259Sdim * 197249259Sdim * PARAMETERS: Message - Parser-generated error message 198249259Sdim * 199249259Sdim * RETURN: None 200249259Sdim * 201249259Sdim * DESCRIPTION: Handler for parser errors 202249259Sdim * 203249259Sdim *****************************************************************************/ 204249259Sdim 205249259Sdimvoid 206249259SdimPrParsererror ( 207249259Sdim char const *Message) 208249259Sdim{ 209249259Sdim DtError (ASL_ERROR, ASL_MSG_SYNTAX, 210249259Sdim NULL, (char *) Message); 211249259Sdim} 212249259Sdim 213249259Sdim 214249259Sdim/****************************************************************************** 215249259Sdim * 216249259Sdim * FUNCTION: PrGetOpName 217249259Sdim * 218249259Sdim * PARAMETERS: ParseOpcode - Parser token (EXPOP_*) 219249259Sdim * 220249259Sdim * RETURN: Pointer to the opcode name 221249259Sdim * 222249259Sdim * DESCRIPTION: Get the ascii name of the parse opcode for debug output 223249259Sdim * 224249259Sdim *****************************************************************************/ 225249259Sdim 226249259Sdimchar * 227249259SdimPrGetOpName ( 228249259Sdim UINT32 ParseOpcode) 229249259Sdim{ 230249259Sdim#ifdef ASL_YYTNAME_START 231249259Sdim /* 232249259Sdim * First entries (PR_YYTNAME_START) in yytname are special reserved names. 233249259Sdim * Ignore first 6 characters of name (EXPOP_) 234249259Sdim */ 235249259Sdim return ((char *) yytname 236249259Sdim [(ParseOpcode - PR_FIRST_PARSE_OPCODE) + PR_YYTNAME_START] + 6); 237249259Sdim#else 238249259Sdim return ("[Unknown parser generator]"); 239249259Sdim#endif 240249259Sdim} 241249259Sdim 242249259Sdim 243249259Sdim/****************************************************************************** 244249259Sdim * 245249259Sdim * FUNCTION: PrEvaluateExpression 246249259Sdim * 247249259Sdim * PARAMETERS: ExprString - Expression to be evaluated. Must be 248249259Sdim * terminated by either a newline or a NUL 249249259Sdim * string terminator 250249259Sdim * 251249259Sdim * RETURN: 64-bit value for the expression 252249259Sdim * 253249259Sdim * DESCRIPTION: Main entry point for the DT expression parser 254249259Sdim * 255249259Sdim *****************************************************************************/ 256249259Sdim 257249259SdimUINT64 258249259SdimPrEvaluateExpression ( 259249259Sdim char *ExprString) 260249259Sdim{ 261249259Sdim 262249259Sdim DbgPrint (ASL_DEBUG_OUTPUT, 263249259Sdim "**** Input expression: %s\n", ExprString); 264249259Sdim 265249259Sdim /* Point lexer to the input string */ 266249259Sdim 267249259Sdim if (PrInitLexer (ExprString)) 268249259Sdim { 269249259Sdim DtError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, 270249259Sdim NULL, "Could not initialize lexer"); 271249259Sdim return (0); 272249259Sdim } 273249259Sdim 274249259Sdim /* Parse/Evaluate the input string (value returned in PrParserResult) */ 275249259Sdim 276249259Sdim PrParserparse (); 277249259Sdim PrTerminateLexer (); 278249259Sdim 279249259Sdim DbgPrint (ASL_DEBUG_OUTPUT, 280249259Sdim "**** Parser returned value: %u (%8.8X%8.8X)\n", 281249259Sdim (UINT32) PrParserResult, ACPI_FORMAT_UINT64 (PrParserResult)); 282249259Sdim 283249259Sdim return (PrParserResult); 284249259Sdim} 285249259Sdim