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