Home | History | Annotate | Line # | Download | only in compiler
dtcompilerparser.l revision 1.1.1.3.6.1
      1          1.1  christos %{
      2          1.1  christos /******************************************************************************
      3          1.1  christos  *
      4          1.1  christos  * Module Name: dtcompilerparser.l - Flex input file for table compiler lexer
      5          1.1  christos  *
      6          1.1  christos  *****************************************************************************/
      7          1.1  christos 
      8          1.1  christos /*
      9  1.1.1.3.6.1   thorpej  * Copyright (C) 2000 - 2021, Intel Corp.
     10          1.1  christos  * All rights reserved.
     11          1.1  christos  *
     12          1.1  christos  * Redistribution and use in source and binary forms, with or without
     13          1.1  christos  * modification, are permitted provided that the following conditions
     14          1.1  christos  * are met:
     15          1.1  christos  * 1. Redistributions of source code must retain the above copyright
     16          1.1  christos  *    notice, this list of conditions, and the following disclaimer,
     17          1.1  christos  *    without modification.
     18          1.1  christos  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     19          1.1  christos  *    substantially similar to the "NO WARRANTY" disclaimer below
     20          1.1  christos  *    ("Disclaimer") and any redistribution must be conditioned upon
     21          1.1  christos  *    including a substantially similar Disclaimer requirement for further
     22          1.1  christos  *    binary redistribution.
     23          1.1  christos  * 3. Neither the names of the above-listed copyright holders nor the names
     24          1.1  christos  *    of any contributors may be used to endorse or promote products derived
     25          1.1  christos  *    from this software without specific prior written permission.
     26          1.1  christos  *
     27          1.1  christos  * Alternatively, this software may be distributed under the terms of the
     28          1.1  christos  * GNU General Public License ("GPL") version 2 as published by the Free
     29          1.1  christos  * Software Foundation.
     30          1.1  christos  *
     31          1.1  christos  * NO WARRANTY
     32          1.1  christos  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     33          1.1  christos  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     34  1.1.1.3.6.1   thorpej  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     35          1.1  christos  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     36          1.1  christos  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     37          1.1  christos  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     38          1.1  christos  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     39          1.1  christos  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     40          1.1  christos  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     41          1.1  christos  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     42          1.1  christos  * POSSIBILITY OF SUCH DAMAGES.
     43          1.1  christos  */
     44          1.1  christos 
     45          1.1  christos #include "aslcompiler.h"
     46          1.1  christos #include "dtcompilerparser.y.h"
     47          1.1  christos 
     48          1.1  christos 
     49          1.1  christos #define _COMPONENT          ACPI_COMPILER
     50          1.1  christos         ACPI_MODULE_NAME    ("dtcompilerscanner")
     51          1.1  christos 
     52          1.1  christos /* handle locations */
     53          1.1  christos 
     54          1.1  christos int DtCompilerParsercolumn = 1;
     55      1.1.1.2  christos int DtLabelByteOffset = 0;
     56          1.1  christos int DtCompilerParserByteOffset = 0;
     57          1.1  christos 
     58      1.1.1.2  christos UINT32 DtTokenFirstLine = 0;
     59      1.1.1.2  christos UINT32 DtTokenFirstColumn = 0;
     60      1.1.1.2  christos 
     61          1.1  christos #define YY_USER_ACTION \
     62      1.1.1.2  christos             DtTokenFirstLine = DtCompilerParserlineno; \
     63      1.1.1.2  christos             DtTokenFirstColumn = DtCompilerParsercolumn; \
     64          1.1  christos             DtCompilerParsercolumn += DtCompilerParserleng; \
     65          1.1  christos             DtCompilerParserByteOffset += DtCompilerParserleng; \
     66          1.1  christos             DbgPrint (ASL_PARSE_OUTPUT,\
     67      1.1.1.2  christos                 "user action occurred. DtCompilerParserlloc.first_line: %u\n",\
     68      1.1.1.2  christos                 DtTokenFirstLine);
     69          1.1  christos %}
     70          1.1  christos 
     71          1.1  christos %option nounput noinput yylineno
     72          1.1  christos 
     73          1.1  christos     /* Indicates a state used for parsing multiline C comments */
     74          1.1  christos %x ML_COMMENT
     75          1.1  christos %x DATA_STATE
     76          1.1  christos 
     77          1.1  christos WhiteSpace      [ \t\v\r]+
     78          1.1  christos NewLines        [\n]+
     79          1.1  christos 
     80          1.1  christos     /* Avoid ", \n, and [] as a part of label name. These are not valid characters of a label name */
     81          1.1  christos LabelName       [^ ":\n\[\]]([^":\n\[\]]*[^" :\n\[\]])?
     82          1.1  christos 
     83          1.1  christos     /* Avoid ", \n, \\, and [] as a part of data. These are not valid characters of data */
     84          1.1  christos Data            [^ \\":\n\[\]]([^":\n\[\]\\]*[^" :\n\[\]\\])?
     85          1.1  christos 
     86          1.1  christos Text            [^ ":\n][^":\n]*
     87          1.1  christos Comment         \[[^\n\[\]]*\]
     88          1.1  christos CommentField    {LabelName}{WhiteSpace}*:{WhiteSpace}{Comment}?$
     89          1.1  christos 
     90          1.1  christos 
     91          1.1  christos %%
     92          1.1  christos 
     93          1.1  christos <DATA_STATE>{WhiteSpace}"\\\n" {
     94          1.1  christos         DbgPrint(ASL_PARSE_OUTPUT,"Continuation matched\n");
     95          1.1  christos         return (DT_PARSEOP_LINE_CONTINUATION);
     96          1.1  christos     }
     97          1.1  christos 
     98          1.1  christos ":" {
     99          1.1  christos         DbgPrint(ASL_PARSE_OUTPUT, ": Matched\n");
    100          1.1  christos         BEGIN (DATA_STATE);
    101          1.1  christos         return (':');
    102          1.1  christos     }
    103          1.1  christos 
    104          1.1  christos <INITIAL,DATA_STATE>{WhiteSpace} { DbgPrint(ASL_PARSE_OUTPUT,"Whitespace matched\n"); }
    105          1.1  christos 
    106          1.1  christos <INITIAL,DATA_STATE>{Comment}    { DbgPrint(ASL_PARSE_OUTPUT,"Comment matched\n"); }
    107          1.1  christos 
    108          1.1  christos "/*"                     { BEGIN (ML_COMMENT); }
    109          1.1  christos <ML_COMMENT>"*/"         { BEGIN (INITIAL); }
    110          1.1  christos <ML_COMMENT>"*/\n"       { BEGIN (INITIAL); }
    111          1.1  christos <ML_COMMENT>([^*]|\n)+|. /* Ignore */
    112          1.1  christos "//".*                   /* Ignore */
    113          1.1  christos 
    114          1.1  christos 
    115          1.1  christos <DATA_STATE>{Data} {
    116          1.1  christos       char *s;
    117          1.1  christos       int size = strlen (DtCompilerParsertext);
    118          1.1  christos       s=UtLocalCacheCalloc (size + 1);
    119          1.1  christos       AcpiUtSafeStrncpy (s, DtCompilerParsertext, size + 1);
    120          1.1  christos       DtCompilerParserlval.s = s;
    121          1.1  christos       DbgPrint (ASL_PARSE_OUTPUT, "Data: %s\n", s);
    122          1.1  christos       return (DT_PARSEOP_DATA);
    123          1.1  christos }
    124          1.1  christos 
    125          1.1  christos {CommentField}  /* ignore */
    126          1.1  christos 
    127          1.1  christos {LabelName} {
    128          1.1  christos     char *s;
    129          1.1  christos     int size = strlen (DtCompilerParsertext);
    130          1.1  christos     s=UtLocalCacheCalloc (size + 1);
    131          1.1  christos     AcpiUtSafeStrncpy (s, DtCompilerParsertext, size + 1);
    132      1.1.1.2  christos     DtCompilerParserlval.u = (DT_TABLE_UNIT *) UtLocalCacheCalloc (sizeof (DT_TABLE_UNIT));
    133      1.1.1.2  christos     DtCompilerParserlval.u->Value = s;
    134      1.1.1.2  christos     DtCompilerParserlval.u->Line = DtCompilerParserlineno;
    135      1.1.1.2  christos     DtCompilerParserlval.u->Column = DtCompilerParsercolumn;
    136      1.1.1.2  christos     DtLabelByteOffset = DtCompilerParserByteOffset;
    137          1.1  christos     DbgPrint (ASL_PARSE_OUTPUT, "Label: %s\n", s);
    138          1.1  christos     return (DT_PARSEOP_LABEL);
    139          1.1  christos }
    140          1.1  christos 
    141          1.1  christos 
    142          1.1  christos <DATA_STATE>\"{Text}?\" { // remove outer quotes from the string, they are unnecessary
    143          1.1  christos     char *s;
    144          1.1  christos     int size = strlen (DtCompilerParsertext);
    145          1.1  christos     s=UtLocalCacheCalloc (size - 1);
    146          1.1  christos     AcpiUtSafeStrncpy (s, DtCompilerParsertext + 1, size - 1);
    147          1.1  christos     DtCompilerParserlval.s = s;
    148          1.1  christos     DbgPrint (ASL_PARSE_OUTPUT, "String Data: %s\n", s);
    149          1.1  christos     BEGIN (INITIAL);
    150          1.1  christos     return (DT_PARSEOP_STRING_DATA);
    151          1.1  christos }
    152          1.1  christos 
    153          1.1  christos 
    154          1.1  christos <INITIAL,DATA_STATE>{NewLines} {
    155          1.1  christos     DbgPrint(ASL_PARSE_OUTPUT,
    156          1.1  christos         "Newline matched (data state). Current line number: %u\n",DtCompilerParserlineno);
    157          1.1  christos     BEGIN (INITIAL); DtCompilerParsercolumn = 1;
    158          1.1  christos }
    159          1.1  christos 
    160          1.1  christos 
    161          1.1  christos %%
    162          1.1  christos 
    163          1.1  christos 
    164          1.1  christos /*
    165          1.1  christos  * Local support functions
    166          1.1  christos  */
    167          1.1  christos 
    168          1.1  christos void
    169          1.1  christos DtCompilerInitLexer (
    170          1.1  christos     FILE                *inFile)
    171          1.1  christos {
    172          1.1  christos     yyin = inFile;
    173          1.1  christos }
    174          1.1  christos 
    175          1.1  christos void
    176          1.1  christos DtCompilerTerminateLexer (
    177          1.1  christos     void)
    178          1.1  christos {
    179          1.1  christos     /*
    180          1.1  christos      * Flex/Bison increments the lineno for the EOF so decrement by 1 to get
    181          1.1  christos      * the correct number of lines.
    182          1.1  christos      */
    183          1.1  christos     AslGbl_CurrentLineNumber = DtCompilerParserlineno - 1;
    184          1.1  christos     AslGbl_InputByteCount = DtCompilerParserByteOffset;
    185          1.1  christos }
    186