prparser.y revision 233237
1221888Sadrian%{ 2221888Sadrian/****************************************************************************** 3221888Sadrian * 4221888Sadrian * Module Name: prparser.y - Bison input file for preprocessor parser 5221888Sadrian * 6221888Sadrian *****************************************************************************/ 7221888Sadrian 8221888Sadrian/* 9221888Sadrian * Copyright (C) 2000 - 2012, Intel Corp. 10221888Sadrian * All rights reserved. 11221888Sadrian * 12221888Sadrian * Redistribution and use in source and binary forms, with or without 13221888Sadrian * modification, are permitted provided that the following conditions 14221888Sadrian * are met: 15221888Sadrian * 1. Redistributions of source code must retain the above copyright 16221888Sadrian * notice, this list of conditions, and the following disclaimer, 17221888Sadrian * without modification. 18221888Sadrian * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19221888Sadrian * substantially similar to the "NO WARRANTY" disclaimer below 20221888Sadrian * ("Disclaimer") and any redistribution must be conditioned upon 21221888Sadrian * including a substantially similar Disclaimer requirement for further 22221888Sadrian * binary redistribution. 23221888Sadrian * 3. Neither the names of the above-listed copyright holders nor the names 24221888Sadrian * of any contributors may be used to endorse or promote products derived 25221888Sadrian * from this software without specific prior written permission. 26221888Sadrian * 27221888Sadrian * Alternatively, this software may be distributed under the terms of the 28221888Sadrian * GNU General Public License ("GPL") version 2 as published by the Free 29221888Sadrian * Software Foundation. 30221888Sadrian * 31221888Sadrian * NO WARRANTY 32221888Sadrian * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33221888Sadrian * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34221888Sadrian * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35221888Sadrian * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36221888Sadrian * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37221888Sadrian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38221888Sadrian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39221888Sadrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40221888Sadrian * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41221888Sadrian * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42221888Sadrian * POSSIBILITY OF SUCH DAMAGES. 43221888Sadrian */ 44221888Sadrian 45221888Sadrian#include "aslcompiler.h" 46221888Sadrian#include "dtcompiler.h" 47221888Sadrian 48221888Sadrian#define _COMPONENT ASL_PREPROCESSOR 49221888Sadrian ACPI_MODULE_NAME ("prparser") 50221888Sadrian 51221888Sadrianint PrParserlex (void); 52221888Sadrianint PrParserparse (void); 53221888Sadrianvoid PrParsererror (char const *msg); 54221888Sadrianextern char *PrParsertext; 55221888Sadrian 56221888SadrianUINT64 PrParserResult; /* Expression return value */ 57221888Sadrian 58221888Sadrian/* Bison/yacc configuration */ 59221888Sadrian 60221888Sadrian#define yytname PrParsername 61221888Sadrian#define YYDEBUG 1 /* Enable debug output */ 62221888Sadrian#define YYERROR_VERBOSE 1 /* Verbose error messages */ 63221888Sadrian#define YYFLAG -32768 64221888Sadrian 65221888Sadrian/* Define YYMALLOC/YYFREE to prevent redefinition errors */ 66221888Sadrian 67221888Sadrian#define YYMALLOC malloc 68221888Sadrian#define YYFREE free 69221888Sadrian%} 70221888Sadrian 71221888Sadrian%union 72221888Sadrian{ 73221888Sadrian UINT64 value; 74221888Sadrian UINT32 op; 75221888Sadrian char *str; 76221888Sadrian} 77221888Sadrian 78221888Sadrian/*! [Begin] no source code translation */ 79221888Sadrian 80221888Sadrian%type <value> Expression 81221888Sadrian 82221888Sadrian%token <op> EXPOP_EOF 83221888Sadrian%token <op> EXPOP_NEW_LINE 84221888Sadrian%token <op> EXPOP_NUMBER 85221888Sadrian%token <op> EXPOP_HEX_NUMBER 86221888Sadrian%token <op> EXPOP_RESERVED1 87221888Sadrian%token <op> EXPOP_RESERVED2 88221888Sadrian%token <op> EXPOP_PAREN_OPEN 89221888Sadrian%token <op> EXPOP_PAREN_CLOSE 90221888Sadrian 91221888Sadrian%left <op> EXPOP_LOGICAL_OR 92221888Sadrian%left <op> EXPOP_LOGICAL_AND 93221888Sadrian%left <op> EXPOP_OR 94221888Sadrian%left <op> EXPOP_XOR 95221888Sadrian%left <op> EXPOP_AND 96221888Sadrian%left <op> EXPOP_EQUAL EXPOP_NOT_EQUAL 97221888Sadrian%left <op> EXPOP_GREATER EXPOP_LESS EXPOP_GREATER_EQUAL EXPOP_LESS_EQUAL 98221888Sadrian%left <op> EXPOP_SHIFT_RIGHT EXPOP_SHIFT_LEFT 99221888Sadrian%left <op> EXPOP_ADD EXPOP_SUBTRACT 100221888Sadrian%left <op> EXPOP_MULTIPLY EXPOP_DIVIDE EXPOP_MODULO 101221888Sadrian%right <op> EXPOP_ONES_COMPLIMENT EXPOP_LOGICAL_NOT 102222299Sadrian 103222299Sadrian/* Tokens above must be kept in synch with dtparser.y */ 104222299Sadrian 105222299Sadrian%token <op> EXPOP_DEFINE 106222299Sadrian%token <op> EXPOP_IDENTIFIER 107222299Sadrian 108222299Sadrian%% 109222299Sadrian 110222299Sadrian/* 111222299Sadrian * Operator precedence rules (from K&R) 112222299Sadrian * 113222299Sadrian * 1) ( ) 114221888Sadrian * 2) ! ~ (unary operators that are supported here) 115221888Sadrian * 3) * / % 116221888Sadrian * 4) + - 117221888Sadrian * 5) >> << 118221888Sadrian * 6) < > <= >= 119221888Sadrian * 7) == != 120221888Sadrian * 8) & 121221888Sadrian * 9) ^ 122221888Sadrian * 10) | 123221896Sadrian * 11) && 124221888Sadrian * 12) || 125221888Sadrian */ 126221888Sadrian 127221888Sadrian/*! [End] no source code translation !*/ 128221888Sadrian 129222303SadrianValue 130222303Sadrian : Expression EXPOP_NEW_LINE { PrParserResult=$1; return 0; } /* End of line (newline) */ 131222303Sadrian | Expression EXPOP_EOF { PrParserResult=$1; return 0; } /* End of string (0) */ 132222303Sadrian ; 133222303Sadrian 134222303SadrianExpression 135221888Sadrian 136221888Sadrian /* Unary operators */ 137221888Sadrian 138221888Sadrian : EXPOP_LOGICAL_NOT Expression { $$ = DtDoOperator ($2, EXPOP_LOGICAL_NOT, $2);} 139221888Sadrian | EXPOP_ONES_COMPLIMENT Expression { $$ = DtDoOperator ($2, EXPOP_ONES_COMPLIMENT, $2);} 140221888Sadrian 141221888Sadrian /* Binary operators */ 142221888Sadrian 143221888Sadrian | Expression EXPOP_MULTIPLY Expression { $$ = DtDoOperator ($1, EXPOP_MULTIPLY, $3);} 144221888Sadrian | Expression EXPOP_DIVIDE Expression { $$ = DtDoOperator ($1, EXPOP_DIVIDE, $3);} 145221888Sadrian | Expression EXPOP_MODULO Expression { $$ = DtDoOperator ($1, EXPOP_MODULO, $3);} 146221888Sadrian | Expression EXPOP_ADD Expression { $$ = DtDoOperator ($1, EXPOP_ADD, $3);} 147221888Sadrian | Expression EXPOP_SUBTRACT Expression { $$ = DtDoOperator ($1, EXPOP_SUBTRACT, $3);} 148221888Sadrian | Expression EXPOP_SHIFT_RIGHT Expression { $$ = DtDoOperator ($1, EXPOP_SHIFT_RIGHT, $3);} 149221888Sadrian | Expression EXPOP_SHIFT_LEFT Expression { $$ = DtDoOperator ($1, EXPOP_SHIFT_LEFT, $3);} 150221888Sadrian | Expression EXPOP_GREATER Expression { $$ = DtDoOperator ($1, EXPOP_GREATER, $3);} 151221888Sadrian | Expression EXPOP_LESS Expression { $$ = DtDoOperator ($1, EXPOP_LESS, $3);} 152221888Sadrian | Expression EXPOP_GREATER_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_GREATER_EQUAL, $3);} 153221888Sadrian | Expression EXPOP_LESS_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_LESS_EQUAL, $3);} 154221888Sadrian | Expression EXPOP_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_EQUAL, $3);} 155221888Sadrian | Expression EXPOP_NOT_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_NOT_EQUAL, $3);} 156221888Sadrian | Expression EXPOP_AND Expression { $$ = DtDoOperator ($1, EXPOP_AND, $3);} 157221888Sadrian | Expression EXPOP_XOR Expression { $$ = DtDoOperator ($1, EXPOP_XOR, $3);} 158221888Sadrian | Expression EXPOP_OR Expression { $$ = DtDoOperator ($1, EXPOP_OR, $3);} 159221888Sadrian | Expression EXPOP_LOGICAL_AND Expression { $$ = DtDoOperator ($1, EXPOP_LOGICAL_AND, $3);} 160221888Sadrian | Expression EXPOP_LOGICAL_OR Expression { $$ = DtDoOperator ($1, EXPOP_LOGICAL_OR, $3);} 161221888Sadrian 162221888Sadrian /* Parentheses: '(' Expression ')' */ 163221888Sadrian 164221888Sadrian | EXPOP_PAREN_OPEN Expression 165221888Sadrian EXPOP_PAREN_CLOSE { $$ = $2;} 166221888Sadrian 167221888Sadrian /* #if defined (ID) or #if defined ID */ 168221888Sadrian 169221888Sadrian | EXPOP_DEFINE EXPOP_PAREN_OPEN EXPOP_IDENTIFIER 170221888Sadrian EXPOP_PAREN_CLOSE { $$ = PrIsDefined (PrParserlval.str);} 171221888Sadrian 172221888Sadrian | EXPOP_DEFINE EXPOP_IDENTIFIER { $$ = PrIsDefined (PrParserlval.str);} 173221888Sadrian 174221888Sadrian | EXPOP_IDENTIFIER { $$ = PrResolveDefine (PrParserlval.str);} 175221888Sadrian 176221888Sadrian /* Default base for a non-prefixed integer is 10 */ 177221888Sadrian 178221888Sadrian | EXPOP_NUMBER { UtStrtoul64 (PrParsertext, 10, &$$);} 179221888Sadrian 180221888Sadrian /* Standard hex number (0x1234) */ 181221888Sadrian 182221888Sadrian | EXPOP_HEX_NUMBER { UtStrtoul64 (PrParsertext, 16, &$$);} 183221888Sadrian ; 184221888Sadrian%% 185221888Sadrian 186221888Sadrian/* 187221888Sadrian * Local support functions, including parser entry point 188221888Sadrian */ 189221888Sadrian#define PR_FIRST_PARSE_OPCODE EXPOP_EOF 190221888Sadrian#define PR_YYTNAME_START 3 191221888Sadrian 192221888Sadrian 193221888Sadrian/****************************************************************************** 194221888Sadrian * 195221888Sadrian * FUNCTION: PrParsererror 196221888Sadrian * 197221888Sadrian * PARAMETERS: Message - Parser-generated error message 198221888Sadrian * 199221888Sadrian * RETURN: None 200221888Sadrian * 201221888Sadrian * DESCRIPTION: Handler for parser errors 202221888Sadrian * 203221888Sadrian *****************************************************************************/ 204221888Sadrian 205221888Sadrianvoid 206221888SadrianPrParsererror ( 207221888Sadrian char const *Message) 208221888Sadrian{ 209221888Sadrian DtError (ASL_ERROR, ASL_MSG_SYNTAX, 210221888Sadrian NULL, (char *) Message); 211221888Sadrian} 212221888Sadrian 213221888Sadrian 214221888Sadrian/****************************************************************************** 215221888Sadrian * 216221888Sadrian * FUNCTION: PrGetOpName 217221888Sadrian * 218221888Sadrian * PARAMETERS: ParseOpcode - Parser token (EXPOP_*) 219221888Sadrian * 220221888Sadrian * RETURN: Pointer to the opcode name 221221888Sadrian * 222221888Sadrian * DESCRIPTION: Get the ascii name of the parse opcode for debug output 223221888Sadrian * 224221888Sadrian *****************************************************************************/ 225221888Sadrian 226221888Sadrianchar * 227221888SadrianPrGetOpName ( 228221888Sadrian UINT32 ParseOpcode) 229221888Sadrian{ 230221888Sadrian#ifdef ASL_YYTNAME_START 231221888Sadrian /* 232221888Sadrian * First entries (PR_YYTNAME_START) in yytname are special reserved names. 233221888Sadrian * Ignore first 6 characters of name (EXPOP_) 234221888Sadrian */ 235221888Sadrian return ((char *) yytname 236221888Sadrian [(ParseOpcode - PR_FIRST_PARSE_OPCODE) + PR_YYTNAME_START] + 6); 237221888Sadrian#else 238221888Sadrian return ("[Unknown parser generator]"); 239221888Sadrian#endif 240221888Sadrian} 241221888Sadrian 242221888Sadrian 243221888Sadrian/****************************************************************************** 244221888Sadrian * 245221888Sadrian * FUNCTION: PrEvaluateExpression 246221888Sadrian * 247221888Sadrian * PARAMETERS: ExprString - Expression to be evaluated. Must be 248221888Sadrian * terminated by either a newline or a NUL 249221888Sadrian * string terminator 250221888Sadrian * 251221888Sadrian * RETURN: 64-bit value for the expression 252221888Sadrian * 253221888Sadrian * DESCRIPTION: Main entry point for the DT expression parser 254221888Sadrian * 255221888Sadrian *****************************************************************************/ 256221888Sadrian 257221888SadrianUINT64 258221888SadrianPrEvaluateExpression ( 259221888Sadrian char *ExprString) 260221888Sadrian{ 261221888Sadrian 262221888Sadrian DbgPrint (ASL_DEBUG_OUTPUT, 263221888Sadrian "**** Input expression: %s\n", ExprString); 264221888Sadrian 265221888Sadrian /* Point lexer to the input string */ 266221888Sadrian 267221888Sadrian if (PrInitLexer (ExprString)) 268221888Sadrian { 269221888Sadrian DtError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, 270221888Sadrian NULL, "Could not initialize lexer"); 271221888Sadrian return (0); 272221888Sadrian } 273221888Sadrian 274221888Sadrian /* Parse/Evaluate the input string (value returned in PrParserResult) */ 275221888Sadrian 276221888Sadrian PrParserparse (); 277221888Sadrian PrTerminateLexer (); 278221888Sadrian 279221888Sadrian DbgPrint (ASL_DEBUG_OUTPUT, 280221888Sadrian "**** Parser returned value: %u (%8.8X%8.8X)\n", 281221888Sadrian (UINT32) PrParserResult, ACPI_FORMAT_UINT64 (PrParserResult)); 282221888Sadrian 283221888Sadrian return (PrParserResult); 284221888Sadrian} 285221888Sadrian