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