Home | History | Annotate | Line # | Download | only in compiler
dtcompilerparser.l revision 1.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  christos  * Copyright (C) 2000 - 2019, 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  christos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY 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 YYSTYPE DtCompilerlval;
     49  1.1  christos 
     50  1.1  christos #define _COMPONENT          ACPI_COMPILER
     51  1.1  christos         ACPI_MODULE_NAME    ("dtcompilerscanner")
     52  1.1  christos 
     53  1.1  christos /* handle locations */
     54  1.1  christos 
     55  1.1  christos int DtCompilerParsercolumn = 1;
     56  1.1  christos int DtCompilerParserByteOffset = 0;
     57  1.1  christos 
     58  1.1  christos #define YY_USER_ACTION \
     59  1.1  christos             DtCompilerParserlloc.first_line = DtCompilerParserlloc.last_line = DtCompilerParserlineno; \
     60  1.1  christos             DtCompilerParserlloc.first_column = DtCompilerParsercolumn; \
     61  1.1  christos             DtCompilerParserlloc.first_byte_offset = DtCompilerParserByteOffset; \
     62  1.1  christos             DtCompilerParserlloc.last_column = DtCompilerParsercolumn + DtCompilerParserleng-1; \
     63  1.1  christos             DtCompilerParsercolumn += DtCompilerParserleng; \
     64  1.1  christos             DtCompilerParserByteOffset += DtCompilerParserleng; \
     65  1.1  christos             DbgPrint (ASL_PARSE_OUTPUT,\
     66  1.1  christos                 "user action occurred. DtCompilerParserlloc.first_line: %u offset: %u\n",\
     67  1.1  christos                 DtCompilerParserlloc.first_line, DtCompilerParserlloc.first_byte_offset);
     68  1.1  christos %}
     69  1.1  christos 
     70  1.1  christos %option nounput noinput yylineno
     71  1.1  christos 
     72  1.1  christos     /* Indicates a state used for parsing multiline C comments */
     73  1.1  christos %x ML_COMMENT
     74  1.1  christos %x DATA_STATE
     75  1.1  christos 
     76  1.1  christos WhiteSpace      [ \t\v\r]+
     77  1.1  christos NewLines        [\n]+
     78  1.1  christos 
     79  1.1  christos     /* Avoid ", \n, and [] as a part of label name. These are not valid characters of a label name */
     80  1.1  christos LabelName       [^ ":\n\[\]]([^":\n\[\]]*[^" :\n\[\]])?
     81  1.1  christos 
     82  1.1  christos     /* Avoid ", \n, \\, and [] as a part of data. These are not valid characters of data */
     83  1.1  christos Data            [^ \\":\n\[\]]([^":\n\[\]\\]*[^" :\n\[\]\\])?
     84  1.1  christos 
     85  1.1  christos Text            [^ ":\n][^":\n]*
     86  1.1  christos Comment         \[[^\n\[\]]*\]
     87  1.1  christos CommentField    {LabelName}{WhiteSpace}*:{WhiteSpace}{Comment}?$
     88  1.1  christos 
     89  1.1  christos 
     90  1.1  christos %%
     91  1.1  christos 
     92  1.1  christos <DATA_STATE>{WhiteSpace}"\\\n" {
     93  1.1  christos         DbgPrint(ASL_PARSE_OUTPUT,"Continuation matched\n");
     94  1.1  christos         return (DT_PARSEOP_LINE_CONTINUATION);
     95  1.1  christos     }
     96  1.1  christos 
     97  1.1  christos ":" {
     98  1.1  christos         DbgPrint(ASL_PARSE_OUTPUT, ": Matched\n");
     99  1.1  christos         BEGIN (DATA_STATE);
    100  1.1  christos         return (':');
    101  1.1  christos     }
    102  1.1  christos 
    103  1.1  christos <INITIAL,DATA_STATE>{WhiteSpace} { DbgPrint(ASL_PARSE_OUTPUT,"Whitespace matched\n"); }
    104  1.1  christos 
    105  1.1  christos <INITIAL,DATA_STATE>{Comment}    { DbgPrint(ASL_PARSE_OUTPUT,"Comment matched\n"); }
    106  1.1  christos 
    107  1.1  christos "/*"                     { BEGIN (ML_COMMENT); }
    108  1.1  christos <ML_COMMENT>"*/"         { BEGIN (INITIAL); }
    109  1.1  christos <ML_COMMENT>"*/\n"       { BEGIN (INITIAL); }
    110  1.1  christos <ML_COMMENT>([^*]|\n)+|. /* Ignore */
    111  1.1  christos "//".*                   /* Ignore */
    112  1.1  christos 
    113  1.1  christos 
    114  1.1  christos <DATA_STATE>{Data} {
    115  1.1  christos       char *s;
    116  1.1  christos       int size = strlen (DtCompilerParsertext);
    117  1.1  christos       s=UtLocalCacheCalloc (size + 1);
    118  1.1  christos       AcpiUtSafeStrncpy (s, DtCompilerParsertext, size + 1);
    119  1.1  christos       DtCompilerParserlval.s = s;
    120  1.1  christos       DbgPrint (ASL_PARSE_OUTPUT, "Data: %s\n", s);
    121  1.1  christos       return (DT_PARSEOP_DATA);
    122  1.1  christos }
    123  1.1  christos 
    124  1.1  christos {CommentField}  /* ignore */
    125  1.1  christos 
    126  1.1  christos {LabelName} {
    127  1.1  christos     char *s;
    128  1.1  christos     int size = strlen (DtCompilerParsertext);
    129  1.1  christos     s=UtLocalCacheCalloc (size + 1);
    130  1.1  christos     AcpiUtSafeStrncpy (s, DtCompilerParsertext, size + 1);
    131  1.1  christos     DtCompilerParserlval.s = s;
    132  1.1  christos     DbgPrint (ASL_PARSE_OUTPUT, "Label: %s\n", s);
    133  1.1  christos     return (DT_PARSEOP_LABEL);
    134  1.1  christos }
    135  1.1  christos 
    136  1.1  christos 
    137  1.1  christos <DATA_STATE>\"{Text}?\" { // remove outer quotes from the string, they are unnecessary
    138  1.1  christos     char *s;
    139  1.1  christos     int size = strlen (DtCompilerParsertext);
    140  1.1  christos     s=UtLocalCacheCalloc (size - 1);
    141  1.1  christos     AcpiUtSafeStrncpy (s, DtCompilerParsertext + 1, size - 1);
    142  1.1  christos     DtCompilerParserlval.s = s;
    143  1.1  christos     DbgPrint (ASL_PARSE_OUTPUT, "String Data: %s\n", s);
    144  1.1  christos     BEGIN (INITIAL);
    145  1.1  christos     return (DT_PARSEOP_STRING_DATA);
    146  1.1  christos }
    147  1.1  christos 
    148  1.1  christos 
    149  1.1  christos <INITIAL,DATA_STATE>{NewLines} {
    150  1.1  christos     DbgPrint(ASL_PARSE_OUTPUT,
    151  1.1  christos         "Newline matched (data state). Current line number: %u\n",DtCompilerParserlineno);
    152  1.1  christos     BEGIN (INITIAL); DtCompilerParsercolumn = 1;
    153  1.1  christos }
    154  1.1  christos 
    155  1.1  christos 
    156  1.1  christos %%
    157  1.1  christos 
    158  1.1  christos 
    159  1.1  christos /*
    160  1.1  christos  * Local support functions
    161  1.1  christos  */
    162  1.1  christos 
    163  1.1  christos void
    164  1.1  christos DtCompilerInitLexer (
    165  1.1  christos     FILE                *inFile)
    166  1.1  christos {
    167  1.1  christos     yyin = inFile;
    168  1.1  christos }
    169  1.1  christos 
    170  1.1  christos void
    171  1.1  christos DtCompilerTerminateLexer (
    172  1.1  christos     void)
    173  1.1  christos {
    174  1.1  christos     /*
    175  1.1  christos      * Flex/Bison increments the lineno for the EOF so decrement by 1 to get
    176  1.1  christos      * the correct number of lines.
    177  1.1  christos      */
    178  1.1  christos     AslGbl_CurrentLineNumber = DtCompilerParserlineno - 1;
    179  1.1  christos     AslGbl_InputByteCount = DtCompilerParserByteOffset;
    180  1.1  christos }
    181