prparser.y revision 245582
155682Smarkm%{ 2233294Sstas/****************************************************************************** 3233294Sstas * 4233294Sstas * Module Name: prparser.y - Bison input file for preprocessor parser 555682Smarkm * 6233294Sstas *****************************************************************************/ 7233294Sstas 8233294Sstas/* 955682Smarkm * Copyright (C) 2000 - 2013, Intel Corp. 10233294Sstas * All rights reserved. 11233294Sstas * 1255682Smarkm * Redistribution and use in source and binary forms, with or without 13233294Sstas * modification, are permitted provided that the following conditions 14233294Sstas * are met: 15233294Sstas * 1. Redistributions of source code must retain the above copyright 1655682Smarkm * notice, this list of conditions, and the following disclaimer, 17233294Sstas * without modification. 18233294Sstas * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19233294Sstas * substantially similar to the "NO WARRANTY" disclaimer below 2055682Smarkm * ("Disclaimer") and any redistribution must be conditioned upon 21233294Sstas * including a substantially similar Disclaimer requirement for further 22233294Sstas * binary redistribution. 23233294Sstas * 3. Neither the names of the above-listed copyright holders nor the names 24233294Sstas * of any contributors may be used to endorse or promote products derived 25233294Sstas * from this software without specific prior written permission. 26233294Sstas * 27233294Sstas * Alternatively, this software may be distributed under the terms of the 28233294Sstas * GNU General Public License ("GPL") version 2 as published by the Free 29233294Sstas * Software Foundation. 30233294Sstas * 31233294Sstas * NO WARRANTY 3255682Smarkm * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3355682Smarkm * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3455682Smarkm * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35178825Sdfr * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36233294Sstas * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3755682Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3878527Sassar * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3978527Sassar * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40178825Sdfr * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41178825Sdfr * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 4278527Sassar * POSSIBILITY OF SUCH DAMAGES. 43178825Sdfr */ 44178825Sdfr 45178825Sdfr#include <contrib/dev/acpica/compiler/aslcompiler.h> 46178825Sdfr#include <contrib/dev/acpica/compiler/dtcompiler.h> 4755682Smarkm 4855682Smarkm#define _COMPONENT ASL_PREPROCESSOR 49102644Snectar ACPI_MODULE_NAME ("prparser") 5055682Smarkm 5155682Smarkmint PrParserlex (void); 5255682Smarkmint PrParserparse (void); 53102644Snectarvoid PrParsererror (char const *msg); 5457416Smarkmextern char *PrParsertext; 55102644Snectar 5655682SmarkmUINT64 PrParserResult; /* Expression return value */ 5755682Smarkm 58102644Snectar/* Bison/yacc configuration */ 5955682Smarkm 6055682Smarkm#define yytname PrParsername 6155682Smarkm#define YYDEBUG 1 /* Enable debug output */ 6255682Smarkm#define YYERROR_VERBOSE 1 /* Verbose error messages */ 6355682Smarkm#define YYFLAG -32768 6455682Smarkm 6555682Smarkm/* Define YYMALLOC/YYFREE to prevent redefinition errors */ 6655682Smarkm 6790926Snectar#define YYMALLOC malloc 6855682Smarkm#define YYFREE free 69102644Snectar%} 7055682Smarkm 7155682Smarkm%union 7255682Smarkm{ 7390926Snectar UINT64 value; 7490926Snectar UINT32 op; 7555682Smarkm char *str; 7655682Smarkm} 7755682Smarkm 7855682Smarkm/*! [Begin] no source code translation */ 7955682Smarkm 8078527Sassar%type <value> Expression 8178527Sassar 8278527Sassar%token <op> EXPOP_EOF 8378527Sassar%token <op> EXPOP_NEW_LINE 8455682Smarkm%token <op> EXPOP_NUMBER 8555682Smarkm%token <op> EXPOP_HEX_NUMBER 8655682Smarkm%token <op> EXPOP_RESERVED1 8755682Smarkm%token <op> EXPOP_RESERVED2 8855682Smarkm%token <op> EXPOP_PAREN_OPEN 8955682Smarkm%token <op> EXPOP_PAREN_CLOSE 9055682Smarkm 9155682Smarkm%left <op> EXPOP_LOGICAL_OR 9255682Smarkm%left <op> EXPOP_LOGICAL_AND 9355682Smarkm%left <op> EXPOP_OR 9490926Snectar%left <op> EXPOP_XOR 95120945Snectar%left <op> EXPOP_AND 9678527Sassar%left <op> EXPOP_EQUAL EXPOP_NOT_EQUAL 9778527Sassar%left <op> EXPOP_GREATER EXPOP_LESS EXPOP_GREATER_EQUAL EXPOP_LESS_EQUAL 9890926Snectar%left <op> EXPOP_SHIFT_RIGHT EXPOP_SHIFT_LEFT 9955682Smarkm%left <op> EXPOP_ADD EXPOP_SUBTRACT 10055682Smarkm%left <op> EXPOP_MULTIPLY EXPOP_DIVIDE EXPOP_MODULO 10155682Smarkm%right <op> EXPOP_ONES_COMPLIMENT EXPOP_LOGICAL_NOT 10255682Smarkm 10355682Smarkm/* Tokens above must be kept in synch with dtparser.y */ 10455682Smarkm 10555682Smarkm%token <op> EXPOP_DEFINE 10655682Smarkm%token <op> EXPOP_IDENTIFIER 10790926Snectar 10855682Smarkm%% 10990926Snectar 110233294Sstas/* 11190926Snectar * Operator precedence rules (from K&R) 11290926Snectar * 11355682Smarkm * 1) ( ) 11455682Smarkm * 2) ! ~ (unary operators that are supported here) 11555682Smarkm * 3) * / % 11655682Smarkm * 4) + - 117120945Snectar * 5) >> << 118120945Snectar * 6) < > <= >= 11955682Smarkm * 7) == != 120120945Snectar * 8) & 121120945Snectar * 9) ^ 122120945Snectar * 10) | 123120945Snectar * 11) && 124120945Snectar * 12) || 125120945Snectar */ 126233294Sstas 127120945Snectar/*! [End] no source code translation !*/ 128120945Snectar 129120945SnectarValue 13055682Smarkm : Expression EXPOP_NEW_LINE { PrParserResult=$1; return 0; } /* End of line (newline) */ 131120945Snectar | Expression EXPOP_EOF { PrParserResult=$1; return 0; } /* End of string (0) */ 13255682Smarkm ; 13355682Smarkm 13455682SmarkmExpression 13555682Smarkm 13655682Smarkm /* Unary operators */ 13755682Smarkm 138120945Snectar : EXPOP_LOGICAL_NOT Expression { $$ = DtDoOperator ($2, EXPOP_LOGICAL_NOT, $2);} 139120945Snectar | EXPOP_ONES_COMPLIMENT Expression { $$ = DtDoOperator ($2, EXPOP_ONES_COMPLIMENT, $2);} 140120945Snectar 14155682Smarkm /* Binary operators */ 14255682Smarkm 143233294Sstas | Expression EXPOP_MULTIPLY Expression { $$ = DtDoOperator ($1, EXPOP_MULTIPLY, $3);} 144120945Snectar | Expression EXPOP_DIVIDE Expression { $$ = DtDoOperator ($1, EXPOP_DIVIDE, $3);} 145120945Snectar | Expression EXPOP_MODULO Expression { $$ = DtDoOperator ($1, EXPOP_MODULO, $3);} 146120945Snectar | Expression EXPOP_ADD Expression { $$ = DtDoOperator ($1, EXPOP_ADD, $3);} 147120945Snectar | Expression EXPOP_SUBTRACT Expression { $$ = DtDoOperator ($1, EXPOP_SUBTRACT, $3);} 14855682Smarkm | Expression EXPOP_SHIFT_RIGHT Expression { $$ = DtDoOperator ($1, EXPOP_SHIFT_RIGHT, $3);} 14990926Snectar | Expression EXPOP_SHIFT_LEFT Expression { $$ = DtDoOperator ($1, EXPOP_SHIFT_LEFT, $3);} 15055682Smarkm | Expression EXPOP_GREATER Expression { $$ = DtDoOperator ($1, EXPOP_GREATER, $3);} 151120945Snectar | Expression EXPOP_LESS Expression { $$ = DtDoOperator ($1, EXPOP_LESS, $3);} 15290926Snectar | Expression EXPOP_GREATER_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_GREATER_EQUAL, $3);} 15355682Smarkm | Expression EXPOP_LESS_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_LESS_EQUAL, $3);} 15455682Smarkm | Expression EXPOP_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_EQUAL, $3);} 15555682Smarkm | Expression EXPOP_NOT_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_NOT_EQUAL, $3);} 156233294Sstas | Expression EXPOP_AND Expression { $$ = DtDoOperator ($1, EXPOP_AND, $3);} 15755682Smarkm | Expression EXPOP_XOR Expression { $$ = DtDoOperator ($1, EXPOP_XOR, $3);} 15855682Smarkm | Expression EXPOP_OR Expression { $$ = DtDoOperator ($1, EXPOP_OR, $3);} 15955682Smarkm | Expression EXPOP_LOGICAL_AND Expression { $$ = DtDoOperator ($1, EXPOP_LOGICAL_AND, $3);} 16055682Smarkm | Expression EXPOP_LOGICAL_OR Expression { $$ = DtDoOperator ($1, EXPOP_LOGICAL_OR, $3);} 16155682Smarkm 16255682Smarkm /* Parentheses: '(' Expression ')' */ 16355682Smarkm 16455682Smarkm | EXPOP_PAREN_OPEN Expression 165233294Sstas EXPOP_PAREN_CLOSE { $$ = $2;} 16655682Smarkm 16755682Smarkm /* #if defined (ID) or #if defined ID */ 16855682Smarkm 16955682Smarkm | EXPOP_DEFINE EXPOP_PAREN_OPEN EXPOP_IDENTIFIER 17055682Smarkm EXPOP_PAREN_CLOSE { $$ = PrIsDefined (PrParserlval.str);} 17155682Smarkm 17255682Smarkm | EXPOP_DEFINE EXPOP_IDENTIFIER { $$ = PrIsDefined (PrParserlval.str);} 17355682Smarkm 174233294Sstas | EXPOP_IDENTIFIER { $$ = PrResolveDefine (PrParserlval.str);} 175233294Sstas 17655682Smarkm /* Default base for a non-prefixed integer is 10 */ 17755682Smarkm 17855682Smarkm | EXPOP_NUMBER { UtStrtoul64 (PrParsertext, 10, &$$);} 17955682Smarkm 180233294Sstas /* Standard hex number (0x1234) */ 18155682Smarkm 18272445Sassar | EXPOP_HEX_NUMBER { UtStrtoul64 (PrParsertext, 16, &$$);} 183120945Snectar ; 184120945Snectar%% 185120945Snectar 18655682Smarkm/* 18755682Smarkm * Local support functions, including parser entry point 18855682Smarkm */ 18955682Smarkm#define PR_FIRST_PARSE_OPCODE EXPOP_EOF 19055682Smarkm#define PR_YYTNAME_START 3 19155682Smarkm 19255682Smarkm 19355682Smarkm/****************************************************************************** 19455682Smarkm * 19555682Smarkm * FUNCTION: PrParsererror 196178825Sdfr * 19755682Smarkm * PARAMETERS: Message - Parser-generated error message 19855682Smarkm * 19955682Smarkm * RETURN: None 200178825Sdfr * 201233294Sstas * DESCRIPTION: Handler for parser errors 202233294Sstas * 203178825Sdfr *****************************************************************************/ 204178825Sdfr 20555682Smarkmvoid 20655682SmarkmPrParsererror ( 20755682Smarkm char const *Message) 20855682Smarkm{ 20955682Smarkm DtError (ASL_ERROR, ASL_MSG_SYNTAX, 21055682Smarkm NULL, (char *) Message); 211178825Sdfr} 212233294Sstas 213178825Sdfr 214178825Sdfr/****************************************************************************** 21555682Smarkm * 21655682Smarkm * FUNCTION: PrGetOpName 21755682Smarkm * 21855682Smarkm * PARAMETERS: ParseOpcode - Parser token (EXPOP_*) 21955682Smarkm * 22055682Smarkm * RETURN: Pointer to the opcode name 22155682Smarkm * 22255682Smarkm * DESCRIPTION: Get the ascii name of the parse opcode for debug output 22355682Smarkm * 224103423Snectar *****************************************************************************/ 225103423Snectar 226103423Snectarchar * 227103423SnectarPrGetOpName ( 228103423Snectar UINT32 ParseOpcode) 229103423Snectar{ 230103423Snectar#ifdef ASL_YYTNAME_START 231103423Snectar /* 232103423Snectar * First entries (PR_YYTNAME_START) in yytname are special reserved names. 233103423Snectar * Ignore first 6 characters of name (EXPOP_) 234103423Snectar */ 235103423Snectar return ((char *) yytname 236103423Snectar [(ParseOpcode - PR_FIRST_PARSE_OPCODE) + PR_YYTNAME_START] + 6); 237103423Snectar#else 238103423Snectar return ("[Unknown parser generator]"); 239103423Snectar#endif 240103423Snectar} 241103423Snectar 24255682Smarkm 24355682Smarkm/****************************************************************************** 24455682Smarkm * 24555682Smarkm * FUNCTION: PrEvaluateExpression 246120945Snectar * 247120945Snectar * PARAMETERS: ExprString - Expression to be evaluated. Must be 248120945Snectar * terminated by either a newline or a NUL 24955682Smarkm * string terminator 250178825Sdfr * 25155682Smarkm * RETURN: 64-bit value for the expression 25255682Smarkm * 25355682Smarkm * DESCRIPTION: Main entry point for the DT expression parser 25455682Smarkm * 25555682Smarkm *****************************************************************************/ 256178825Sdfr 25755682SmarkmUINT64 25855682SmarkmPrEvaluateExpression ( 25955682Smarkm char *ExprString) 26055682Smarkm{ 261233294Sstas 26255682Smarkm DbgPrint (ASL_DEBUG_OUTPUT, 263233294Sstas "**** Input expression: %s\n", ExprString); 26455682Smarkm 26555682Smarkm /* Point lexer to the input string */ 26655682Smarkm 267233294Sstas if (PrInitLexer (ExprString)) 26855682Smarkm { 26955682Smarkm DtError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, 27055682Smarkm NULL, "Could not initialize lexer"); 27155682Smarkm return (0); 27255682Smarkm } 27355682Smarkm 27455682Smarkm /* Parse/Evaluate the input string (value returned in PrParserResult) */ 27555682Smarkm 27655682Smarkm PrParserparse (); 277103423Snectar PrTerminateLexer (); 278103423Snectar 279103423Snectar DbgPrint (ASL_DEBUG_OUTPUT, 280103423Snectar "**** Parser returned value: %u (%8.8X%8.8X)\n", 281103423Snectar (UINT32) PrParserResult, ACPI_FORMAT_UINT64 (PrParserResult)); 282103423Snectar 283103423Snectar return (PrParserResult); 284103423Snectar} 285103423Snectar