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