prparser.y revision 281075
1215976Sjmallett%{ 2232812Sjmallett/****************************************************************************** 3215976Sjmallett * 4215976Sjmallett * Module Name: prparser.y - Bison input file for preprocessor parser 5215976Sjmallett * 6215976Sjmallett *****************************************************************************/ 7215976Sjmallett 8215976Sjmallett/* 9215976Sjmallett * Copyright (C) 2000 - 2015, Intel Corp. 10215976Sjmallett * All rights reserved. 11215976Sjmallett * 12215976Sjmallett * Redistribution and use in source and binary forms, with or without 13215976Sjmallett * modification, are permitted provided that the following conditions 14215976Sjmallett * are met: 15215976Sjmallett * 1. Redistributions of source code must retain the above copyright 16215976Sjmallett * notice, this list of conditions, and the following disclaimer, 17215976Sjmallett * without modification. 18232812Sjmallett * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19215976Sjmallett * substantially similar to the "NO WARRANTY" disclaimer below 20215976Sjmallett * ("Disclaimer") and any redistribution must be conditioned upon 21215976Sjmallett * including a substantially similar Disclaimer requirement for further 22215976Sjmallett * binary redistribution. 23215976Sjmallett * 3. Neither the names of the above-listed copyright holders nor the names 24215976Sjmallett * of any contributors may be used to endorse or promote products derived 25215976Sjmallett * from this software without specific prior written permission. 26215976Sjmallett * 27215976Sjmallett * Alternatively, this software may be distributed under the terms of the 28215976Sjmallett * GNU General Public License ("GPL") version 2 as published by the Free 29232812Sjmallett * Software Foundation. 30215976Sjmallett * 31215976Sjmallett * NO WARRANTY 32215976Sjmallett * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33215976Sjmallett * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34215976Sjmallett * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35215976Sjmallett * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36215976Sjmallett * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37215976Sjmallett * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38215976Sjmallett * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39215976Sjmallett * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40215976Sjmallett * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41215976Sjmallett * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42215976Sjmallett * POSSIBILITY OF SUCH DAMAGES. 43215976Sjmallett */ 44215976Sjmallett 45215976Sjmallett#include <contrib/dev/acpica/compiler/aslcompiler.h> 46215976Sjmallett#include <contrib/dev/acpica/compiler/dtcompiler.h> 47215976Sjmallett 48215976Sjmallett#define _COMPONENT ASL_PREPROCESSOR 49215976Sjmallett ACPI_MODULE_NAME ("prparser") 50215976Sjmallett 51215976Sjmallettint PrParserlex (void); 52215976Sjmallettint PrParserparse (void); 53215976Sjmallettvoid PrParsererror (char const *msg); 54215976Sjmallettextern char *PrParsertext; 55215976Sjmallett 56215976SjmallettUINT64 PrParserResult; /* Expression return value */ 57215976Sjmallett 58215976Sjmallett/* Bison/yacc configuration */ 59215976Sjmallett 60215976Sjmallett#define yytname PrParsername 61232812Sjmallett#define YYDEBUG 1 /* Enable debug output */ 62232812Sjmallett#define YYERROR_VERBOSE 1 /* Verbose error messages */ 63232812Sjmallett#define YYFLAG -32768 64232812Sjmallett 65232812Sjmallett/* Define YYMALLOC/YYFREE to prevent redefinition errors */ 66215976Sjmallett 67215976Sjmallett#define YYMALLOC malloc 68232812Sjmallett#define YYFREE free 69215976Sjmallett%} 70215976Sjmallett 71215976Sjmallett%union 72215976Sjmallett{ 73215976Sjmallett UINT64 value; 74215976Sjmallett UINT32 op; 75215976Sjmallett char *str; 76215976Sjmallett} 77215976Sjmallett 78215976Sjmallett/*! [Begin] no source code translation */ 79215976Sjmallett 80215976Sjmallett%type <value> Expression 81215976Sjmallett 82215976Sjmallett%token <op> EXPOP_EOF 83215976Sjmallett%token <op> EXPOP_NEW_LINE 84215976Sjmallett%token <op> EXPOP_NUMBER 85215976Sjmallett%token <op> EXPOP_HEX_NUMBER 86215976Sjmallett%token <op> EXPOP_RESERVED1 87215976Sjmallett%token <op> EXPOP_RESERVED2 88215976Sjmallett%token <op> EXPOP_PAREN_OPEN 89215976Sjmallett%token <op> EXPOP_PAREN_CLOSE 90215976Sjmallett 91215976Sjmallett%left <op> EXPOP_LOGICAL_OR 92215976Sjmallett%left <op> EXPOP_LOGICAL_AND 93215976Sjmallett%left <op> EXPOP_OR 94215976Sjmallett%left <op> EXPOP_XOR 95215976Sjmallett%left <op> EXPOP_AND 96215976Sjmallett%left <op> EXPOP_EQUAL EXPOP_NOT_EQUAL 97215976Sjmallett%left <op> EXPOP_GREATER EXPOP_LESS EXPOP_GREATER_EQUAL EXPOP_LESS_EQUAL 98215976Sjmallett%left <op> EXPOP_SHIFT_RIGHT EXPOP_SHIFT_LEFT 99215976Sjmallett%left <op> EXPOP_ADD EXPOP_SUBTRACT 100215976Sjmallett%left <op> EXPOP_MULTIPLY EXPOP_DIVIDE EXPOP_MODULO 101215976Sjmallett%right <op> EXPOP_ONES_COMPLIMENT EXPOP_LOGICAL_NOT 102215976Sjmallett 103215976Sjmallett/* Tokens above must be kept in synch with dtparser.y */ 104215976Sjmallett 105215976Sjmallett%token <op> EXPOP_DEFINE 106215976Sjmallett%token <op> EXPOP_IDENTIFIER 107215976Sjmallett 108215976Sjmallett%% 109215976Sjmallett 110215976Sjmallett/* 111215976Sjmallett * Operator precedence rules (from K&R) 112215976Sjmallett * 113215976Sjmallett * 1) ( ) 114215976Sjmallett * 2) ! ~ (unary operators that are supported here) 115215976Sjmallett * 3) * / % 116215976Sjmallett * 4) + - 117215976Sjmallett * 5) >> << 118215976Sjmallett * 6) < > <= >= 119215976Sjmallett * 7) == != 120215976Sjmallett * 8) & 121215976Sjmallett * 9) ^ 122215976Sjmallett * 10) | 123215976Sjmallett * 11) && 124215976Sjmallett * 12) || 125215976Sjmallett */ 126215976Sjmallett 127215976Sjmallett/*! [End] no source code translation !*/ 128215976Sjmallett 129215976SjmallettValue 130232812Sjmallett : Expression EXPOP_NEW_LINE { PrParserResult=$1; return 0; } /* End of line (newline) */ 131215976Sjmallett | Expression EXPOP_EOF { PrParserResult=$1; return 0; } /* End of string (0) */ 132215976Sjmallett ; 133215976Sjmallett 134215976SjmallettExpression 135215976Sjmallett 136215976Sjmallett /* Unary operators */ 137232812Sjmallett 138232812Sjmallett : EXPOP_LOGICAL_NOT Expression { $$ = DtDoOperator ($2, EXPOP_LOGICAL_NOT, $2);} 139232812Sjmallett | EXPOP_ONES_COMPLIMENT Expression { $$ = DtDoOperator ($2, EXPOP_ONES_COMPLIMENT, $2);} 140232812Sjmallett 141232812Sjmallett /* Binary operators */ 142232812Sjmallett 143232812Sjmallett | Expression EXPOP_MULTIPLY Expression { $$ = DtDoOperator ($1, EXPOP_MULTIPLY, $3);} 144232812Sjmallett | Expression EXPOP_DIVIDE Expression { $$ = DtDoOperator ($1, EXPOP_DIVIDE, $3);} 145232812Sjmallett | Expression EXPOP_MODULO Expression { $$ = DtDoOperator ($1, EXPOP_MODULO, $3);} 146232812Sjmallett | Expression EXPOP_ADD Expression { $$ = DtDoOperator ($1, EXPOP_ADD, $3);} 147232812Sjmallett | Expression EXPOP_SUBTRACT Expression { $$ = DtDoOperator ($1, EXPOP_SUBTRACT, $3);} 148232812Sjmallett | Expression EXPOP_SHIFT_RIGHT Expression { $$ = DtDoOperator ($1, EXPOP_SHIFT_RIGHT, $3);} 149232812Sjmallett | Expression EXPOP_SHIFT_LEFT Expression { $$ = DtDoOperator ($1, EXPOP_SHIFT_LEFT, $3);} 150232812Sjmallett | Expression EXPOP_GREATER Expression { $$ = DtDoOperator ($1, EXPOP_GREATER, $3);} 151232812Sjmallett | Expression EXPOP_LESS Expression { $$ = DtDoOperator ($1, EXPOP_LESS, $3);} 152232812Sjmallett | Expression EXPOP_GREATER_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_GREATER_EQUAL, $3);} 153232812Sjmallett | Expression EXPOP_LESS_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_LESS_EQUAL, $3);} 154215976Sjmallett | Expression EXPOP_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_EQUAL, $3);} 155215976Sjmallett | Expression EXPOP_NOT_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_NOT_EQUAL, $3);} 156215976Sjmallett | Expression EXPOP_AND Expression { $$ = DtDoOperator ($1, EXPOP_AND, $3);} 157215976Sjmallett | Expression EXPOP_XOR Expression { $$ = DtDoOperator ($1, EXPOP_XOR, $3);} 158215976Sjmallett | Expression EXPOP_OR Expression { $$ = DtDoOperator ($1, EXPOP_OR, $3);} 159215976Sjmallett | Expression EXPOP_LOGICAL_AND Expression { $$ = DtDoOperator ($1, EXPOP_LOGICAL_AND, $3);} 160215976Sjmallett | Expression EXPOP_LOGICAL_OR Expression { $$ = DtDoOperator ($1, EXPOP_LOGICAL_OR, $3);} 161215976Sjmallett 162215976Sjmallett /* Parentheses: '(' Expression ')' */ 163215976Sjmallett 164215976Sjmallett | EXPOP_PAREN_OPEN Expression 165215976Sjmallett EXPOP_PAREN_CLOSE { $$ = $2;} 166215976Sjmallett 167215976Sjmallett /* #if defined (ID) or #if defined ID */ 168215976Sjmallett 169215976Sjmallett | EXPOP_DEFINE EXPOP_PAREN_OPEN EXPOP_IDENTIFIER 170215976Sjmallett EXPOP_PAREN_CLOSE { $$ = PrIsDefined (PrParserlval.str);} 171215976Sjmallett 172215976Sjmallett | EXPOP_DEFINE EXPOP_IDENTIFIER { $$ = PrIsDefined (PrParserlval.str);} 173215976Sjmallett 174215976Sjmallett | EXPOP_IDENTIFIER { $$ = PrResolveDefine (PrParserlval.str);} 175215976Sjmallett 176215976Sjmallett /* Default base for a non-prefixed integer is 10 */ 177215976Sjmallett 178215976Sjmallett | EXPOP_NUMBER { UtStrtoul64 (PrParsertext, 10, &$$);} 179215976Sjmallett 180215976Sjmallett /* Standard hex number (0x1234) */ 181215976Sjmallett 182215976Sjmallett | EXPOP_HEX_NUMBER { UtStrtoul64 (PrParsertext, 16, &$$);} 183215976Sjmallett ; 184215976Sjmallett%% 185215976Sjmallett 186215976Sjmallett/* 187215976Sjmallett * Local support functions, including parser entry point 188215976Sjmallett */ 189215976Sjmallett#define PR_FIRST_PARSE_OPCODE EXPOP_EOF 190215976Sjmallett#define PR_YYTNAME_START 3 191215976Sjmallett 192215976Sjmallett 193215976Sjmallett/****************************************************************************** 194232812Sjmallett * 195215976Sjmallett * FUNCTION: PrParsererror 196232812Sjmallett * 197215976Sjmallett * PARAMETERS: Message - Parser-generated error message 198232812Sjmallett * 199232812Sjmallett * RETURN: None 200232812Sjmallett * 201232812Sjmallett * DESCRIPTION: Handler for parser errors 202232812Sjmallett * 203232812Sjmallett *****************************************************************************/ 204215976Sjmallett 205232812Sjmallettvoid 206215976SjmallettPrParsererror ( 207215976Sjmallett char const *Message) 208215976Sjmallett{ 209215976Sjmallett DtError (ASL_ERROR, ASL_MSG_SYNTAX, 210215976Sjmallett NULL, (char *) Message); 211215976Sjmallett} 212232812Sjmallett 213232812Sjmallett 214232812Sjmallett/****************************************************************************** 215232812Sjmallett * 216232812Sjmallett * FUNCTION: PrGetOpName 217232812Sjmallett * 218232812Sjmallett * PARAMETERS: ParseOpcode - Parser token (EXPOP_*) 219232812Sjmallett * 220232812Sjmallett * RETURN: Pointer to the opcode name 221215976Sjmallett * 222215976Sjmallett * DESCRIPTION: Get the ascii name of the parse opcode for debug output 223215976Sjmallett * 224215976Sjmallett *****************************************************************************/ 225215976Sjmallett 226215976Sjmallettchar * 227215976SjmallettPrGetOpName ( 228215976Sjmallett UINT32 ParseOpcode) 229215976Sjmallett{ 230232812Sjmallett#ifdef ASL_YYTNAME_START 231215976Sjmallett /* 232215976Sjmallett * First entries (PR_YYTNAME_START) in yytname are special reserved names. 233215976Sjmallett * Ignore first 6 characters of name (EXPOP_) 234215976Sjmallett */ 235215976Sjmallett return ((char *) yytname 236215976Sjmallett [(ParseOpcode - PR_FIRST_PARSE_OPCODE) + PR_YYTNAME_START] + 6); 237215976Sjmallett#else 238215976Sjmallett return ("[Unknown parser generator]"); 239215976Sjmallett#endif 240215976Sjmallett} 241215976Sjmallett 242215976Sjmallett 243215976Sjmallett/****************************************************************************** 244215976Sjmallett * 245215976Sjmallett * FUNCTION: PrEvaluateExpression 246215976Sjmallett * 247215976Sjmallett * PARAMETERS: ExprString - Expression to be evaluated. Must be 248232812Sjmallett * terminated by either a newline or a NUL 249215976Sjmallett * string terminator 250215976Sjmallett * 251215976Sjmallett * RETURN: 64-bit value for the expression 252215976Sjmallett * 253232812Sjmallett * DESCRIPTION: Main entry point for the DT expression parser 254215976Sjmallett * 255215976Sjmallett *****************************************************************************/ 256215976Sjmallett 257215976SjmallettUINT64 258215976SjmallettPrEvaluateExpression ( 259215976Sjmallett char *ExprString) 260215976Sjmallett{ 261215976Sjmallett 262215976Sjmallett DbgPrint (ASL_DEBUG_OUTPUT, 263215976Sjmallett "**** Input expression: %s\n", ExprString); 264215976Sjmallett 265215976Sjmallett /* Point lexer to the input string */ 266215976Sjmallett 267215976Sjmallett if (PrInitLexer (ExprString)) 268 { 269 DtError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, 270 NULL, "Could not initialize lexer"); 271 return (0); 272 } 273 274 /* Parse/Evaluate the input string (value returned in PrParserResult) */ 275 276 PrParserparse (); 277 PrTerminateLexer (); 278 279 DbgPrint (ASL_DEBUG_OUTPUT, 280 "**** Parser returned value: %u (%8.8X%8.8X)\n", 281 (UINT32) PrParserResult, ACPI_FORMAT_UINT64 (PrParserResult)); 282 283 return (PrParserResult); 284} 285