14c52cad2SJung-uk Kim %{ 24c52cad2SJung-uk Kim /****************************************************************************** 34c52cad2SJung-uk Kim * 44c52cad2SJung-uk Kim * Module Name: prparser.y - Bison input file for preprocessor parser 54c52cad2SJung-uk Kim * 64c52cad2SJung-uk Kim *****************************************************************************/ 74c52cad2SJung-uk Kim 84c52cad2SJung-uk Kim /* 91c0e1b6dSJung-uk Kim * Copyright (C) 2000 - 2015, Intel Corp. 104c52cad2SJung-uk Kim * All rights reserved. 114c52cad2SJung-uk Kim * 124c52cad2SJung-uk Kim * Redistribution and use in source and binary forms, with or without 134c52cad2SJung-uk Kim * modification, are permitted provided that the following conditions 144c52cad2SJung-uk Kim * are met: 154c52cad2SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 164c52cad2SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 174c52cad2SJung-uk Kim * without modification. 184c52cad2SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 194c52cad2SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 204c52cad2SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 214c52cad2SJung-uk Kim * including a substantially similar Disclaimer requirement for further 224c52cad2SJung-uk Kim * binary redistribution. 234c52cad2SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 244c52cad2SJung-uk Kim * of any contributors may be used to endorse or promote products derived 254c52cad2SJung-uk Kim * from this software without specific prior written permission. 264c52cad2SJung-uk Kim * 274c52cad2SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 284c52cad2SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 294c52cad2SJung-uk Kim * Software Foundation. 304c52cad2SJung-uk Kim * 314c52cad2SJung-uk Kim * NO WARRANTY 324c52cad2SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 334c52cad2SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 344c52cad2SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 354c52cad2SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 364c52cad2SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 374c52cad2SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 384c52cad2SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 394c52cad2SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 404c52cad2SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 414c52cad2SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 424c52cad2SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 434c52cad2SJung-uk Kim */ 444c52cad2SJung-uk Kim 454c52cad2SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 464c52cad2SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h> 474c52cad2SJung-uk Kim 484c52cad2SJung-uk Kim #define _COMPONENT ASL_PREPROCESSOR 494c52cad2SJung-uk Kim ACPI_MODULE_NAME ("prparser") 504c52cad2SJung-uk Kim 515ef50723SJung-uk Kim void * AslLocalAllocate (unsigned int Size); 525ef50723SJung-uk Kim 535ef50723SJung-uk Kim /* Bison/yacc configuration */ 545ef50723SJung-uk Kim 555ef50723SJung-uk Kim #undef alloca 565ef50723SJung-uk Kim #define alloca AslLocalAllocate 575ef50723SJung-uk Kim 584c52cad2SJung-uk Kim int PrParserlex (void); 594c52cad2SJung-uk Kim int PrParserparse (void); 604c52cad2SJung-uk Kim void PrParsererror (char const *msg); 614c52cad2SJung-uk Kim extern char *PrParsertext; 624c52cad2SJung-uk Kim 634c52cad2SJung-uk Kim UINT64 PrParserResult; /* Expression return value */ 644c52cad2SJung-uk Kim 654c52cad2SJung-uk Kim /* Bison/yacc configuration */ 664c52cad2SJung-uk Kim 674c52cad2SJung-uk Kim #define yytname PrParsername 684c52cad2SJung-uk Kim #define YYDEBUG 1 /* Enable debug output */ 694c52cad2SJung-uk Kim #define YYERROR_VERBOSE 1 /* Verbose error messages */ 704c52cad2SJung-uk Kim #define YYFLAG -32768 714c52cad2SJung-uk Kim 724c52cad2SJung-uk Kim /* Define YYMALLOC/YYFREE to prevent redefinition errors */ 734c52cad2SJung-uk Kim 744c52cad2SJung-uk Kim #define YYMALLOC malloc 754c52cad2SJung-uk Kim #define YYFREE free 764c52cad2SJung-uk Kim %} 774c52cad2SJung-uk Kim 784c52cad2SJung-uk Kim %union 794c52cad2SJung-uk Kim { 804c52cad2SJung-uk Kim UINT64 value; 814c52cad2SJung-uk Kim UINT32 op; 824c52cad2SJung-uk Kim char *str; 834c52cad2SJung-uk Kim } 844c52cad2SJung-uk Kim 854c52cad2SJung-uk Kim /*! [Begin] no source code translation */ 864c52cad2SJung-uk Kim 874c52cad2SJung-uk Kim %type <value> Expression 884c52cad2SJung-uk Kim 894c52cad2SJung-uk Kim %token <op> EXPOP_EOF 904c52cad2SJung-uk Kim %token <op> EXPOP_NEW_LINE 914c52cad2SJung-uk Kim %token <op> EXPOP_NUMBER 924c52cad2SJung-uk Kim %token <op> EXPOP_HEX_NUMBER 934c52cad2SJung-uk Kim %token <op> EXPOP_RESERVED1 944c52cad2SJung-uk Kim %token <op> EXPOP_RESERVED2 954c52cad2SJung-uk Kim %token <op> EXPOP_PAREN_OPEN 964c52cad2SJung-uk Kim %token <op> EXPOP_PAREN_CLOSE 974c52cad2SJung-uk Kim 984c52cad2SJung-uk Kim %left <op> EXPOP_LOGICAL_OR 994c52cad2SJung-uk Kim %left <op> EXPOP_LOGICAL_AND 1004c52cad2SJung-uk Kim %left <op> EXPOP_OR 1014c52cad2SJung-uk Kim %left <op> EXPOP_XOR 1024c52cad2SJung-uk Kim %left <op> EXPOP_AND 1034c52cad2SJung-uk Kim %left <op> EXPOP_EQUAL EXPOP_NOT_EQUAL 1044c52cad2SJung-uk Kim %left <op> EXPOP_GREATER EXPOP_LESS EXPOP_GREATER_EQUAL EXPOP_LESS_EQUAL 1054c52cad2SJung-uk Kim %left <op> EXPOP_SHIFT_RIGHT EXPOP_SHIFT_LEFT 1064c52cad2SJung-uk Kim %left <op> EXPOP_ADD EXPOP_SUBTRACT 1074c52cad2SJung-uk Kim %left <op> EXPOP_MULTIPLY EXPOP_DIVIDE EXPOP_MODULO 1084c52cad2SJung-uk Kim %right <op> EXPOP_ONES_COMPLIMENT EXPOP_LOGICAL_NOT 1094c52cad2SJung-uk Kim 1104c52cad2SJung-uk Kim /* Tokens above must be kept in synch with dtparser.y */ 1114c52cad2SJung-uk Kim 1124c52cad2SJung-uk Kim %token <op> EXPOP_DEFINE 1134c52cad2SJung-uk Kim %token <op> EXPOP_IDENTIFIER 1144c52cad2SJung-uk Kim 1154c52cad2SJung-uk Kim %% 1164c52cad2SJung-uk Kim 1174c52cad2SJung-uk Kim /* 1184c52cad2SJung-uk Kim * Operator precedence rules (from K&R) 1194c52cad2SJung-uk Kim * 1204c52cad2SJung-uk Kim * 1) ( ) 1214c52cad2SJung-uk Kim * 2) ! ~ (unary operators that are supported here) 1224c52cad2SJung-uk Kim * 3) * / % 1234c52cad2SJung-uk Kim * 4) + - 1244c52cad2SJung-uk Kim * 5) >> << 1254c52cad2SJung-uk Kim * 6) < > <= >= 1264c52cad2SJung-uk Kim * 7) == != 1274c52cad2SJung-uk Kim * 8) & 1284c52cad2SJung-uk Kim * 9) ^ 1294c52cad2SJung-uk Kim * 10) | 1304c52cad2SJung-uk Kim * 11) && 1314c52cad2SJung-uk Kim * 12) || 1324c52cad2SJung-uk Kim */ 1334c52cad2SJung-uk Kim 1344c52cad2SJung-uk Kim /*! [End] no source code translation !*/ 1354c52cad2SJung-uk Kim 1364c52cad2SJung-uk Kim Value 1374c52cad2SJung-uk Kim : Expression EXPOP_NEW_LINE { PrParserResult=$1; return 0; } /* End of line (newline) */ 1384c52cad2SJung-uk Kim | Expression EXPOP_EOF { PrParserResult=$1; return 0; } /* End of string (0) */ 1394c52cad2SJung-uk Kim ; 1404c52cad2SJung-uk Kim 1414c52cad2SJung-uk Kim Expression 1424c52cad2SJung-uk Kim 1434c52cad2SJung-uk Kim /* Unary operators */ 1444c52cad2SJung-uk Kim 1454c52cad2SJung-uk Kim : EXPOP_LOGICAL_NOT Expression { $$ = DtDoOperator ($2, EXPOP_LOGICAL_NOT, $2);} 1464c52cad2SJung-uk Kim | EXPOP_ONES_COMPLIMENT Expression { $$ = DtDoOperator ($2, EXPOP_ONES_COMPLIMENT, $2);} 1474c52cad2SJung-uk Kim 1484c52cad2SJung-uk Kim /* Binary operators */ 1494c52cad2SJung-uk Kim 1504c52cad2SJung-uk Kim | Expression EXPOP_MULTIPLY Expression { $$ = DtDoOperator ($1, EXPOP_MULTIPLY, $3);} 1514c52cad2SJung-uk Kim | Expression EXPOP_DIVIDE Expression { $$ = DtDoOperator ($1, EXPOP_DIVIDE, $3);} 1524c52cad2SJung-uk Kim | Expression EXPOP_MODULO Expression { $$ = DtDoOperator ($1, EXPOP_MODULO, $3);} 1534c52cad2SJung-uk Kim | Expression EXPOP_ADD Expression { $$ = DtDoOperator ($1, EXPOP_ADD, $3);} 1544c52cad2SJung-uk Kim | Expression EXPOP_SUBTRACT Expression { $$ = DtDoOperator ($1, EXPOP_SUBTRACT, $3);} 1554c52cad2SJung-uk Kim | Expression EXPOP_SHIFT_RIGHT Expression { $$ = DtDoOperator ($1, EXPOP_SHIFT_RIGHT, $3);} 1564c52cad2SJung-uk Kim | Expression EXPOP_SHIFT_LEFT Expression { $$ = DtDoOperator ($1, EXPOP_SHIFT_LEFT, $3);} 1574c52cad2SJung-uk Kim | Expression EXPOP_GREATER Expression { $$ = DtDoOperator ($1, EXPOP_GREATER, $3);} 1584c52cad2SJung-uk Kim | Expression EXPOP_LESS Expression { $$ = DtDoOperator ($1, EXPOP_LESS, $3);} 1594c52cad2SJung-uk Kim | Expression EXPOP_GREATER_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_GREATER_EQUAL, $3);} 1604c52cad2SJung-uk Kim | Expression EXPOP_LESS_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_LESS_EQUAL, $3);} 1614c52cad2SJung-uk Kim | Expression EXPOP_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_EQUAL, $3);} 1624c52cad2SJung-uk Kim | Expression EXPOP_NOT_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_NOT_EQUAL, $3);} 1634c52cad2SJung-uk Kim | Expression EXPOP_AND Expression { $$ = DtDoOperator ($1, EXPOP_AND, $3);} 1644c52cad2SJung-uk Kim | Expression EXPOP_XOR Expression { $$ = DtDoOperator ($1, EXPOP_XOR, $3);} 1654c52cad2SJung-uk Kim | Expression EXPOP_OR Expression { $$ = DtDoOperator ($1, EXPOP_OR, $3);} 1664c52cad2SJung-uk Kim | Expression EXPOP_LOGICAL_AND Expression { $$ = DtDoOperator ($1, EXPOP_LOGICAL_AND, $3);} 1674c52cad2SJung-uk Kim | Expression EXPOP_LOGICAL_OR Expression { $$ = DtDoOperator ($1, EXPOP_LOGICAL_OR, $3);} 1684c52cad2SJung-uk Kim 1694c52cad2SJung-uk Kim /* Parentheses: '(' Expression ')' */ 1704c52cad2SJung-uk Kim 1714c52cad2SJung-uk Kim | EXPOP_PAREN_OPEN Expression 1724c52cad2SJung-uk Kim EXPOP_PAREN_CLOSE { $$ = $2;} 1734c52cad2SJung-uk Kim 1744c52cad2SJung-uk Kim /* #if defined (ID) or #if defined ID */ 1754c52cad2SJung-uk Kim 1764c52cad2SJung-uk Kim | EXPOP_DEFINE EXPOP_PAREN_OPEN EXPOP_IDENTIFIER 1774c52cad2SJung-uk Kim EXPOP_PAREN_CLOSE { $$ = PrIsDefined (PrParserlval.str);} 1784c52cad2SJung-uk Kim 1794c52cad2SJung-uk Kim | EXPOP_DEFINE EXPOP_IDENTIFIER { $$ = PrIsDefined (PrParserlval.str);} 1804c52cad2SJung-uk Kim 1814c52cad2SJung-uk Kim | EXPOP_IDENTIFIER { $$ = PrResolveDefine (PrParserlval.str);} 1824c52cad2SJung-uk Kim 1834c52cad2SJung-uk Kim /* Default base for a non-prefixed integer is 10 */ 1844c52cad2SJung-uk Kim 1855ef50723SJung-uk Kim | EXPOP_NUMBER { stroul64 (PrParsertext, 10, &$$);} 1864c52cad2SJung-uk Kim 1874c52cad2SJung-uk Kim /* Standard hex number (0x1234) */ 1884c52cad2SJung-uk Kim 1895ef50723SJung-uk Kim | EXPOP_HEX_NUMBER { stroul64 (PrParsertext, 16, &$$);} 1904c52cad2SJung-uk Kim ; 1914c52cad2SJung-uk Kim %% 1924c52cad2SJung-uk Kim 1934c52cad2SJung-uk Kim /* 1944c52cad2SJung-uk Kim * Local support functions, including parser entry point 1954c52cad2SJung-uk Kim */ 1964c52cad2SJung-uk Kim #define PR_FIRST_PARSE_OPCODE EXPOP_EOF 1974c52cad2SJung-uk Kim #define PR_YYTNAME_START 3 1984c52cad2SJung-uk Kim 1994c52cad2SJung-uk Kim 2004c52cad2SJung-uk Kim /****************************************************************************** 2014c52cad2SJung-uk Kim * 2024c52cad2SJung-uk Kim * FUNCTION: PrParsererror 2034c52cad2SJung-uk Kim * 2044c52cad2SJung-uk Kim * PARAMETERS: Message - Parser-generated error message 2054c52cad2SJung-uk Kim * 2064c52cad2SJung-uk Kim * RETURN: None 2074c52cad2SJung-uk Kim * 2084c52cad2SJung-uk Kim * DESCRIPTION: Handler for parser errors 2094c52cad2SJung-uk Kim * 2104c52cad2SJung-uk Kim *****************************************************************************/ 2114c52cad2SJung-uk Kim 2124c52cad2SJung-uk Kim void 2134c52cad2SJung-uk Kim PrParsererror ( 2144c52cad2SJung-uk Kim char const *Message) 2154c52cad2SJung-uk Kim { 216fe0f0bbbSJung-uk Kim 217fe0f0bbbSJung-uk Kim sprintf (StringBuffer, "Preprocessor Parser : %s (near line %u)", 218fe0f0bbbSJung-uk Kim Message, Gbl_CurrentLineNumber); 2194c52cad2SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_SYNTAX, 220fe0f0bbbSJung-uk Kim NULL, (char *) StringBuffer); 2214c52cad2SJung-uk Kim } 2224c52cad2SJung-uk Kim 2234c52cad2SJung-uk Kim 2244c52cad2SJung-uk Kim /****************************************************************************** 2254c52cad2SJung-uk Kim * 2264c52cad2SJung-uk Kim * FUNCTION: PrGetOpName 2274c52cad2SJung-uk Kim * 2284c52cad2SJung-uk Kim * PARAMETERS: ParseOpcode - Parser token (EXPOP_*) 2294c52cad2SJung-uk Kim * 2304c52cad2SJung-uk Kim * RETURN: Pointer to the opcode name 2314c52cad2SJung-uk Kim * 2324c52cad2SJung-uk Kim * DESCRIPTION: Get the ascii name of the parse opcode for debug output 2334c52cad2SJung-uk Kim * 2344c52cad2SJung-uk Kim *****************************************************************************/ 2354c52cad2SJung-uk Kim 2364c52cad2SJung-uk Kim char * 2374c52cad2SJung-uk Kim PrGetOpName ( 2384c52cad2SJung-uk Kim UINT32 ParseOpcode) 2394c52cad2SJung-uk Kim { 2404c52cad2SJung-uk Kim #ifdef ASL_YYTNAME_START 2414c52cad2SJung-uk Kim /* 2424c52cad2SJung-uk Kim * First entries (PR_YYTNAME_START) in yytname are special reserved names. 2434c52cad2SJung-uk Kim * Ignore first 6 characters of name (EXPOP_) 2444c52cad2SJung-uk Kim */ 2454c52cad2SJung-uk Kim return ((char *) yytname 2464c52cad2SJung-uk Kim [(ParseOpcode - PR_FIRST_PARSE_OPCODE) + PR_YYTNAME_START] + 6); 2474c52cad2SJung-uk Kim #else 2484c52cad2SJung-uk Kim return ("[Unknown parser generator]"); 2494c52cad2SJung-uk Kim #endif 2504c52cad2SJung-uk Kim } 2514c52cad2SJung-uk Kim 2524c52cad2SJung-uk Kim 2534c52cad2SJung-uk Kim /****************************************************************************** 2544c52cad2SJung-uk Kim * 2554c52cad2SJung-uk Kim * FUNCTION: PrEvaluateExpression 2564c52cad2SJung-uk Kim * 2574c52cad2SJung-uk Kim * PARAMETERS: ExprString - Expression to be evaluated. Must be 2584c52cad2SJung-uk Kim * terminated by either a newline or a NUL 2594c52cad2SJung-uk Kim * string terminator 2604c52cad2SJung-uk Kim * 2614c52cad2SJung-uk Kim * RETURN: 64-bit value for the expression 2624c52cad2SJung-uk Kim * 2634c52cad2SJung-uk Kim * DESCRIPTION: Main entry point for the DT expression parser 2644c52cad2SJung-uk Kim * 2654c52cad2SJung-uk Kim *****************************************************************************/ 2664c52cad2SJung-uk Kim 2674c52cad2SJung-uk Kim UINT64 2684c52cad2SJung-uk Kim PrEvaluateExpression ( 2694c52cad2SJung-uk Kim char *ExprString) 2704c52cad2SJung-uk Kim { 2714c52cad2SJung-uk Kim 2724c52cad2SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 2734c52cad2SJung-uk Kim "**** Input expression: %s\n", ExprString); 2744c52cad2SJung-uk Kim 2754c52cad2SJung-uk Kim /* Point lexer to the input string */ 2764c52cad2SJung-uk Kim 2774c52cad2SJung-uk Kim if (PrInitLexer (ExprString)) 2784c52cad2SJung-uk Kim { 2794c52cad2SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, 2804c52cad2SJung-uk Kim NULL, "Could not initialize lexer"); 2814c52cad2SJung-uk Kim return (0); 2824c52cad2SJung-uk Kim } 2834c52cad2SJung-uk Kim 2844c52cad2SJung-uk Kim /* Parse/Evaluate the input string (value returned in PrParserResult) */ 2854c52cad2SJung-uk Kim 2864c52cad2SJung-uk Kim PrParserparse (); 2874c52cad2SJung-uk Kim PrTerminateLexer (); 2884c52cad2SJung-uk Kim 2894c52cad2SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 2904c52cad2SJung-uk Kim "**** Parser returned value: %u (%8.8X%8.8X)\n", 2914c52cad2SJung-uk Kim (UINT32) PrParserResult, ACPI_FORMAT_UINT64 (PrParserResult)); 2924c52cad2SJung-uk Kim 2934c52cad2SJung-uk Kim return (PrParserResult); 2944c52cad2SJung-uk Kim } 295