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 /* 94c52cad2SJung-uk Kim * Copyright (C) 2000 - 2012, 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 514c52cad2SJung-uk Kim int PrParserlex (void); 524c52cad2SJung-uk Kim int PrParserparse (void); 534c52cad2SJung-uk Kim void PrParsererror (char const *msg); 544c52cad2SJung-uk Kim extern char *PrParsertext; 554c52cad2SJung-uk Kim 564c52cad2SJung-uk Kim UINT64 PrParserResult; /* Expression return value */ 574c52cad2SJung-uk Kim 584c52cad2SJung-uk Kim /* Bison/yacc configuration */ 594c52cad2SJung-uk Kim 604c52cad2SJung-uk Kim #define yytname PrParsername 614c52cad2SJung-uk Kim #define YYDEBUG 1 /* Enable debug output */ 624c52cad2SJung-uk Kim #define YYERROR_VERBOSE 1 /* Verbose error messages */ 634c52cad2SJung-uk Kim #define YYFLAG -32768 644c52cad2SJung-uk Kim 654c52cad2SJung-uk Kim /* Define YYMALLOC/YYFREE to prevent redefinition errors */ 664c52cad2SJung-uk Kim 674c52cad2SJung-uk Kim #define YYMALLOC malloc 684c52cad2SJung-uk Kim #define YYFREE free 694c52cad2SJung-uk Kim %} 704c52cad2SJung-uk Kim 714c52cad2SJung-uk Kim %union 724c52cad2SJung-uk Kim { 734c52cad2SJung-uk Kim UINT64 value; 744c52cad2SJung-uk Kim UINT32 op; 754c52cad2SJung-uk Kim char *str; 764c52cad2SJung-uk Kim } 774c52cad2SJung-uk Kim 784c52cad2SJung-uk Kim /*! [Begin] no source code translation */ 794c52cad2SJung-uk Kim 804c52cad2SJung-uk Kim %type <value> Expression 814c52cad2SJung-uk Kim 824c52cad2SJung-uk Kim %token <op> EXPOP_EOF 834c52cad2SJung-uk Kim %token <op> EXPOP_NEW_LINE 844c52cad2SJung-uk Kim %token <op> EXPOP_NUMBER 854c52cad2SJung-uk Kim %token <op> EXPOP_HEX_NUMBER 864c52cad2SJung-uk Kim %token <op> EXPOP_RESERVED1 874c52cad2SJung-uk Kim %token <op> EXPOP_RESERVED2 884c52cad2SJung-uk Kim %token <op> EXPOP_PAREN_OPEN 894c52cad2SJung-uk Kim %token <op> EXPOP_PAREN_CLOSE 904c52cad2SJung-uk Kim 914c52cad2SJung-uk Kim %left <op> EXPOP_LOGICAL_OR 924c52cad2SJung-uk Kim %left <op> EXPOP_LOGICAL_AND 934c52cad2SJung-uk Kim %left <op> EXPOP_OR 944c52cad2SJung-uk Kim %left <op> EXPOP_XOR 954c52cad2SJung-uk Kim %left <op> EXPOP_AND 964c52cad2SJung-uk Kim %left <op> EXPOP_EQUAL EXPOP_NOT_EQUAL 974c52cad2SJung-uk Kim %left <op> EXPOP_GREATER EXPOP_LESS EXPOP_GREATER_EQUAL EXPOP_LESS_EQUAL 984c52cad2SJung-uk Kim %left <op> EXPOP_SHIFT_RIGHT EXPOP_SHIFT_LEFT 994c52cad2SJung-uk Kim %left <op> EXPOP_ADD EXPOP_SUBTRACT 1004c52cad2SJung-uk Kim %left <op> EXPOP_MULTIPLY EXPOP_DIVIDE EXPOP_MODULO 1014c52cad2SJung-uk Kim %right <op> EXPOP_ONES_COMPLIMENT EXPOP_LOGICAL_NOT 1024c52cad2SJung-uk Kim 1034c52cad2SJung-uk Kim /* Tokens above must be kept in synch with dtparser.y */ 1044c52cad2SJung-uk Kim 1054c52cad2SJung-uk Kim %token <op> EXPOP_DEFINE 1064c52cad2SJung-uk Kim %token <op> EXPOP_IDENTIFIER 1074c52cad2SJung-uk Kim 1084c52cad2SJung-uk Kim %% 1094c52cad2SJung-uk Kim 1104c52cad2SJung-uk Kim /* 1114c52cad2SJung-uk Kim * Operator precedence rules (from K&R) 1124c52cad2SJung-uk Kim * 1134c52cad2SJung-uk Kim * 1) ( ) 1144c52cad2SJung-uk Kim * 2) ! ~ (unary operators that are supported here) 1154c52cad2SJung-uk Kim * 3) * / % 1164c52cad2SJung-uk Kim * 4) + - 1174c52cad2SJung-uk Kim * 5) >> << 1184c52cad2SJung-uk Kim * 6) < > <= >= 1194c52cad2SJung-uk Kim * 7) == != 1204c52cad2SJung-uk Kim * 8) & 1214c52cad2SJung-uk Kim * 9) ^ 1224c52cad2SJung-uk Kim * 10) | 1234c52cad2SJung-uk Kim * 11) && 1244c52cad2SJung-uk Kim * 12) || 1254c52cad2SJung-uk Kim */ 1264c52cad2SJung-uk Kim 1274c52cad2SJung-uk Kim /*! [End] no source code translation !*/ 1284c52cad2SJung-uk Kim 1294c52cad2SJung-uk Kim Value 1304c52cad2SJung-uk Kim : Expression EXPOP_NEW_LINE { PrParserResult=$1; return 0; } /* End of line (newline) */ 1314c52cad2SJung-uk Kim | Expression EXPOP_EOF { PrParserResult=$1; return 0; } /* End of string (0) */ 1324c52cad2SJung-uk Kim ; 1334c52cad2SJung-uk Kim 1344c52cad2SJung-uk Kim Expression 1354c52cad2SJung-uk Kim 1364c52cad2SJung-uk Kim /* Unary operators */ 1374c52cad2SJung-uk Kim 1384c52cad2SJung-uk Kim : EXPOP_LOGICAL_NOT Expression { $$ = DtDoOperator ($2, EXPOP_LOGICAL_NOT, $2);} 1394c52cad2SJung-uk Kim | EXPOP_ONES_COMPLIMENT Expression { $$ = DtDoOperator ($2, EXPOP_ONES_COMPLIMENT, $2);} 1404c52cad2SJung-uk Kim 1414c52cad2SJung-uk Kim /* Binary operators */ 1424c52cad2SJung-uk Kim 1434c52cad2SJung-uk Kim | Expression EXPOP_MULTIPLY Expression { $$ = DtDoOperator ($1, EXPOP_MULTIPLY, $3);} 1444c52cad2SJung-uk Kim | Expression EXPOP_DIVIDE Expression { $$ = DtDoOperator ($1, EXPOP_DIVIDE, $3);} 1454c52cad2SJung-uk Kim | Expression EXPOP_MODULO Expression { $$ = DtDoOperator ($1, EXPOP_MODULO, $3);} 1464c52cad2SJung-uk Kim | Expression EXPOP_ADD Expression { $$ = DtDoOperator ($1, EXPOP_ADD, $3);} 1474c52cad2SJung-uk Kim | Expression EXPOP_SUBTRACT Expression { $$ = DtDoOperator ($1, EXPOP_SUBTRACT, $3);} 1484c52cad2SJung-uk Kim | Expression EXPOP_SHIFT_RIGHT Expression { $$ = DtDoOperator ($1, EXPOP_SHIFT_RIGHT, $3);} 1494c52cad2SJung-uk Kim | Expression EXPOP_SHIFT_LEFT Expression { $$ = DtDoOperator ($1, EXPOP_SHIFT_LEFT, $3);} 1504c52cad2SJung-uk Kim | Expression EXPOP_GREATER Expression { $$ = DtDoOperator ($1, EXPOP_GREATER, $3);} 1514c52cad2SJung-uk Kim | Expression EXPOP_LESS Expression { $$ = DtDoOperator ($1, EXPOP_LESS, $3);} 1524c52cad2SJung-uk Kim | Expression EXPOP_GREATER_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_GREATER_EQUAL, $3);} 1534c52cad2SJung-uk Kim | Expression EXPOP_LESS_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_LESS_EQUAL, $3);} 1544c52cad2SJung-uk Kim | Expression EXPOP_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_EQUAL, $3);} 1554c52cad2SJung-uk Kim | Expression EXPOP_NOT_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_NOT_EQUAL, $3);} 1564c52cad2SJung-uk Kim | Expression EXPOP_AND Expression { $$ = DtDoOperator ($1, EXPOP_AND, $3);} 1574c52cad2SJung-uk Kim | Expression EXPOP_XOR Expression { $$ = DtDoOperator ($1, EXPOP_XOR, $3);} 1584c52cad2SJung-uk Kim | Expression EXPOP_OR Expression { $$ = DtDoOperator ($1, EXPOP_OR, $3);} 1594c52cad2SJung-uk Kim | Expression EXPOP_LOGICAL_AND Expression { $$ = DtDoOperator ($1, EXPOP_LOGICAL_AND, $3);} 1604c52cad2SJung-uk Kim | Expression EXPOP_LOGICAL_OR Expression { $$ = DtDoOperator ($1, EXPOP_LOGICAL_OR, $3);} 1614c52cad2SJung-uk Kim 1624c52cad2SJung-uk Kim /* Parentheses: '(' Expression ')' */ 1634c52cad2SJung-uk Kim 1644c52cad2SJung-uk Kim | EXPOP_PAREN_OPEN Expression 1654c52cad2SJung-uk Kim EXPOP_PAREN_CLOSE { $$ = $2;} 1664c52cad2SJung-uk Kim 1674c52cad2SJung-uk Kim /* #if defined (ID) or #if defined ID */ 1684c52cad2SJung-uk Kim 1694c52cad2SJung-uk Kim | EXPOP_DEFINE EXPOP_PAREN_OPEN EXPOP_IDENTIFIER 1704c52cad2SJung-uk Kim EXPOP_PAREN_CLOSE { $$ = PrIsDefined (PrParserlval.str);} 1714c52cad2SJung-uk Kim 1724c52cad2SJung-uk Kim | EXPOP_DEFINE EXPOP_IDENTIFIER { $$ = PrIsDefined (PrParserlval.str);} 1734c52cad2SJung-uk Kim 1744c52cad2SJung-uk Kim | EXPOP_IDENTIFIER { $$ = PrResolveDefine (PrParserlval.str);} 1754c52cad2SJung-uk Kim 1764c52cad2SJung-uk Kim /* Default base for a non-prefixed integer is 10 */ 1774c52cad2SJung-uk Kim 1784c52cad2SJung-uk Kim | EXPOP_NUMBER { UtStrtoul64 (PrParsertext, 10, &$$);} 1794c52cad2SJung-uk Kim 1804c52cad2SJung-uk Kim /* Standard hex number (0x1234) */ 1814c52cad2SJung-uk Kim 1824c52cad2SJung-uk Kim | EXPOP_HEX_NUMBER { UtStrtoul64 (PrParsertext, 16, &$$);} 1834c52cad2SJung-uk Kim ; 1844c52cad2SJung-uk Kim %% 1854c52cad2SJung-uk Kim 1864c52cad2SJung-uk Kim /* 1874c52cad2SJung-uk Kim * Local support functions, including parser entry point 1884c52cad2SJung-uk Kim */ 1894c52cad2SJung-uk Kim #define PR_FIRST_PARSE_OPCODE EXPOP_EOF 1904c52cad2SJung-uk Kim #define PR_YYTNAME_START 3 1914c52cad2SJung-uk Kim 1924c52cad2SJung-uk Kim 1934c52cad2SJung-uk Kim /****************************************************************************** 1944c52cad2SJung-uk Kim * 1954c52cad2SJung-uk Kim * FUNCTION: PrParsererror 1964c52cad2SJung-uk Kim * 1974c52cad2SJung-uk Kim * PARAMETERS: Message - Parser-generated error message 1984c52cad2SJung-uk Kim * 1994c52cad2SJung-uk Kim * RETURN: None 2004c52cad2SJung-uk Kim * 2014c52cad2SJung-uk Kim * DESCRIPTION: Handler for parser errors 2024c52cad2SJung-uk Kim * 2034c52cad2SJung-uk Kim *****************************************************************************/ 2044c52cad2SJung-uk Kim 2054c52cad2SJung-uk Kim void 2064c52cad2SJung-uk Kim PrParsererror ( 2074c52cad2SJung-uk Kim char const *Message) 2084c52cad2SJung-uk Kim { 2094c52cad2SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_SYNTAX, 2104c52cad2SJung-uk Kim NULL, (char *) Message); 2114c52cad2SJung-uk Kim } 2124c52cad2SJung-uk Kim 2134c52cad2SJung-uk Kim 2144c52cad2SJung-uk Kim /****************************************************************************** 2154c52cad2SJung-uk Kim * 2164c52cad2SJung-uk Kim * FUNCTION: PrGetOpName 2174c52cad2SJung-uk Kim * 2184c52cad2SJung-uk Kim * PARAMETERS: ParseOpcode - Parser token (EXPOP_*) 2194c52cad2SJung-uk Kim * 2204c52cad2SJung-uk Kim * RETURN: Pointer to the opcode name 2214c52cad2SJung-uk Kim * 2224c52cad2SJung-uk Kim * DESCRIPTION: Get the ascii name of the parse opcode for debug output 2234c52cad2SJung-uk Kim * 2244c52cad2SJung-uk Kim *****************************************************************************/ 2254c52cad2SJung-uk Kim 2264c52cad2SJung-uk Kim char * 2274c52cad2SJung-uk Kim PrGetOpName ( 2284c52cad2SJung-uk Kim UINT32 ParseOpcode) 2294c52cad2SJung-uk Kim { 2304c52cad2SJung-uk Kim #ifdef ASL_YYTNAME_START 2314c52cad2SJung-uk Kim /* 2324c52cad2SJung-uk Kim * First entries (PR_YYTNAME_START) in yytname are special reserved names. 2334c52cad2SJung-uk Kim * Ignore first 6 characters of name (EXPOP_) 2344c52cad2SJung-uk Kim */ 2354c52cad2SJung-uk Kim return ((char *) yytname 2364c52cad2SJung-uk Kim [(ParseOpcode - PR_FIRST_PARSE_OPCODE) + PR_YYTNAME_START] + 6); 2374c52cad2SJung-uk Kim #else 2384c52cad2SJung-uk Kim return ("[Unknown parser generator]"); 2394c52cad2SJung-uk Kim #endif 2404c52cad2SJung-uk Kim } 2414c52cad2SJung-uk Kim 2424c52cad2SJung-uk Kim 2434c52cad2SJung-uk Kim /****************************************************************************** 2444c52cad2SJung-uk Kim * 2454c52cad2SJung-uk Kim * FUNCTION: PrEvaluateExpression 2464c52cad2SJung-uk Kim * 2474c52cad2SJung-uk Kim * PARAMETERS: ExprString - Expression to be evaluated. Must be 2484c52cad2SJung-uk Kim * terminated by either a newline or a NUL 2494c52cad2SJung-uk Kim * string terminator 2504c52cad2SJung-uk Kim * 2514c52cad2SJung-uk Kim * RETURN: 64-bit value for the expression 2524c52cad2SJung-uk Kim * 2534c52cad2SJung-uk Kim * DESCRIPTION: Main entry point for the DT expression parser 2544c52cad2SJung-uk Kim * 2554c52cad2SJung-uk Kim *****************************************************************************/ 2564c52cad2SJung-uk Kim 2574c52cad2SJung-uk Kim UINT64 2584c52cad2SJung-uk Kim PrEvaluateExpression ( 2594c52cad2SJung-uk Kim char *ExprString) 2604c52cad2SJung-uk Kim { 2614c52cad2SJung-uk Kim 2624c52cad2SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 2634c52cad2SJung-uk Kim "**** Input expression: %s\n", ExprString); 2644c52cad2SJung-uk Kim 2654c52cad2SJung-uk Kim /* Point lexer to the input string */ 2664c52cad2SJung-uk Kim 2674c52cad2SJung-uk Kim if (PrInitLexer (ExprString)) 2684c52cad2SJung-uk Kim { 2694c52cad2SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, 2704c52cad2SJung-uk Kim NULL, "Could not initialize lexer"); 2714c52cad2SJung-uk Kim return (0); 2724c52cad2SJung-uk Kim } 2734c52cad2SJung-uk Kim 2744c52cad2SJung-uk Kim /* Parse/Evaluate the input string (value returned in PrParserResult) */ 2754c52cad2SJung-uk Kim 2764c52cad2SJung-uk Kim PrParserparse (); 2774c52cad2SJung-uk Kim PrTerminateLexer (); 2784c52cad2SJung-uk Kim 2794c52cad2SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 2804c52cad2SJung-uk Kim "**** Parser returned value: %u (%8.8X%8.8X)\n", 2814c52cad2SJung-uk Kim (UINT32) PrParserResult, ACPI_FORMAT_UINT64 (PrParserResult)); 2824c52cad2SJung-uk Kim 2834c52cad2SJung-uk Kim return (PrParserResult); 2844c52cad2SJung-uk Kim } 285