1*4c52cad2SJung-uk Kim %{ 2*4c52cad2SJung-uk Kim /****************************************************************************** 3*4c52cad2SJung-uk Kim * 4*4c52cad2SJung-uk Kim * Module Name: prparser.y - Bison input file for preprocessor parser 5*4c52cad2SJung-uk Kim * 6*4c52cad2SJung-uk Kim *****************************************************************************/ 7*4c52cad2SJung-uk Kim 8*4c52cad2SJung-uk Kim /* 9*4c52cad2SJung-uk Kim * Copyright (C) 2000 - 2012, Intel Corp. 10*4c52cad2SJung-uk Kim * All rights reserved. 11*4c52cad2SJung-uk Kim * 12*4c52cad2SJung-uk Kim * Redistribution and use in source and binary forms, with or without 13*4c52cad2SJung-uk Kim * modification, are permitted provided that the following conditions 14*4c52cad2SJung-uk Kim * are met: 15*4c52cad2SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 16*4c52cad2SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 17*4c52cad2SJung-uk Kim * without modification. 18*4c52cad2SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19*4c52cad2SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 20*4c52cad2SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 21*4c52cad2SJung-uk Kim * including a substantially similar Disclaimer requirement for further 22*4c52cad2SJung-uk Kim * binary redistribution. 23*4c52cad2SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 24*4c52cad2SJung-uk Kim * of any contributors may be used to endorse or promote products derived 25*4c52cad2SJung-uk Kim * from this software without specific prior written permission. 26*4c52cad2SJung-uk Kim * 27*4c52cad2SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 28*4c52cad2SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 29*4c52cad2SJung-uk Kim * Software Foundation. 30*4c52cad2SJung-uk Kim * 31*4c52cad2SJung-uk Kim * NO WARRANTY 32*4c52cad2SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33*4c52cad2SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34*4c52cad2SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35*4c52cad2SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36*4c52cad2SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37*4c52cad2SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38*4c52cad2SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39*4c52cad2SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40*4c52cad2SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41*4c52cad2SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42*4c52cad2SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 43*4c52cad2SJung-uk Kim */ 44*4c52cad2SJung-uk Kim 45*4c52cad2SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 46*4c52cad2SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h> 47*4c52cad2SJung-uk Kim 48*4c52cad2SJung-uk Kim #define _COMPONENT ASL_PREPROCESSOR 49*4c52cad2SJung-uk Kim ACPI_MODULE_NAME ("prparser") 50*4c52cad2SJung-uk Kim 51*4c52cad2SJung-uk Kim int PrParserlex (void); 52*4c52cad2SJung-uk Kim int PrParserparse (void); 53*4c52cad2SJung-uk Kim void PrParsererror (char const *msg); 54*4c52cad2SJung-uk Kim extern char *PrParsertext; 55*4c52cad2SJung-uk Kim 56*4c52cad2SJung-uk Kim UINT64 PrParserResult; /* Expression return value */ 57*4c52cad2SJung-uk Kim 58*4c52cad2SJung-uk Kim /* Bison/yacc configuration */ 59*4c52cad2SJung-uk Kim 60*4c52cad2SJung-uk Kim #define yytname PrParsername 61*4c52cad2SJung-uk Kim #define YYDEBUG 1 /* Enable debug output */ 62*4c52cad2SJung-uk Kim #define YYERROR_VERBOSE 1 /* Verbose error messages */ 63*4c52cad2SJung-uk Kim #define YYFLAG -32768 64*4c52cad2SJung-uk Kim 65*4c52cad2SJung-uk Kim /* Define YYMALLOC/YYFREE to prevent redefinition errors */ 66*4c52cad2SJung-uk Kim 67*4c52cad2SJung-uk Kim #define YYMALLOC malloc 68*4c52cad2SJung-uk Kim #define YYFREE free 69*4c52cad2SJung-uk Kim %} 70*4c52cad2SJung-uk Kim 71*4c52cad2SJung-uk Kim %union 72*4c52cad2SJung-uk Kim { 73*4c52cad2SJung-uk Kim UINT64 value; 74*4c52cad2SJung-uk Kim UINT32 op; 75*4c52cad2SJung-uk Kim char *str; 76*4c52cad2SJung-uk Kim } 77*4c52cad2SJung-uk Kim 78*4c52cad2SJung-uk Kim /*! [Begin] no source code translation */ 79*4c52cad2SJung-uk Kim 80*4c52cad2SJung-uk Kim %type <value> Expression 81*4c52cad2SJung-uk Kim 82*4c52cad2SJung-uk Kim %token <op> EXPOP_EOF 83*4c52cad2SJung-uk Kim %token <op> EXPOP_NEW_LINE 84*4c52cad2SJung-uk Kim %token <op> EXPOP_NUMBER 85*4c52cad2SJung-uk Kim %token <op> EXPOP_HEX_NUMBER 86*4c52cad2SJung-uk Kim %token <op> EXPOP_RESERVED1 87*4c52cad2SJung-uk Kim %token <op> EXPOP_RESERVED2 88*4c52cad2SJung-uk Kim %token <op> EXPOP_PAREN_OPEN 89*4c52cad2SJung-uk Kim %token <op> EXPOP_PAREN_CLOSE 90*4c52cad2SJung-uk Kim 91*4c52cad2SJung-uk Kim %left <op> EXPOP_LOGICAL_OR 92*4c52cad2SJung-uk Kim %left <op> EXPOP_LOGICAL_AND 93*4c52cad2SJung-uk Kim %left <op> EXPOP_OR 94*4c52cad2SJung-uk Kim %left <op> EXPOP_XOR 95*4c52cad2SJung-uk Kim %left <op> EXPOP_AND 96*4c52cad2SJung-uk Kim %left <op> EXPOP_EQUAL EXPOP_NOT_EQUAL 97*4c52cad2SJung-uk Kim %left <op> EXPOP_GREATER EXPOP_LESS EXPOP_GREATER_EQUAL EXPOP_LESS_EQUAL 98*4c52cad2SJung-uk Kim %left <op> EXPOP_SHIFT_RIGHT EXPOP_SHIFT_LEFT 99*4c52cad2SJung-uk Kim %left <op> EXPOP_ADD EXPOP_SUBTRACT 100*4c52cad2SJung-uk Kim %left <op> EXPOP_MULTIPLY EXPOP_DIVIDE EXPOP_MODULO 101*4c52cad2SJung-uk Kim %right <op> EXPOP_ONES_COMPLIMENT EXPOP_LOGICAL_NOT 102*4c52cad2SJung-uk Kim 103*4c52cad2SJung-uk Kim /* Tokens above must be kept in synch with dtparser.y */ 104*4c52cad2SJung-uk Kim 105*4c52cad2SJung-uk Kim %token <op> EXPOP_DEFINE 106*4c52cad2SJung-uk Kim %token <op> EXPOP_IDENTIFIER 107*4c52cad2SJung-uk Kim 108*4c52cad2SJung-uk Kim %% 109*4c52cad2SJung-uk Kim 110*4c52cad2SJung-uk Kim /* 111*4c52cad2SJung-uk Kim * Operator precedence rules (from K&R) 112*4c52cad2SJung-uk Kim * 113*4c52cad2SJung-uk Kim * 1) ( ) 114*4c52cad2SJung-uk Kim * 2) ! ~ (unary operators that are supported here) 115*4c52cad2SJung-uk Kim * 3) * / % 116*4c52cad2SJung-uk Kim * 4) + - 117*4c52cad2SJung-uk Kim * 5) >> << 118*4c52cad2SJung-uk Kim * 6) < > <= >= 119*4c52cad2SJung-uk Kim * 7) == != 120*4c52cad2SJung-uk Kim * 8) & 121*4c52cad2SJung-uk Kim * 9) ^ 122*4c52cad2SJung-uk Kim * 10) | 123*4c52cad2SJung-uk Kim * 11) && 124*4c52cad2SJung-uk Kim * 12) || 125*4c52cad2SJung-uk Kim */ 126*4c52cad2SJung-uk Kim 127*4c52cad2SJung-uk Kim /*! [End] no source code translation !*/ 128*4c52cad2SJung-uk Kim 129*4c52cad2SJung-uk Kim Value 130*4c52cad2SJung-uk Kim : Expression EXPOP_NEW_LINE { PrParserResult=$1; return 0; } /* End of line (newline) */ 131*4c52cad2SJung-uk Kim | Expression EXPOP_EOF { PrParserResult=$1; return 0; } /* End of string (0) */ 132*4c52cad2SJung-uk Kim ; 133*4c52cad2SJung-uk Kim 134*4c52cad2SJung-uk Kim Expression 135*4c52cad2SJung-uk Kim 136*4c52cad2SJung-uk Kim /* Unary operators */ 137*4c52cad2SJung-uk Kim 138*4c52cad2SJung-uk Kim : EXPOP_LOGICAL_NOT Expression { $$ = DtDoOperator ($2, EXPOP_LOGICAL_NOT, $2);} 139*4c52cad2SJung-uk Kim | EXPOP_ONES_COMPLIMENT Expression { $$ = DtDoOperator ($2, EXPOP_ONES_COMPLIMENT, $2);} 140*4c52cad2SJung-uk Kim 141*4c52cad2SJung-uk Kim /* Binary operators */ 142*4c52cad2SJung-uk Kim 143*4c52cad2SJung-uk Kim | Expression EXPOP_MULTIPLY Expression { $$ = DtDoOperator ($1, EXPOP_MULTIPLY, $3);} 144*4c52cad2SJung-uk Kim | Expression EXPOP_DIVIDE Expression { $$ = DtDoOperator ($1, EXPOP_DIVIDE, $3);} 145*4c52cad2SJung-uk Kim | Expression EXPOP_MODULO Expression { $$ = DtDoOperator ($1, EXPOP_MODULO, $3);} 146*4c52cad2SJung-uk Kim | Expression EXPOP_ADD Expression { $$ = DtDoOperator ($1, EXPOP_ADD, $3);} 147*4c52cad2SJung-uk Kim | Expression EXPOP_SUBTRACT Expression { $$ = DtDoOperator ($1, EXPOP_SUBTRACT, $3);} 148*4c52cad2SJung-uk Kim | Expression EXPOP_SHIFT_RIGHT Expression { $$ = DtDoOperator ($1, EXPOP_SHIFT_RIGHT, $3);} 149*4c52cad2SJung-uk Kim | Expression EXPOP_SHIFT_LEFT Expression { $$ = DtDoOperator ($1, EXPOP_SHIFT_LEFT, $3);} 150*4c52cad2SJung-uk Kim | Expression EXPOP_GREATER Expression { $$ = DtDoOperator ($1, EXPOP_GREATER, $3);} 151*4c52cad2SJung-uk Kim | Expression EXPOP_LESS Expression { $$ = DtDoOperator ($1, EXPOP_LESS, $3);} 152*4c52cad2SJung-uk Kim | Expression EXPOP_GREATER_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_GREATER_EQUAL, $3);} 153*4c52cad2SJung-uk Kim | Expression EXPOP_LESS_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_LESS_EQUAL, $3);} 154*4c52cad2SJung-uk Kim | Expression EXPOP_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_EQUAL, $3);} 155*4c52cad2SJung-uk Kim | Expression EXPOP_NOT_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_NOT_EQUAL, $3);} 156*4c52cad2SJung-uk Kim | Expression EXPOP_AND Expression { $$ = DtDoOperator ($1, EXPOP_AND, $3);} 157*4c52cad2SJung-uk Kim | Expression EXPOP_XOR Expression { $$ = DtDoOperator ($1, EXPOP_XOR, $3);} 158*4c52cad2SJung-uk Kim | Expression EXPOP_OR Expression { $$ = DtDoOperator ($1, EXPOP_OR, $3);} 159*4c52cad2SJung-uk Kim | Expression EXPOP_LOGICAL_AND Expression { $$ = DtDoOperator ($1, EXPOP_LOGICAL_AND, $3);} 160*4c52cad2SJung-uk Kim | Expression EXPOP_LOGICAL_OR Expression { $$ = DtDoOperator ($1, EXPOP_LOGICAL_OR, $3);} 161*4c52cad2SJung-uk Kim 162*4c52cad2SJung-uk Kim /* Parentheses: '(' Expression ')' */ 163*4c52cad2SJung-uk Kim 164*4c52cad2SJung-uk Kim | EXPOP_PAREN_OPEN Expression 165*4c52cad2SJung-uk Kim EXPOP_PAREN_CLOSE { $$ = $2;} 166*4c52cad2SJung-uk Kim 167*4c52cad2SJung-uk Kim /* #if defined (ID) or #if defined ID */ 168*4c52cad2SJung-uk Kim 169*4c52cad2SJung-uk Kim | EXPOP_DEFINE EXPOP_PAREN_OPEN EXPOP_IDENTIFIER 170*4c52cad2SJung-uk Kim EXPOP_PAREN_CLOSE { $$ = PrIsDefined (PrParserlval.str);} 171*4c52cad2SJung-uk Kim 172*4c52cad2SJung-uk Kim | EXPOP_DEFINE EXPOP_IDENTIFIER { $$ = PrIsDefined (PrParserlval.str);} 173*4c52cad2SJung-uk Kim 174*4c52cad2SJung-uk Kim | EXPOP_IDENTIFIER { $$ = PrResolveDefine (PrParserlval.str);} 175*4c52cad2SJung-uk Kim 176*4c52cad2SJung-uk Kim /* Default base for a non-prefixed integer is 10 */ 177*4c52cad2SJung-uk Kim 178*4c52cad2SJung-uk Kim | EXPOP_NUMBER { UtStrtoul64 (PrParsertext, 10, &$$);} 179*4c52cad2SJung-uk Kim 180*4c52cad2SJung-uk Kim /* Standard hex number (0x1234) */ 181*4c52cad2SJung-uk Kim 182*4c52cad2SJung-uk Kim | EXPOP_HEX_NUMBER { UtStrtoul64 (PrParsertext, 16, &$$);} 183*4c52cad2SJung-uk Kim ; 184*4c52cad2SJung-uk Kim %% 185*4c52cad2SJung-uk Kim 186*4c52cad2SJung-uk Kim /* 187*4c52cad2SJung-uk Kim * Local support functions, including parser entry point 188*4c52cad2SJung-uk Kim */ 189*4c52cad2SJung-uk Kim #define PR_FIRST_PARSE_OPCODE EXPOP_EOF 190*4c52cad2SJung-uk Kim #define PR_YYTNAME_START 3 191*4c52cad2SJung-uk Kim 192*4c52cad2SJung-uk Kim 193*4c52cad2SJung-uk Kim /****************************************************************************** 194*4c52cad2SJung-uk Kim * 195*4c52cad2SJung-uk Kim * FUNCTION: PrParsererror 196*4c52cad2SJung-uk Kim * 197*4c52cad2SJung-uk Kim * PARAMETERS: Message - Parser-generated error message 198*4c52cad2SJung-uk Kim * 199*4c52cad2SJung-uk Kim * RETURN: None 200*4c52cad2SJung-uk Kim * 201*4c52cad2SJung-uk Kim * DESCRIPTION: Handler for parser errors 202*4c52cad2SJung-uk Kim * 203*4c52cad2SJung-uk Kim *****************************************************************************/ 204*4c52cad2SJung-uk Kim 205*4c52cad2SJung-uk Kim void 206*4c52cad2SJung-uk Kim PrParsererror ( 207*4c52cad2SJung-uk Kim char const *Message) 208*4c52cad2SJung-uk Kim { 209*4c52cad2SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_SYNTAX, 210*4c52cad2SJung-uk Kim NULL, (char *) Message); 211*4c52cad2SJung-uk Kim } 212*4c52cad2SJung-uk Kim 213*4c52cad2SJung-uk Kim 214*4c52cad2SJung-uk Kim /****************************************************************************** 215*4c52cad2SJung-uk Kim * 216*4c52cad2SJung-uk Kim * FUNCTION: PrGetOpName 217*4c52cad2SJung-uk Kim * 218*4c52cad2SJung-uk Kim * PARAMETERS: ParseOpcode - Parser token (EXPOP_*) 219*4c52cad2SJung-uk Kim * 220*4c52cad2SJung-uk Kim * RETURN: Pointer to the opcode name 221*4c52cad2SJung-uk Kim * 222*4c52cad2SJung-uk Kim * DESCRIPTION: Get the ascii name of the parse opcode for debug output 223*4c52cad2SJung-uk Kim * 224*4c52cad2SJung-uk Kim *****************************************************************************/ 225*4c52cad2SJung-uk Kim 226*4c52cad2SJung-uk Kim char * 227*4c52cad2SJung-uk Kim PrGetOpName ( 228*4c52cad2SJung-uk Kim UINT32 ParseOpcode) 229*4c52cad2SJung-uk Kim { 230*4c52cad2SJung-uk Kim #ifdef ASL_YYTNAME_START 231*4c52cad2SJung-uk Kim /* 232*4c52cad2SJung-uk Kim * First entries (PR_YYTNAME_START) in yytname are special reserved names. 233*4c52cad2SJung-uk Kim * Ignore first 6 characters of name (EXPOP_) 234*4c52cad2SJung-uk Kim */ 235*4c52cad2SJung-uk Kim return ((char *) yytname 236*4c52cad2SJung-uk Kim [(ParseOpcode - PR_FIRST_PARSE_OPCODE) + PR_YYTNAME_START] + 6); 237*4c52cad2SJung-uk Kim #else 238*4c52cad2SJung-uk Kim return ("[Unknown parser generator]"); 239*4c52cad2SJung-uk Kim #endif 240*4c52cad2SJung-uk Kim } 241*4c52cad2SJung-uk Kim 242*4c52cad2SJung-uk Kim 243*4c52cad2SJung-uk Kim /****************************************************************************** 244*4c52cad2SJung-uk Kim * 245*4c52cad2SJung-uk Kim * FUNCTION: PrEvaluateExpression 246*4c52cad2SJung-uk Kim * 247*4c52cad2SJung-uk Kim * PARAMETERS: ExprString - Expression to be evaluated. Must be 248*4c52cad2SJung-uk Kim * terminated by either a newline or a NUL 249*4c52cad2SJung-uk Kim * string terminator 250*4c52cad2SJung-uk Kim * 251*4c52cad2SJung-uk Kim * RETURN: 64-bit value for the expression 252*4c52cad2SJung-uk Kim * 253*4c52cad2SJung-uk Kim * DESCRIPTION: Main entry point for the DT expression parser 254*4c52cad2SJung-uk Kim * 255*4c52cad2SJung-uk Kim *****************************************************************************/ 256*4c52cad2SJung-uk Kim 257*4c52cad2SJung-uk Kim UINT64 258*4c52cad2SJung-uk Kim PrEvaluateExpression ( 259*4c52cad2SJung-uk Kim char *ExprString) 260*4c52cad2SJung-uk Kim { 261*4c52cad2SJung-uk Kim 262*4c52cad2SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 263*4c52cad2SJung-uk Kim "**** Input expression: %s\n", ExprString); 264*4c52cad2SJung-uk Kim 265*4c52cad2SJung-uk Kim /* Point lexer to the input string */ 266*4c52cad2SJung-uk Kim 267*4c52cad2SJung-uk Kim if (PrInitLexer (ExprString)) 268*4c52cad2SJung-uk Kim { 269*4c52cad2SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, 270*4c52cad2SJung-uk Kim NULL, "Could not initialize lexer"); 271*4c52cad2SJung-uk Kim return (0); 272*4c52cad2SJung-uk Kim } 273*4c52cad2SJung-uk Kim 274*4c52cad2SJung-uk Kim /* Parse/Evaluate the input string (value returned in PrParserResult) */ 275*4c52cad2SJung-uk Kim 276*4c52cad2SJung-uk Kim PrParserparse (); 277*4c52cad2SJung-uk Kim PrTerminateLexer (); 278*4c52cad2SJung-uk Kim 279*4c52cad2SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 280*4c52cad2SJung-uk Kim "**** Parser returned value: %u (%8.8X%8.8X)\n", 281*4c52cad2SJung-uk Kim (UINT32) PrParserResult, ACPI_FORMAT_UINT64 (PrParserResult)); 282*4c52cad2SJung-uk Kim 283*4c52cad2SJung-uk Kim return (PrParserResult); 284*4c52cad2SJung-uk Kim } 285