Home | History | Annotate | Line # | Download | only in lint1
      1    1.1       cgd %{
      2  1.143    rillig /* $NetBSD: scan.l,v 1.143 2024/12/08 17:12:01 rillig Exp $ */
      3    1.2       cgd 
      4    1.1       cgd /*
      5    1.9       cgd  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
      6    1.1       cgd  * Copyright (c) 1994, 1995 Jochen Pohl
      7    1.1       cgd  * All Rights Reserved.
      8    1.1       cgd  *
      9    1.1       cgd  * Redistribution and use in source and binary forms, with or without
     10    1.1       cgd  * modification, are permitted provided that the following conditions
     11    1.1       cgd  * are met:
     12    1.1       cgd  * 1. Redistributions of source code must retain the above copyright
     13    1.1       cgd  *    notice, this list of conditions and the following disclaimer.
     14    1.1       cgd  * 2. Redistributions in binary form must reproduce the above copyright
     15    1.1       cgd  *    notice, this list of conditions and the following disclaimer in the
     16    1.1       cgd  *    documentation and/or other materials provided with the distribution.
     17    1.1       cgd  * 3. All advertising materials mentioning features or use of this software
     18    1.1       cgd  *    must display the following acknowledgement:
     19  1.139    rillig  *	This product includes software developed by Jochen Pohl for
     20  1.139    rillig  *	The NetBSD Project.
     21    1.1       cgd  * 4. The name of the author may not be used to endorse or promote products
     22    1.1       cgd  *    derived from this software without specific prior written permission.
     23    1.1       cgd  *
     24    1.1       cgd  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     25    1.1       cgd  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     26    1.1       cgd  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     27    1.1       cgd  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     28    1.1       cgd  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     29    1.1       cgd  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     30    1.1       cgd  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     31    1.1       cgd  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     32    1.1       cgd  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     33    1.1       cgd  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     34    1.1       cgd  */
     35    1.1       cgd 
     36   1.11  christos #include <sys/cdefs.h>
     37  1.136    rillig #if defined(__RCSID)
     38  1.143    rillig __RCSID("$NetBSD: scan.l,v 1.143 2024/12/08 17:12:01 rillig Exp $");
     39    1.1       cgd #endif
     40    1.1       cgd 
     41    1.1       cgd #include "lint1.h"
     42   1.12        tv #include "cgram.h"
     43    1.1       cgd 
     44    1.1       cgd %}
     45    1.1       cgd 
     46   1.62  christos 
     47  1.138    rillig HEX	[0-9A-Fa-f]
     48  1.138    rillig EXP	([eE][+-]?[0-9]+)
     49  1.138    rillig PEXP	(p[+-]?[0-9A-Fa-f]+)
     50  1.138    rillig FSUF	([fFlL]?[i]?)
     51    1.1       cgd 
     52  1.143    rillig punctuator_1	[\[\](){}.]|->
     53  1.143    rillig punctuator_2	{punctuator_1}|\+\+|--|[&*+\-~!]
     54  1.143    rillig punctuator_3	{punctuator_2}|\/|%|<<|>>|<|>|<=|>=|==|!=|\^|\||&&|\|\|
     55  1.143    rillig punctuator_4	{punctuator_3}|\?|:|::|;|\.\.\.
     56  1.143    rillig punctuator_5	{punctuator_4}|=|\*=|\/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=
     57  1.143    rillig punctuator_6	{punctuator_5}|,|#|##
     58  1.143    rillig punctuator_7	{punctuator_6}|<:|:>|<%|%>|%:|%:%:
     59  1.143    rillig punctuator	{punctuator_7}|@
     60  1.143    rillig 
     61  1.142    rillig %pointer
     62   1.46  christos %option nounput
     63   1.46  christos 
     64  1.143    rillig %x preprocessing
     65  1.143    rillig 
     66    1.1       cgd %%
     67    1.1       cgd 
     68  1.138    rillig [_A-Za-z][_A-Za-z0-9]*		return lex_name(yytext, yyleng);
     69  1.138    rillig 0[bB][01]+[lLuU]*		return lex_integer_constant(yytext, yyleng, 2);
     70  1.138    rillig 0[0-7]*[lLuU]*			return lex_integer_constant(yytext, yyleng, 8);
     71  1.138    rillig [1-9][0-9]*[lLuU]*		return lex_integer_constant(yytext, yyleng, 10);
     72  1.138    rillig 0[xX]{HEX}+[lLuU]*		return lex_integer_constant(yytext, yyleng, 16);
     73  1.138    rillig [0-9]+\.[0-9]*{EXP}?{FSUF}	|
     74  1.138    rillig [0-9]+{EXP}{FSUF}		|
     75  1.138    rillig 0[xX]{HEX}+\.{HEX}*{PEXP}{FSUF}	|
     76  1.138    rillig 0[xX]{HEX}+{PEXP}{FSUF}		|
     77  1.138    rillig \.[0-9]+{EXP}?{FSUF}		return lex_floating_constant(yytext, yyleng);
     78  1.132    rillig "="				return T_ASSIGN;
     79  1.130    rillig "*="				return lex_operator(T_OPASSIGN, MULASS);
     80  1.130    rillig "/="				return lex_operator(T_OPASSIGN, DIVASS);
     81  1.130    rillig "%="				return lex_operator(T_OPASSIGN, MODASS);
     82  1.130    rillig "+="				return lex_operator(T_OPASSIGN, ADDASS);
     83  1.130    rillig "-="				return lex_operator(T_OPASSIGN, SUBASS);
     84  1.130    rillig "<<="				return lex_operator(T_OPASSIGN, SHLASS);
     85  1.130    rillig ">>="				return lex_operator(T_OPASSIGN, SHRASS);
     86  1.130    rillig "&="				return lex_operator(T_OPASSIGN, ANDASS);
     87  1.130    rillig "^="				return lex_operator(T_OPASSIGN, XORASS);
     88  1.130    rillig "|="				return lex_operator(T_OPASSIGN, ORASS);
     89  1.132    rillig "||"				return T_LOGOR;
     90  1.132    rillig "&&"				return T_LOGAND;
     91  1.132    rillig "|"				return T_BITOR;
     92  1.132    rillig "&"				return T_AMPER;
     93  1.133    rillig "^"				return T_BITXOR;
     94  1.130    rillig "=="				return lex_operator(T_EQUALITY, EQ);
     95  1.130    rillig "!="				return lex_operator(T_EQUALITY, NE);
     96  1.130    rillig "<"				return lex_operator(T_RELATIONAL, LT);
     97  1.130    rillig ">"				return lex_operator(T_RELATIONAL, GT);
     98  1.130    rillig "<="				return lex_operator(T_RELATIONAL, LE);
     99  1.130    rillig ">="				return lex_operator(T_RELATIONAL, GE);
    100  1.130    rillig "<<"				return lex_operator(T_SHIFT, SHL);
    101  1.130    rillig ">>"				return lex_operator(T_SHIFT, SHR);
    102  1.140    rillig "++"				return yylval.y_inc = true, T_INCDEC;
    103  1.140    rillig "--"				return yylval.y_inc = false, T_INCDEC;
    104  1.134    rillig "->"				return T_ARROW;
    105  1.134    rillig "."				return T_POINT;
    106  1.130    rillig "+"				return lex_operator(T_ADDITIVE, PLUS);
    107  1.130    rillig "-"				return lex_operator(T_ADDITIVE, MINUS);
    108  1.132    rillig "*"				return T_ASTERISK;
    109  1.130    rillig "/"				return lex_operator(T_MULTIPLICATIVE, DIV);
    110  1.130    rillig "%"				return lex_operator(T_MULTIPLICATIVE, MOD);
    111  1.135    rillig "!"				return T_LOGNOT;
    112  1.135    rillig "~"				return T_COMPLEMENT;
    113  1.130    rillig "\""				return lex_string();
    114  1.131    rillig "L\""				return lex_wide_string();
    115   1.97    rillig ";"				return T_SEMI;
    116   1.97    rillig "{"				return T_LBRACE;
    117   1.97    rillig "}"				return T_RBRACE;
    118   1.97    rillig ","				return T_COMMA;
    119   1.97    rillig ":"				return T_COLON;
    120   1.97    rillig "?"				return T_QUEST;
    121   1.97    rillig "["				return T_LBRACK;
    122   1.97    rillig "]"				return T_RBRACK;
    123  1.108    rillig "("				return T_LPAREN;
    124  1.108    rillig ")"				return T_RPAREN;
    125  1.123    rillig "..."				return T_ELLIPSIS;
    126  1.141    rillig "::"				return T_DCOLON;
    127  1.131    rillig "'"				return lex_character_constant();
    128  1.131    rillig "L'"				return lex_wide_character_constant();
    129  1.131    rillig \n				lex_next_line();
    130    1.1       cgd \t|" "|\f|\v			;
    131  1.130    rillig "/*"				lex_comment();
    132  1.131    rillig "//"				lex_slash_slash_comment();
    133  1.143    rillig 
    134  1.143    rillig ^#				{
    135  1.143    rillig 					BEGIN preprocessing;
    136  1.143    rillig 					lex_pp_begin();
    137  1.143    rillig 				}
    138  1.143    rillig <preprocessing>[_A-Za-z][_A-Za-z0-9]*	lex_pp_identifier(yytext);
    139  1.143    rillig <preprocessing>\.?[0-9]('?[_A-Za-z0-9]|[EePp][-+][0-9]+|\.)*	lex_pp_number(yytext);
    140  1.143    rillig <preprocessing>\'		lex_pp_character_constant();
    141  1.143    rillig <preprocessing>\"		lex_pp_string_literal();
    142  1.143    rillig <preprocessing>{punctuator}	lex_pp_punctuator(yytext);
    143  1.143    rillig <preprocessing>\/\*		lex_pp_comment();
    144  1.143    rillig <preprocessing>[ \f\t\v]+	lex_pp_whitespace();
    145  1.143    rillig <preprocessing>.		lex_unknown_character(yytext[0]);
    146  1.143    rillig <preprocessing>\n		{
    147  1.143    rillig 					lex_pp_end();
    148  1.143    rillig 					lex_next_line();
    149  1.143    rillig 					BEGIN INITIAL;
    150  1.143    rillig 				}
    151  1.143    rillig 
    152  1.131    rillig .				lex_unknown_character(yytext[0]);
    153    1.1       cgd 
    154    1.1       cgd %%
    155    1.1       cgd 
    156  1.137    rillig /*
    157  1.137    rillig  * In the above list of regular expressions, the tokens for character
    158  1.137    rillig  * constants, string literals and comments are incomplete; they only match
    159  1.137    rillig  * a prefix.  The remainder of these tokens is scanned by reading bytes
    160  1.137    rillig  * directly from the input stream.
    161  1.137    rillig  */
    162    1.1       cgd int
    163  1.130    rillig lex_input(void)
    164    1.6       jpo {
    165  1.130    rillig 	return input();
    166    1.1       cgd }
    167