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