xref: /freebsd-src/contrib/flex/src/scan.l (revision 34e67bb5977049afb3e965b52b86ac12ea4899b4)
17e382390SJung-uk Kim /* scan.l - scanner for flex input -*-C-*- */
27e382390SJung-uk Kim 
37e382390SJung-uk Kim %{
47e382390SJung-uk Kim /*  Copyright (c) 1990 The Regents of the University of California. */
57e382390SJung-uk Kim /*  All rights reserved. */
67e382390SJung-uk Kim 
77e382390SJung-uk Kim /*  This code is derived from software contributed to Berkeley by */
87e382390SJung-uk Kim /*  Vern Paxson. */
97e382390SJung-uk Kim 
107e382390SJung-uk Kim /*  The United States Government has rights in this work pursuant */
117e382390SJung-uk Kim /*  to contract no. DE-AC03-76SF00098 between the United States */
127e382390SJung-uk Kim /*  Department of Energy and the University of California. */
137e382390SJung-uk Kim 
147e382390SJung-uk Kim /*  This file is part of flex. */
157e382390SJung-uk Kim 
167e382390SJung-uk Kim /*  Redistribution and use in source and binary forms, with or without */
177e382390SJung-uk Kim /*  modification, are permitted provided that the following conditions */
187e382390SJung-uk Kim /*  are met: */
197e382390SJung-uk Kim 
207e382390SJung-uk Kim /*  1. Redistributions of source code must retain the above copyright */
217e382390SJung-uk Kim /*     notice, this list of conditions and the following disclaimer. */
227e382390SJung-uk Kim /*  2. Redistributions in binary form must reproduce the above copyright */
237e382390SJung-uk Kim /*     notice, this list of conditions and the following disclaimer in the */
247e382390SJung-uk Kim /*     documentation and/or other materials provided with the distribution. */
257e382390SJung-uk Kim 
267e382390SJung-uk Kim /*  Neither the name of the University nor the names of its contributors */
277e382390SJung-uk Kim /*  may be used to endorse or promote products derived from this software */
287e382390SJung-uk Kim /*  without specific prior written permission. */
297e382390SJung-uk Kim 
307e382390SJung-uk Kim /*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
317e382390SJung-uk Kim /*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
327e382390SJung-uk Kim /*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
337e382390SJung-uk Kim /*  PURPOSE. */
347e382390SJung-uk Kim 
357e382390SJung-uk Kim #include "flexdef.h"
367e382390SJung-uk Kim #include "parse.h"
377e382390SJung-uk Kim extern bool tablesverify, tablesext;
387e382390SJung-uk Kim extern int trlcontxt; /* Set in  parse.y for each rule. */
397e382390SJung-uk Kim extern const char *escaped_qstart, *escaped_qend;
407e382390SJung-uk Kim extern int yylval;
417e382390SJung-uk Kim 
427e382390SJung-uk Kim #define M4QSTART "[""["
437e382390SJung-uk Kim #define M4QEND "]""]"
447e382390SJung-uk Kim 
457e382390SJung-uk Kim #define ESCAPED_QSTART "[" M4QEND M4QSTART "[" M4QEND M4QSTART
467e382390SJung-uk Kim #define ESCAPED_QEND M4QEND "]" M4QSTART M4QEND "]" M4QSTART
477e382390SJung-uk Kim 
487e382390SJung-uk Kim #define ACTION_ECHO add_action( yytext )
497e382390SJung-uk Kim #define ACTION_IFDEF(def, should_define) \
507e382390SJung-uk Kim 	{ \
517e382390SJung-uk Kim 	if ( should_define ) \
527e382390SJung-uk Kim 		action_define( def, 1 ); \
537e382390SJung-uk Kim 	}
547e382390SJung-uk Kim 
557e382390SJung-uk Kim #define ACTION_ECHO_QSTART add_action (ESCAPED_QSTART)
567e382390SJung-uk Kim #define ACTION_ECHO_QEND   add_action (ESCAPED_QEND)
577e382390SJung-uk Kim 
587e382390SJung-uk Kim #define ACTION_M4_IFDEF(def, should_define) \
597e382390SJung-uk Kim     do{ \
607e382390SJung-uk Kim         if ( should_define ) \
617e382390SJung-uk Kim             buf_m4_define( &m4defs_buf, def, NULL);\
627e382390SJung-uk Kim         else \
637e382390SJung-uk Kim             buf_m4_undefine( &m4defs_buf, def);\
647e382390SJung-uk Kim     } while(0)
657e382390SJung-uk Kim 
667e382390SJung-uk Kim #define MARK_END_OF_PROLOG mark_prolog();
677e382390SJung-uk Kim 
687e382390SJung-uk Kim #define YY_DECL \
697e382390SJung-uk Kim 	int flexscan(void)
707e382390SJung-uk Kim 
717e382390SJung-uk Kim #define RETURNCHAR \
727e382390SJung-uk Kim 	yylval = (unsigned char) yytext[0]; \
737e382390SJung-uk Kim 	return CHAR;
747e382390SJung-uk Kim 
757e382390SJung-uk Kim #define RETURNNAME \
767e382390SJung-uk Kim 	if(yyleng < MAXLINE) \
777e382390SJung-uk Kim          { \
787e382390SJung-uk Kim 	strncpy( nmstr, yytext, sizeof(nmstr) ); \
797e382390SJung-uk Kim 	return NAME; \
807e382390SJung-uk Kim 	 } \
817e382390SJung-uk Kim 	else \
827e382390SJung-uk Kim 	 do { \
837e382390SJung-uk Kim 	   synerr(_("Input line too long\n")); \
847e382390SJung-uk Kim 	   FLEX_EXIT(EXIT_FAILURE);  \
857e382390SJung-uk Kim 	 } while (0)
867e382390SJung-uk Kim 
877e382390SJung-uk Kim #define PUT_BACK_STRING(str, start) \
887e382390SJung-uk Kim 	{ size_t i = strlen( str );	\
897e382390SJung-uk Kim 	  while ( i > start )		\
907e382390SJung-uk Kim 	    unput((str)[--i]);		\
917e382390SJung-uk Kim 	}
927e382390SJung-uk Kim 
937e382390SJung-uk Kim #define CHECK_REJECT(str) \
947e382390SJung-uk Kim 	if ( all_upper( str ) ) \
957e382390SJung-uk Kim 		reject = true;
967e382390SJung-uk Kim 
977e382390SJung-uk Kim #define CHECK_YYMORE(str) \
987e382390SJung-uk Kim 	if ( all_lower( str ) ) \
997e382390SJung-uk Kim 		yymore_used = true;
1007e382390SJung-uk Kim 
1017e382390SJung-uk Kim #define YY_USER_INIT \
1027e382390SJung-uk Kim 	if ( getenv("POSIXLY_CORRECT") ) \
1037e382390SJung-uk Kim 		posix_compat = true;
1047e382390SJung-uk Kim 
1057e382390SJung-uk Kim #define START_CODEBLOCK(x) do { \
1067e382390SJung-uk Kim     /* Emit the needed line directive... */\
1077e382390SJung-uk Kim     if (indented_code == false) { \
1087e382390SJung-uk Kim         linenum++; \
1097e382390SJung-uk Kim         line_directive_out(NULL, 1); \
1107e382390SJung-uk Kim     } \
1117e382390SJung-uk Kim     add_action(M4QSTART); \
1127e382390SJung-uk Kim     yy_push_state(CODEBLOCK); \
1137e382390SJung-uk Kim     if ((indented_code = x)) ACTION_ECHO; \
1147e382390SJung-uk Kim } while(0)
1157e382390SJung-uk Kim 
1167e382390SJung-uk Kim #define END_CODEBLOCK do { \
1177e382390SJung-uk Kim     yy_pop_state();\
1187e382390SJung-uk Kim     add_action(M4QEND); \
1197e382390SJung-uk Kim     if (!indented_code) line_directive_out(NULL, 0);\
1207e382390SJung-uk Kim } while (0)
1217e382390SJung-uk Kim 
1227e382390SJung-uk Kim %}
1237e382390SJung-uk Kim 
1247e382390SJung-uk Kim %option caseless nodefault noreject stack noyy_top_state
1257e382390SJung-uk Kim %option nostdinit
1267e382390SJung-uk Kim 
1277e382390SJung-uk Kim %x SECT2 SECT2PROLOG SECT3 CODEBLOCK PICKUPDEF SC CARETISBOL NUM QUOTE
1287e382390SJung-uk Kim %x FIRSTCCL CCL ACTION RECOVER COMMENT ACTION_STRING PERCENT_BRACE_ACTION
1297e382390SJung-uk Kim %x OPTION LINEDIR CODEBLOCK_MATCH_BRACE
1307e382390SJung-uk Kim %x GROUP_WITH_PARAMS
1317e382390SJung-uk Kim %x GROUP_MINUS_PARAMS
1327e382390SJung-uk Kim %x EXTENDED_COMMENT
1337e382390SJung-uk Kim %x COMMENT_DISCARD CODE_COMMENT
1347e382390SJung-uk Kim %x SECT3_NOESCAPE
1357e382390SJung-uk Kim %x CHARACTER_CONSTANT
1367e382390SJung-uk Kim 
1377e382390SJung-uk Kim WS		[[:blank:]]+
1387e382390SJung-uk Kim OPTWS		[[:blank:]]*
1397e382390SJung-uk Kim NOT_WS		[^[:blank:]\r\n]
1407e382390SJung-uk Kim 
1417e382390SJung-uk Kim NL		\r?\n
1427e382390SJung-uk Kim 
1437e382390SJung-uk Kim NAME		([[:alpha:]_][[:alnum:]_-]*)
1447e382390SJung-uk Kim NOT_NAME	[^[:alpha:]_*\n]+
1457e382390SJung-uk Kim 
1467e382390SJung-uk Kim SCNAME		{NAME}
1477e382390SJung-uk Kim 
1487e382390SJung-uk Kim ESCSEQ		(\\([^\n]|[0-7]{1,3}|x[[:xdigit:]]{1,2}))
1497e382390SJung-uk Kim 
1507e382390SJung-uk Kim FIRST_CCL_CHAR	([^\\\n]|{ESCSEQ})
1517e382390SJung-uk Kim CCL_CHAR	([^\\\n\]]|{ESCSEQ})
1527e382390SJung-uk Kim CCL_EXPR	("[:"^?[[:alpha:]]+":]")
1537e382390SJung-uk Kim 
1547e382390SJung-uk Kim LEXOPT		[aceknopr]
1557e382390SJung-uk Kim 
1567e382390SJung-uk Kim M4QSTART    "[""["
1577e382390SJung-uk Kim M4QEND      "]""]"
1587e382390SJung-uk Kim 
1597e382390SJung-uk Kim %%
1607e382390SJung-uk Kim 	static int bracelevel, didadef, indented_code;
1617e382390SJung-uk Kim 	static int doing_rule_action = false;
1627e382390SJung-uk Kim 	static int option_sense;
1637e382390SJung-uk Kim 
1647e382390SJung-uk Kim 	int doing_codeblock = false;
1657e382390SJung-uk Kim 	int brace_depth=0, brace_start_line=0;
1667e382390SJung-uk Kim 	char nmdef[MAXLINE];
1677e382390SJung-uk Kim 
1687e382390SJung-uk Kim 
1697e382390SJung-uk Kim <INITIAL>{
1707e382390SJung-uk Kim 	^{WS}		START_CODEBLOCK(true);
1717e382390SJung-uk Kim 	^"/*"		add_action("/*[""["); yy_push_state( COMMENT );
1727e382390SJung-uk Kim 	^#{OPTWS}line{WS}	yy_push_state( LINEDIR );
1737e382390SJung-uk Kim 	^"%s"{NAME}?	return SCDECL;
1747e382390SJung-uk Kim 	^"%x"{NAME}?	return XSCDECL;
1757e382390SJung-uk Kim 	^"%{".*{NL}	START_CODEBLOCK(false);
1767e382390SJung-uk Kim     ^"%top"[[:blank:]]*"{"[[:blank:]]*{NL}    {
1777e382390SJung-uk Kim                 brace_start_line = linenum;
1787e382390SJung-uk Kim                 ++linenum;
1797e382390SJung-uk Kim                 buf_linedir( &top_buf, infilename?infilename:"<stdin>", linenum);
1807e382390SJung-uk Kim                 brace_depth = 1;
1817e382390SJung-uk Kim                 yy_push_state(CODEBLOCK_MATCH_BRACE);
1827e382390SJung-uk Kim             }
1837e382390SJung-uk Kim 
1847e382390SJung-uk Kim     ^"%top".*   synerr( _("malformed '%top' directive") );
1857e382390SJung-uk Kim 
1867e382390SJung-uk Kim 	{WS}		/* discard */
1877e382390SJung-uk Kim 
1887e382390SJung-uk Kim 	^"%%".*		{
1897e382390SJung-uk Kim 			sectnum = 2;
1907e382390SJung-uk Kim 			bracelevel = 0;
1917e382390SJung-uk Kim 			mark_defs1();
1927e382390SJung-uk Kim 			line_directive_out(NULL, 1);
1937e382390SJung-uk Kim 			BEGIN(SECT2PROLOG);
1947e382390SJung-uk Kim 			return SECTEND;
1957e382390SJung-uk Kim 			}
1967e382390SJung-uk Kim 
1977e382390SJung-uk Kim 	^"%pointer".*{NL}	yytext_is_array = false; ++linenum;
1987e382390SJung-uk Kim 	^"%array".*{NL}		yytext_is_array = true; ++linenum;
1997e382390SJung-uk Kim 
2007e382390SJung-uk Kim 	^"%option"	BEGIN(OPTION); return TOK_OPTION;
2017e382390SJung-uk Kim 
2027e382390SJung-uk Kim 	^"%"{LEXOPT}{OPTWS}[[:digit:]]*{OPTWS}{NL}	++linenum; /* ignore */
2037e382390SJung-uk Kim 	^"%"{LEXOPT}{WS}.*{NL}	++linenum;	/* ignore */
2047e382390SJung-uk Kim 
2057e382390SJung-uk Kim 	/* xgettext: no-c-format */
2067e382390SJung-uk Kim 	^"%"[^sxaceknopr{}].*	synerr( _( "unrecognized '%' directive" ) );
2077e382390SJung-uk Kim 
2087e382390SJung-uk Kim 	^{NAME}		{
2097e382390SJung-uk Kim 			if(yyleng < MAXLINE)
2107e382390SJung-uk Kim         		 {
2117e382390SJung-uk Kim 			strncpy( nmstr, yytext, sizeof(nmstr) );
2127e382390SJung-uk Kim 			 }
2137e382390SJung-uk Kim 			else
2147e382390SJung-uk Kim 			 {
2157e382390SJung-uk Kim 			   synerr( _("Definition name too long\n"));
2167e382390SJung-uk Kim 			   FLEX_EXIT(EXIT_FAILURE);
2177e382390SJung-uk Kim 			 }
2187e382390SJung-uk Kim 
2197e382390SJung-uk Kim 			didadef = false;
2207e382390SJung-uk Kim 			BEGIN(PICKUPDEF);
2217e382390SJung-uk Kim 			}
2227e382390SJung-uk Kim 
2237e382390SJung-uk Kim 	{SCNAME}	RETURNNAME;
2247e382390SJung-uk Kim 	^{OPTWS}{NL}	++linenum; /* allows blank lines in section 1 */
2257e382390SJung-uk Kim 	{OPTWS}{NL}	ACTION_ECHO; ++linenum; /* maybe end of comment line */
2267e382390SJung-uk Kim }
2277e382390SJung-uk Kim 
2287e382390SJung-uk Kim 
2297e382390SJung-uk Kim <COMMENT,CODE_COMMENT>{ /* */
2307e382390SJung-uk Kim         [^\[\]\*\n]*  ACTION_ECHO;
2317e382390SJung-uk Kim         .           ACTION_ECHO;
2327e382390SJung-uk Kim 
2337e382390SJung-uk Kim 	{NL}	    ++linenum; ACTION_ECHO;
2347e382390SJung-uk Kim }
2357e382390SJung-uk Kim <COMMENT>{
2367e382390SJung-uk Kim 	"*/"	    add_action("*/]""]"); yy_pop_state();
2377e382390SJung-uk Kim }
2387e382390SJung-uk Kim <CODE_COMMENT>{
2397e382390SJung-uk Kim         "*/"        ACTION_ECHO; yy_pop_state();
2407e382390SJung-uk Kim }
2417e382390SJung-uk Kim 
2427e382390SJung-uk Kim <COMMENT_DISCARD>{
2437e382390SJung-uk Kim         /* This is the same as COMMENT, but is discarded rather than output. */
2447e382390SJung-uk Kim 	"*/"		yy_pop_state();
2457e382390SJung-uk Kim     "*"         ;
2467e382390SJung-uk Kim 	[^*\n]      ;
2477e382390SJung-uk Kim 	{NL}	    ++linenum;
2487e382390SJung-uk Kim }
2497e382390SJung-uk Kim 
2507e382390SJung-uk Kim <EXTENDED_COMMENT>{
2517e382390SJung-uk Kim     ")"         yy_pop_state();
2527e382390SJung-uk Kim     [^\n\)]+      ;
2537e382390SJung-uk Kim     {NL}        ++linenum;
2547e382390SJung-uk Kim }
2557e382390SJung-uk Kim 
2567e382390SJung-uk Kim <LINEDIR>{
2577e382390SJung-uk Kim 	\n		yy_pop_state();
2587e382390SJung-uk Kim 	[[:digit:]]+	linenum = myctoi( yytext );
2597e382390SJung-uk Kim 
2607e382390SJung-uk Kim 	\"[^"\n]*\"	{
2617e382390SJung-uk Kim 			free(infilename);
2627e382390SJung-uk Kim 			infilename = xstrdup(yytext + 1);
2637e382390SJung-uk Kim 			infilename[strlen( infilename ) - 1] = '\0';
2647e382390SJung-uk Kim 			}
2657e382390SJung-uk Kim 	.		/* ignore spurious characters */
2667e382390SJung-uk Kim }
2677e382390SJung-uk Kim <ACTION,CODEBLOCK,ACTION_STRING,PERCENT_BRACE_ACTION,CHARACTER_CONSTANT,COMMENT,CODE_COMMENT>{
2687e382390SJung-uk Kim    {M4QSTART}   ACTION_ECHO_QSTART;
2697e382390SJung-uk Kim    {M4QEND}     ACTION_ECHO_QEND;
2707e382390SJung-uk Kim }
2717e382390SJung-uk Kim 
2727e382390SJung-uk Kim <CODEBLOCK>{
2737e382390SJung-uk Kim 	^"%}".*{NL}	++linenum; END_CODEBLOCK;
2747e382390SJung-uk Kim 	[^\n%\[\]]*         ACTION_ECHO;
2757e382390SJung-uk Kim         .		ACTION_ECHO;
2767e382390SJung-uk Kim 	{NL}		{
2777e382390SJung-uk Kim 			++linenum;
2787e382390SJung-uk Kim 			ACTION_ECHO;
2797e382390SJung-uk Kim 			if ( indented_code ) END_CODEBLOCK;
2807e382390SJung-uk Kim 			}
2817e382390SJung-uk Kim }
2827e382390SJung-uk Kim 
2837e382390SJung-uk Kim <CODEBLOCK_MATCH_BRACE>{
2847e382390SJung-uk Kim     "}"     {
2857e382390SJung-uk Kim                 if( --brace_depth == 0){
2867e382390SJung-uk Kim                     /* TODO: Matched. */
2877e382390SJung-uk Kim                     yy_pop_state();
2887e382390SJung-uk Kim                 }else
2897e382390SJung-uk Kim                     buf_strnappend(&top_buf, yytext, yyleng);
2907e382390SJung-uk Kim             }
2917e382390SJung-uk Kim 
2927e382390SJung-uk Kim     "{"     {
2937e382390SJung-uk Kim                 brace_depth++;
2947e382390SJung-uk Kim                 buf_strnappend(&top_buf, yytext, yyleng);
2957e382390SJung-uk Kim             }
2967e382390SJung-uk Kim 
2977e382390SJung-uk Kim     {NL}    {
2987e382390SJung-uk Kim                 ++linenum;
2997e382390SJung-uk Kim                 buf_strnappend(&top_buf, yytext, yyleng);
3007e382390SJung-uk Kim             }
3017e382390SJung-uk Kim 
3027e382390SJung-uk Kim     {M4QSTART}  buf_strnappend(&top_buf, escaped_qstart, (int) strlen(escaped_qstart));
3037e382390SJung-uk Kim     {M4QEND}    buf_strnappend(&top_buf, escaped_qend, (int) strlen(escaped_qend));
3047e382390SJung-uk Kim     ([^{}\r\n\[\]]+)|[^{}\r\n]  {
3057e382390SJung-uk Kim        buf_strnappend(&top_buf, yytext, yyleng);
3067e382390SJung-uk Kim     }
3077e382390SJung-uk Kim 
3087e382390SJung-uk Kim     <<EOF>>     {
3097e382390SJung-uk Kim                 linenum = brace_start_line;
3107e382390SJung-uk Kim                 synerr(_("Unmatched '{'"));
3117e382390SJung-uk Kim                 yyterminate();
3127e382390SJung-uk Kim                 }
3137e382390SJung-uk Kim }
3147e382390SJung-uk Kim 
3157e382390SJung-uk Kim 
3167e382390SJung-uk Kim <PICKUPDEF>{
3177e382390SJung-uk Kim 	{WS}		/* separates name and definition */
3187e382390SJung-uk Kim 
3197e382390SJung-uk Kim 	{NOT_WS}[^\r\n]*	{
3207e382390SJung-uk Kim  		        if(yyleng < MAXLINE)
3217e382390SJung-uk Kim  		         {
3227e382390SJung-uk Kim 			strncpy( nmdef, yytext, sizeof(nmdef) );
3237e382390SJung-uk Kim  		         }
3247e382390SJung-uk Kim  		        else
3257e382390SJung-uk Kim  		         {
3267e382390SJung-uk Kim  		           format_synerr( _("Definition value for {%s} too long\n"), nmstr);
3277e382390SJung-uk Kim  		           FLEX_EXIT(EXIT_FAILURE);
3287e382390SJung-uk Kim 			 }
3297e382390SJung-uk Kim 			/* Skip trailing whitespace. */
3307e382390SJung-uk Kim 			{
3317e382390SJung-uk Kim 			    size_t i = strlen( nmdef );
3327e382390SJung-uk Kim 			    while (i > 0 && (nmdef[i-1] == ' ' || nmdef[i-1] == '\t'))
3337e382390SJung-uk Kim 			       --i;
3347e382390SJung-uk Kim 			    nmdef[i] = '\0';
3357e382390SJung-uk Kim 			}
3367e382390SJung-uk Kim 
3377e382390SJung-uk Kim 			ndinstal( nmstr, nmdef );
3387e382390SJung-uk Kim 			didadef = true;
3397e382390SJung-uk Kim 			}
3407e382390SJung-uk Kim 
3417e382390SJung-uk Kim 	{NL}		{
3427e382390SJung-uk Kim 			if ( ! didadef )
3437e382390SJung-uk Kim 				synerr( _( "incomplete name definition" ) );
3447e382390SJung-uk Kim 			BEGIN(INITIAL);
3457e382390SJung-uk Kim 			++linenum;
3467e382390SJung-uk Kim 			}
3477e382390SJung-uk Kim }
3487e382390SJung-uk Kim 
3497e382390SJung-uk Kim 
3507e382390SJung-uk Kim <OPTION>{
3517e382390SJung-uk Kim 	{NL}		++linenum; BEGIN(INITIAL);
3527e382390SJung-uk Kim 	{WS}		option_sense = true;
3537e382390SJung-uk Kim 
3547e382390SJung-uk Kim 	"="		return '=';
3557e382390SJung-uk Kim 
3567e382390SJung-uk Kim 	no		option_sense = ! option_sense;
3577e382390SJung-uk Kim 
3587e382390SJung-uk Kim 	7bit		csize = option_sense ? 128 : 256;
3597e382390SJung-uk Kim 	8bit		csize = option_sense ? 256 : 128;
3607e382390SJung-uk Kim 
3617e382390SJung-uk Kim 	align		long_align = option_sense;
3627e382390SJung-uk Kim 	always-interactive	{
3637e382390SJung-uk Kim 			ACTION_M4_IFDEF( "M4""_YY_ALWAYS_INTERACTIVE", option_sense );
3647e382390SJung-uk Kim             interactive = option_sense;
3657e382390SJung-uk Kim 			}
3667e382390SJung-uk Kim 	array		yytext_is_array = option_sense;
3677e382390SJung-uk Kim 	backup		backing_up_report = option_sense;
3687e382390SJung-uk Kim 	batch		interactive = ! option_sense;
3697e382390SJung-uk Kim     bison-bridge     bison_bridge_lval = option_sense;
3707e382390SJung-uk Kim     bison-locations  { if((bison_bridge_lloc = option_sense))
3717e382390SJung-uk Kim                             bison_bridge_lval = true;
3727e382390SJung-uk Kim                      }
3737e382390SJung-uk Kim 	"c++"		C_plus_plus = option_sense;
3747e382390SJung-uk Kim 	caseful|case-sensitive		sf_set_case_ins(!option_sense);
3757e382390SJung-uk Kim 	caseless|case-insensitive	sf_set_case_ins(option_sense);
3767e382390SJung-uk Kim 	debug		ddebug = option_sense;
3777e382390SJung-uk Kim 	default		spprdflt = ! option_sense;
3787e382390SJung-uk Kim 	ecs		useecs = option_sense;
3797e382390SJung-uk Kim 	fast		{
3807e382390SJung-uk Kim 			useecs = usemecs = false;
3817e382390SJung-uk Kim 			use_read = fullspd = true;
3827e382390SJung-uk Kim 			}
3837e382390SJung-uk Kim 	full		{
3847e382390SJung-uk Kim 			useecs = usemecs = false;
3857e382390SJung-uk Kim 			use_read = fulltbl = true;
3867e382390SJung-uk Kim 			}
3877e382390SJung-uk Kim 	input		ACTION_IFDEF("YY_NO_INPUT", ! option_sense);
3887e382390SJung-uk Kim 	interactive	interactive = option_sense;
3897e382390SJung-uk Kim 	lex-compat	lex_compat = option_sense;
3907e382390SJung-uk Kim 	posix-compat	posix_compat = option_sense;
3917e382390SJung-uk Kim 	line		gen_line_dirs = option_sense;
3927e382390SJung-uk Kim 	main		{
3937e382390SJung-uk Kim 			ACTION_M4_IFDEF( "M4""_YY_MAIN", option_sense);
3947e382390SJung-uk Kim             /* Override yywrap */
3957e382390SJung-uk Kim             if( option_sense == true )
3967e382390SJung-uk Kim                 do_yywrap = false;
3977e382390SJung-uk Kim 			}
3987e382390SJung-uk Kim 	meta-ecs	usemecs = option_sense;
3997e382390SJung-uk Kim 	never-interactive	{
4007e382390SJung-uk Kim 			ACTION_M4_IFDEF( "M4""_YY_NEVER_INTERACTIVE", option_sense );
4017e382390SJung-uk Kim             interactive = !option_sense;
4027e382390SJung-uk Kim 			}
4037e382390SJung-uk Kim 	perf-report	performance_report += option_sense ? 1 : -1;
4047e382390SJung-uk Kim 	pointer		yytext_is_array = ! option_sense;
4057e382390SJung-uk Kim 	read		use_read = option_sense;
4067e382390SJung-uk Kim     reentrant   reentrant = option_sense;
4077e382390SJung-uk Kim 	reject		reject_really_used = option_sense;
4087e382390SJung-uk Kim 	stack		ACTION_M4_IFDEF( "M4""_YY_STACK_USED", option_sense );
4097e382390SJung-uk Kim 	stdinit		do_stdinit = option_sense;
4107e382390SJung-uk Kim 	stdout		use_stdout = option_sense;
4117e382390SJung-uk Kim     unistd      ACTION_IFDEF("YY_NO_UNISTD_H", ! option_sense);
4127e382390SJung-uk Kim 	unput		ACTION_M4_IFDEF("M4""_YY_NO_UNPUT", ! option_sense);
4137e382390SJung-uk Kim 	verbose		printstats = option_sense;
4147e382390SJung-uk Kim 	warn		nowarn = ! option_sense;
4157e382390SJung-uk Kim 	yylineno	do_yylineno = option_sense; ACTION_M4_IFDEF("M4""_YY_USE_LINENO", option_sense);
4167e382390SJung-uk Kim 	yymore		yymore_really_used = option_sense;
4177e382390SJung-uk Kim 	yywrap      do_yywrap = option_sense;
4187e382390SJung-uk Kim 
4197e382390SJung-uk Kim 	yy_push_state	ACTION_M4_IFDEF("M4""_YY_NO_PUSH_STATE", ! option_sense);
4207e382390SJung-uk Kim 	yy_pop_state	ACTION_M4_IFDEF("M4""_YY_NO_POP_STATE", ! option_sense);
4217e382390SJung-uk Kim 	yy_top_state	ACTION_M4_IFDEF("M4""_YY_NO_TOP_STATE", ! option_sense);
4227e382390SJung-uk Kim 
4237e382390SJung-uk Kim 	yy_scan_buffer	ACTION_M4_IFDEF("M4""_YY_NO_SCAN_BUFFER", ! option_sense);
4247e382390SJung-uk Kim 	yy_scan_bytes	ACTION_M4_IFDEF("M4""_YY_NO_SCAN_BYTES", ! option_sense);
4257e382390SJung-uk Kim 	yy_scan_string	ACTION_M4_IFDEF("M4""_YY_NO_SCAN_STRING", ! option_sense);
4267e382390SJung-uk Kim 
4277e382390SJung-uk Kim     yyalloc         ACTION_M4_IFDEF("M4""_YY_NO_FLEX_ALLOC", ! option_sense);
4287e382390SJung-uk Kim     yyrealloc       ACTION_M4_IFDEF("M4""_YY_NO_FLEX_REALLOC", ! option_sense);
4297e382390SJung-uk Kim     yyfree          ACTION_M4_IFDEF("M4""_YY_NO_FLEX_FREE", ! option_sense);
4307e382390SJung-uk Kim 
4317e382390SJung-uk Kim     yyget_debug     ACTION_M4_IFDEF("M4""_YY_NO_GET_DEBUG", ! option_sense);
4327e382390SJung-uk Kim     yyset_debug     ACTION_M4_IFDEF("M4""_YY_NO_SET_DEBUG", ! option_sense);
4337e382390SJung-uk Kim     yyget_extra     ACTION_M4_IFDEF("M4""_YY_NO_GET_EXTRA", ! option_sense);
4347e382390SJung-uk Kim     yyset_extra     ACTION_M4_IFDEF("M4""_YY_NO_SET_EXTRA", ! option_sense);
4357e382390SJung-uk Kim     yyget_leng      ACTION_M4_IFDEF("M4""_YY_NO_GET_LENG", ! option_sense);
4367e382390SJung-uk Kim     yyget_text      ACTION_M4_IFDEF("M4""_YY_NO_GET_TEXT", ! option_sense);
4377e382390SJung-uk Kim     yyget_lineno    ACTION_M4_IFDEF("M4""_YY_NO_GET_LINENO", ! option_sense);
4387e382390SJung-uk Kim     yyset_lineno    ACTION_M4_IFDEF("M4""_YY_NO_SET_LINENO", ! option_sense);
4397e382390SJung-uk Kim     yyget_in        ACTION_M4_IFDEF("M4""_YY_NO_GET_IN", ! option_sense);
4407e382390SJung-uk Kim     yyset_in        ACTION_M4_IFDEF("M4""_YY_NO_SET_IN", ! option_sense);
4417e382390SJung-uk Kim     yyget_out       ACTION_M4_IFDEF("M4""_YY_NO_GET_OUT", ! option_sense);
4427e382390SJung-uk Kim     yyset_out       ACTION_M4_IFDEF("M4""_YY_NO_SET_OUT", ! option_sense);
4437e382390SJung-uk Kim     yyget_lval      ACTION_M4_IFDEF("M4""_YY_NO_GET_LVAL", ! option_sense);
4447e382390SJung-uk Kim     yyset_lval      ACTION_M4_IFDEF("M4""_YY_NO_SET_LVAL", ! option_sense);
4457e382390SJung-uk Kim     yyget_lloc      ACTION_M4_IFDEF("M4""_YY_NO_GET_LLOC", ! option_sense);
4467e382390SJung-uk Kim     yyset_lloc      ACTION_M4_IFDEF("M4""_YY_NO_SET_LLOC", ! option_sense);
4477e382390SJung-uk Kim 
4487e382390SJung-uk Kim 	extra-type	return TOK_EXTRA_TYPE;
4497e382390SJung-uk Kim 	outfile		return TOK_OUTFILE;
4507e382390SJung-uk Kim 	prefix		return TOK_PREFIX;
4517e382390SJung-uk Kim 	yyclass		return TOK_YYCLASS;
4527e382390SJung-uk Kim 	header(-file)?      return TOK_HEADER_FILE;
4537e382390SJung-uk Kim 	tables-file         return TOK_TABLES_FILE;
4547e382390SJung-uk Kim 	tables-verify   {
4557e382390SJung-uk Kim                     tablesverify = option_sense;
4567e382390SJung-uk Kim                     if(!tablesext && option_sense)
4577e382390SJung-uk Kim                         tablesext = true;
4587e382390SJung-uk Kim                     }
4597e382390SJung-uk Kim 
4607e382390SJung-uk Kim 
4617e382390SJung-uk Kim 	\"[^"\n]*\"	{
4627e382390SJung-uk Kim 			if(yyleng-1 < MAXLINE)
4637e382390SJung-uk Kim         		 {
4647e382390SJung-uk Kim 			strncpy( nmstr, yytext + 1, sizeof(nmstr) );
4657e382390SJung-uk Kim 			 }
4667e382390SJung-uk Kim 			else
4677e382390SJung-uk Kim 			 {
4687e382390SJung-uk Kim 			   synerr( _("Option line too long\n"));
4697e382390SJung-uk Kim 			   FLEX_EXIT(EXIT_FAILURE);
4707e382390SJung-uk Kim 			 }
4717e382390SJung-uk Kim 			nmstr[strlen( nmstr ) - 1] = '\0';
4727e382390SJung-uk Kim 			return NAME;
4737e382390SJung-uk Kim 			}
4747e382390SJung-uk Kim 
4757e382390SJung-uk Kim 	(([a-mo-z]|n[a-np-z])[[:alpha:]\-+]*)|.	{
4767e382390SJung-uk Kim 			format_synerr( _( "unrecognized %%option: %s" ),
4777e382390SJung-uk Kim 				yytext );
4787e382390SJung-uk Kim 			BEGIN(RECOVER);
4797e382390SJung-uk Kim 			}
4807e382390SJung-uk Kim }
4817e382390SJung-uk Kim 
4827e382390SJung-uk Kim <RECOVER>.*{NL}		++linenum; BEGIN(INITIAL);
4837e382390SJung-uk Kim 
4847e382390SJung-uk Kim 
4857e382390SJung-uk Kim <SECT2PROLOG>{
4867e382390SJung-uk Kim 	^"%{".*	++bracelevel; yyless( 2 );	/* eat only %{ */
4877e382390SJung-uk Kim 	^"%}".*	--bracelevel; yyless( 2 );	/* eat only %} */
4887e382390SJung-uk Kim 
4897e382390SJung-uk Kim 	^{WS} START_CODEBLOCK(true); /* indented code in prolog */
4907e382390SJung-uk Kim 
4917e382390SJung-uk Kim 	^{NOT_WS}.*	{
4927e382390SJung-uk Kim         /* non-indented code */
4937e382390SJung-uk Kim 		if ( bracelevel <= 0 ) {
4947e382390SJung-uk Kim             /* not in %{ ... %} */
4957e382390SJung-uk Kim             yyless( 0 );	/* put it all back */
4967e382390SJung-uk Kim             yy_set_bol( 1 );
4977e382390SJung-uk Kim             mark_prolog();
4987e382390SJung-uk Kim             BEGIN(SECT2);
4997e382390SJung-uk Kim         } else {
5007e382390SJung-uk Kim             START_CODEBLOCK(true);
5017e382390SJung-uk Kim         }
5027e382390SJung-uk Kim     }
5037e382390SJung-uk Kim 
5047e382390SJung-uk Kim 	.		ACTION_ECHO;
5057e382390SJung-uk Kim 	{NL}	++linenum; ACTION_ECHO;
5067e382390SJung-uk Kim 
5077e382390SJung-uk Kim 	<<EOF>>		{
5087e382390SJung-uk Kim 			mark_prolog();
5097e382390SJung-uk Kim 			sectnum = 0;
5107e382390SJung-uk Kim 			yyterminate(); /* to stop the parser */
5117e382390SJung-uk Kim 			}
5127e382390SJung-uk Kim }
5137e382390SJung-uk Kim 
5147e382390SJung-uk Kim <SECT2>{
5157e382390SJung-uk Kim 	^{OPTWS}{NL}	++linenum; /* allow blank lines in section 2 */
5167e382390SJung-uk Kim 
5177e382390SJung-uk Kim 	^{OPTWS}"%{"	{
5187e382390SJung-uk Kim 			indented_code = false;
5197e382390SJung-uk Kim 			doing_codeblock = true;
5207e382390SJung-uk Kim 			bracelevel = 1;
5217e382390SJung-uk Kim 			BEGIN(PERCENT_BRACE_ACTION);
5227e382390SJung-uk Kim 			}
5237e382390SJung-uk Kim 
5247e382390SJung-uk Kim 	^{OPTWS}"<"	    {
5257e382390SJung-uk Kim                         /* Allow "<" to appear in (?x) patterns. */
5267e382390SJung-uk Kim                         if (!sf_skip_ws())
5277e382390SJung-uk Kim                             BEGIN(SC);
5287e382390SJung-uk Kim                         return '<';
5297e382390SJung-uk Kim                     }
5307e382390SJung-uk Kim 	^{OPTWS}"^"	return '^';
5317e382390SJung-uk Kim 	\"		BEGIN(QUOTE); return '"';
5327e382390SJung-uk Kim 	"{"/[[:digit:]]	{
5337e382390SJung-uk Kim 			BEGIN(NUM);
5347e382390SJung-uk Kim 			if ( lex_compat || posix_compat )
5357e382390SJung-uk Kim 				return BEGIN_REPEAT_POSIX;
5367e382390SJung-uk Kim 			else
5377e382390SJung-uk Kim 				return BEGIN_REPEAT_FLEX;
5387e382390SJung-uk Kim 			}
5397e382390SJung-uk Kim 	"$"/([[:blank:]]|{NL})	return '$';
5407e382390SJung-uk Kim 
5417e382390SJung-uk Kim 	{WS}"%{"		{
5427e382390SJung-uk Kim 			bracelevel = 1;
5437e382390SJung-uk Kim 			BEGIN(PERCENT_BRACE_ACTION);
5447e382390SJung-uk Kim 
5457e382390SJung-uk Kim 			if ( in_rule )
5467e382390SJung-uk Kim 				{
5477e382390SJung-uk Kim 				doing_rule_action = true;
5487e382390SJung-uk Kim 				in_rule = false;
5497e382390SJung-uk Kim 				return '\n';
5507e382390SJung-uk Kim 				}
5517e382390SJung-uk Kim 			}
5527e382390SJung-uk Kim 	{WS}"|".*{NL}	{
5537e382390SJung-uk Kim                         if (sf_skip_ws()){
5547e382390SJung-uk Kim                             /* We're in the middle of a (?x: ) pattern. */
5557e382390SJung-uk Kim                             /* Push back everything starting at the "|" */
5567e382390SJung-uk Kim                             int amt = (int) (strchr (yytext, '|') - yytext);
5577e382390SJung-uk Kim                             yyless(amt);
5587e382390SJung-uk Kim                         }
5597e382390SJung-uk Kim                         else {
5607e382390SJung-uk Kim                             add_action("]""]");
5617e382390SJung-uk Kim                             continued_action = true;
5627e382390SJung-uk Kim                             ++linenum;
5637e382390SJung-uk Kim                             return '\n';
5647e382390SJung-uk Kim                         }
5657e382390SJung-uk Kim                     }
5667e382390SJung-uk Kim 
5677e382390SJung-uk Kim 	^{WS}"/*"	{
5687e382390SJung-uk Kim 
5697e382390SJung-uk Kim                 if (sf_skip_ws()){
5707e382390SJung-uk Kim                     /* We're in the middle of a (?x: ) pattern. */
5717e382390SJung-uk Kim                     yy_push_state(COMMENT_DISCARD);
5727e382390SJung-uk Kim                 }
5737e382390SJung-uk Kim                 else{
5747e382390SJung-uk Kim                     yyless( yyleng - 2 );	/* put back '/', '*' */
5757e382390SJung-uk Kim                     bracelevel = 0;
5767e382390SJung-uk Kim                     continued_action = false;
5777e382390SJung-uk Kim                     BEGIN(ACTION);
5787e382390SJung-uk Kim                 }
5797e382390SJung-uk Kim 			}
5807e382390SJung-uk Kim 
5817e382390SJung-uk Kim 	^{WS}		/* allow indented rules */ ;
5827e382390SJung-uk Kim 
5837e382390SJung-uk Kim 	{WS}		{
5847e382390SJung-uk Kim             if (sf_skip_ws()){
5857e382390SJung-uk Kim                 /* We're in the middle of a (?x: ) pattern. */
5867e382390SJung-uk Kim             }
5877e382390SJung-uk Kim             else{
5887e382390SJung-uk Kim                 /* This rule is separate from the one below because
5897e382390SJung-uk Kim                  * otherwise we get variable trailing context, so
5907e382390SJung-uk Kim                  * we can't build the scanner using -{f,F}.
5917e382390SJung-uk Kim                  */
5927e382390SJung-uk Kim                 bracelevel = 0;
5937e382390SJung-uk Kim                 continued_action = false;
5947e382390SJung-uk Kim                 BEGIN(ACTION);
5957e382390SJung-uk Kim 
5967e382390SJung-uk Kim                 if ( in_rule )
5977e382390SJung-uk Kim                     {
5987e382390SJung-uk Kim                     doing_rule_action = true;
5997e382390SJung-uk Kim                     in_rule = false;
6007e382390SJung-uk Kim                     return '\n';
6017e382390SJung-uk Kim                     }
6027e382390SJung-uk Kim             }
6037e382390SJung-uk Kim 			}
6047e382390SJung-uk Kim 
6057e382390SJung-uk Kim 	{OPTWS}{NL}	{
6067e382390SJung-uk Kim             if (sf_skip_ws()){
6077e382390SJung-uk Kim                 /* We're in the middle of a (?x: ) pattern. */
6087e382390SJung-uk Kim                 ++linenum;
6097e382390SJung-uk Kim             }
6107e382390SJung-uk Kim             else{
6117e382390SJung-uk Kim                 bracelevel = 0;
6127e382390SJung-uk Kim                 continued_action = false;
6137e382390SJung-uk Kim                 BEGIN(ACTION);
6147e382390SJung-uk Kim                 unput( '\n' );	/* so <ACTION> sees it */
6157e382390SJung-uk Kim 
6167e382390SJung-uk Kim                 if ( in_rule )
6177e382390SJung-uk Kim                     {
6187e382390SJung-uk Kim                     doing_rule_action = true;
6197e382390SJung-uk Kim                     in_rule = false;
6207e382390SJung-uk Kim                     return '\n';
6217e382390SJung-uk Kim                     }
6227e382390SJung-uk Kim             }
6237e382390SJung-uk Kim 			}
6247e382390SJung-uk Kim 
6257e382390SJung-uk Kim 	^{OPTWS}"<<EOF>>"	|
6267e382390SJung-uk Kim 	"<<EOF>>"	return EOF_OP;
6277e382390SJung-uk Kim 
6287e382390SJung-uk Kim 	^"%%".*		{
6297e382390SJung-uk Kim 			sectnum = 3;
6307e382390SJung-uk Kim 			BEGIN(no_section3_escape ? SECT3_NOESCAPE : SECT3);
6317e382390SJung-uk Kim 			outn("/* Begin user sect3 */");
6327e382390SJung-uk Kim 			yyterminate(); /* to stop the parser */
6337e382390SJung-uk Kim 
6347e382390SJung-uk Kim 			}
6357e382390SJung-uk Kim 
6367e382390SJung-uk Kim 	"["({FIRST_CCL_CHAR}|{CCL_EXPR})({CCL_CHAR}|{CCL_EXPR})*	{
6377e382390SJung-uk Kim 			int cclval;
6387e382390SJung-uk Kim 
6397e382390SJung-uk Kim 			if(yyleng < MAXLINE)
6407e382390SJung-uk Kim         		 {
6417e382390SJung-uk Kim 			strncpy( nmstr, yytext, sizeof(nmstr) );
6427e382390SJung-uk Kim 			 }
6437e382390SJung-uk Kim 			else
6447e382390SJung-uk Kim 			 {
6457e382390SJung-uk Kim 			   synerr( _("Input line too long\n"));
6467e382390SJung-uk Kim 			   FLEX_EXIT(EXIT_FAILURE);
6477e382390SJung-uk Kim 			 }
6487e382390SJung-uk Kim 
6497e382390SJung-uk Kim 			/* Check to see if we've already encountered this
6507e382390SJung-uk Kim 			 * ccl.
6517e382390SJung-uk Kim 			 */
6527e382390SJung-uk Kim 			if (0 /* <--- This "0" effectively disables the reuse of a
6537e382390SJung-uk Kim                    * character class (purely based on its source text).
6547e382390SJung-uk Kim                    * The reason it was disabled is so yacc/bison can parse
6557e382390SJung-uk Kim                    * ccl operations, such as ccl difference and union.
6567e382390SJung-uk Kim                    */
6577e382390SJung-uk Kim                 &&  (cclval = ccllookup( nmstr )) != 0 )
6587e382390SJung-uk Kim 				{
6597e382390SJung-uk Kim 				if ( input() != ']' )
6607e382390SJung-uk Kim 					synerr( _( "bad character class" ) );
6617e382390SJung-uk Kim 
6627e382390SJung-uk Kim 				yylval = cclval;
6637e382390SJung-uk Kim 				++cclreuse;
6647e382390SJung-uk Kim 				return PREVCCL;
6657e382390SJung-uk Kim 				}
6667e382390SJung-uk Kim 			else
6677e382390SJung-uk Kim 				{
6687e382390SJung-uk Kim 				/* We fudge a bit.  We know that this ccl will
6697e382390SJung-uk Kim 				 * soon be numbered as lastccl + 1 by cclinit.
6707e382390SJung-uk Kim 				 */
6717e382390SJung-uk Kim 				cclinstal( nmstr, lastccl + 1 );
6727e382390SJung-uk Kim 
6737e382390SJung-uk Kim 				/* Push back everything but the leading bracket
6747e382390SJung-uk Kim 				 * so the ccl can be rescanned.
6757e382390SJung-uk Kim 				 */
6767e382390SJung-uk Kim 				yyless( 1 );
6777e382390SJung-uk Kim 
6787e382390SJung-uk Kim 				BEGIN(FIRSTCCL);
6797e382390SJung-uk Kim 				return '[';
6807e382390SJung-uk Kim 				}
6817e382390SJung-uk Kim 			}
6827e382390SJung-uk Kim     "{-}"       return CCL_OP_DIFF;
6837e382390SJung-uk Kim     "{+}"       return CCL_OP_UNION;
6847e382390SJung-uk Kim 
6857e382390SJung-uk Kim 
6867e382390SJung-uk Kim     /* Check for :space: at the end of the rule so we don't
6877e382390SJung-uk Kim      * wrap the expanded regex in '(' ')' -- breaking trailing
6887e382390SJung-uk Kim      * context.
6897e382390SJung-uk Kim      */
6907e382390SJung-uk Kim 	"{"{NAME}"}"[[:space:]]?	 {
6917e382390SJung-uk Kim 			char *nmdefptr;
6927e382390SJung-uk Kim             int end_is_ws, end_ch;
6937e382390SJung-uk Kim 
6947e382390SJung-uk Kim             end_ch = yytext[yyleng-1];
6957e382390SJung-uk Kim             end_is_ws = end_ch != '}' ? 1 : 0;
6967e382390SJung-uk Kim 
6977e382390SJung-uk Kim  			if(yyleng-1 < MAXLINE)
6987e382390SJung-uk Kim          		 {
6997e382390SJung-uk Kim 			strncpy( nmstr, yytext + 1, sizeof(nmstr) );
7007e382390SJung-uk Kim  			 }
7017e382390SJung-uk Kim  			else
7027e382390SJung-uk Kim  			 {
7037e382390SJung-uk Kim  			   synerr( _("Input line too long\n"));
7047e382390SJung-uk Kim  			   FLEX_EXIT(EXIT_FAILURE);
7057e382390SJung-uk Kim  			 }
7067e382390SJung-uk Kim nmstr[yyleng - 2 - end_is_ws] = '\0';  /* chop trailing brace */
7077e382390SJung-uk Kim 
708*34e67bb5SJung-uk Kim 			if ( (nmdefptr = ndlookup( nmstr )) == NULL )
7097e382390SJung-uk Kim 				format_synerr(
7107e382390SJung-uk Kim 					_( "undefined definition {%s}" ),
7117e382390SJung-uk Kim 						nmstr );
7127e382390SJung-uk Kim 
7137e382390SJung-uk Kim 			else
7147e382390SJung-uk Kim 				{ /* push back name surrounded by ()'s */
7157e382390SJung-uk Kim 				size_t len = strlen( nmdefptr );
7167e382390SJung-uk Kim                 if (end_is_ws)
7177e382390SJung-uk Kim                     unput(end_ch);
7187e382390SJung-uk Kim 
7197e382390SJung-uk Kim 				if ( lex_compat || nmdefptr[0] == '^' ||
7207e382390SJung-uk Kim 				     (len > 0 && nmdefptr[len - 1] == '$')
7217e382390SJung-uk Kim                      || (end_is_ws && trlcontxt && !sf_skip_ws()))
7227e382390SJung-uk Kim 					{ /* don't use ()'s after all */
7237e382390SJung-uk Kim 					PUT_BACK_STRING(nmdefptr, 0);
7247e382390SJung-uk Kim 
7257e382390SJung-uk Kim 					if ( nmdefptr[0] == '^' )
7267e382390SJung-uk Kim 						BEGIN(CARETISBOL);
7277e382390SJung-uk Kim 					}
7287e382390SJung-uk Kim 
7297e382390SJung-uk Kim 				else
7307e382390SJung-uk Kim 					{
7317e382390SJung-uk Kim 					unput(')');
7327e382390SJung-uk Kim 					PUT_BACK_STRING(nmdefptr, 0);
7337e382390SJung-uk Kim 					unput('(');
7347e382390SJung-uk Kim 					}
7357e382390SJung-uk Kim 				}
7367e382390SJung-uk Kim 			}
7377e382390SJung-uk Kim 
7387e382390SJung-uk Kim     "/*"        {
7397e382390SJung-uk Kim                     if (sf_skip_ws())
7407e382390SJung-uk Kim                         yy_push_state(COMMENT_DISCARD);
7417e382390SJung-uk Kim                     else{
7427e382390SJung-uk Kim                         /* Push back the "*" and return "/" as usual. */
7437e382390SJung-uk Kim                         yyless(1);
7447e382390SJung-uk Kim                         return '/';
7457e382390SJung-uk Kim                     }
7467e382390SJung-uk Kim                 }
7477e382390SJung-uk Kim 
7487e382390SJung-uk Kim     "(?#"       {
7497e382390SJung-uk Kim                     if (lex_compat || posix_compat){
7507e382390SJung-uk Kim                         /* Push back the "?#" and treat it like a normal parens. */
7517e382390SJung-uk Kim                         yyless(1);
7527e382390SJung-uk Kim                         sf_push();
7537e382390SJung-uk Kim                         return '(';
7547e382390SJung-uk Kim                     }
7557e382390SJung-uk Kim                     else
7567e382390SJung-uk Kim                         yy_push_state(EXTENDED_COMMENT);
7577e382390SJung-uk Kim                 }
7587e382390SJung-uk Kim     "(?"        {
7597e382390SJung-uk Kim                     sf_push();
7607e382390SJung-uk Kim                     if (lex_compat || posix_compat)
7617e382390SJung-uk Kim                         /* Push back the "?" and treat it like a normal parens. */
7627e382390SJung-uk Kim                         yyless(1);
7637e382390SJung-uk Kim                     else
7647e382390SJung-uk Kim                         BEGIN(GROUP_WITH_PARAMS);
7657e382390SJung-uk Kim                     return '(';
7667e382390SJung-uk Kim                 }
7677e382390SJung-uk Kim     "("         sf_push(); return '(';
7687e382390SJung-uk Kim     ")"         {
7697e382390SJung-uk Kim                     if (_sf_top_ix > 0) {
7707e382390SJung-uk Kim                         sf_pop();
7717e382390SJung-uk Kim                         return ')';
7727e382390SJung-uk Kim                     } else
7737e382390SJung-uk Kim                         synerr(_("unbalanced parenthesis"));
7747e382390SJung-uk Kim                 }
7757e382390SJung-uk Kim 
7767e382390SJung-uk Kim 	[/|*+?.(){}]	return (unsigned char) yytext[0];
7777e382390SJung-uk Kim 	.		RETURNCHAR;
7787e382390SJung-uk Kim }
7797e382390SJung-uk Kim 
7807e382390SJung-uk Kim 
7817e382390SJung-uk Kim <SC>{
7827e382390SJung-uk Kim 	{OPTWS}{NL}{OPTWS}	++linenum;	/* Allow blank lines & continuations */
7837e382390SJung-uk Kim 	[,*]		return (unsigned char) yytext[0];
7847e382390SJung-uk Kim 	">"		BEGIN(SECT2); return '>';
7857e382390SJung-uk Kim 	">"/^		BEGIN(CARETISBOL); return '>';
7867e382390SJung-uk Kim 	{SCNAME}	RETURNNAME;
7877e382390SJung-uk Kim 	.		{
7887e382390SJung-uk Kim 			format_synerr( _( "bad <start condition>: %s" ),
7897e382390SJung-uk Kim 				yytext );
7907e382390SJung-uk Kim 			}
7917e382390SJung-uk Kim }
7927e382390SJung-uk Kim 
7937e382390SJung-uk Kim <CARETISBOL>"^"		BEGIN(SECT2); return '^';
7947e382390SJung-uk Kim 
7957e382390SJung-uk Kim 
7967e382390SJung-uk Kim <QUOTE>{
7977e382390SJung-uk Kim 	[^"\n]		RETURNCHAR;
7987e382390SJung-uk Kim 	\"		BEGIN(SECT2); return '"';
7997e382390SJung-uk Kim 
8007e382390SJung-uk Kim 	{NL}		{
8017e382390SJung-uk Kim 			synerr( _( "missing quote" ) );
8027e382390SJung-uk Kim 			BEGIN(SECT2);
8037e382390SJung-uk Kim 			++linenum;
8047e382390SJung-uk Kim 			return '"';
8057e382390SJung-uk Kim 			}
8067e382390SJung-uk Kim }
8077e382390SJung-uk Kim 
8087e382390SJung-uk Kim <GROUP_WITH_PARAMS>{
8097e382390SJung-uk Kim     ":"     BEGIN(SECT2);
8107e382390SJung-uk Kim     "-"     BEGIN(GROUP_MINUS_PARAMS);
8117e382390SJung-uk Kim     i       sf_set_case_ins(1);
8127e382390SJung-uk Kim     s       sf_set_dot_all(1);
8137e382390SJung-uk Kim     x       sf_set_skip_ws(1);
8147e382390SJung-uk Kim }
8157e382390SJung-uk Kim <GROUP_MINUS_PARAMS>{
8167e382390SJung-uk Kim     ":"     BEGIN(SECT2);
8177e382390SJung-uk Kim     i       sf_set_case_ins(0);
8187e382390SJung-uk Kim     s       sf_set_dot_all(0);
8197e382390SJung-uk Kim     x       sf_set_skip_ws(0);
8207e382390SJung-uk Kim }
8217e382390SJung-uk Kim 
8227e382390SJung-uk Kim <FIRSTCCL>{
8237e382390SJung-uk Kim 	"^"/[^-\]\n]	BEGIN(CCL); return '^';
8247e382390SJung-uk Kim 	"^"/("-"|"]")	return '^';
8257e382390SJung-uk Kim 	.		BEGIN(CCL); RETURNCHAR;
8267e382390SJung-uk Kim }
8277e382390SJung-uk Kim 
8287e382390SJung-uk Kim <CCL>{
8297e382390SJung-uk Kim 	-/[^\]\n]	return '-';
8307e382390SJung-uk Kim 	[^\]\n]		RETURNCHAR;
8317e382390SJung-uk Kim 	"]"		BEGIN(SECT2); return ']';
8327e382390SJung-uk Kim 	.|{NL}		{
8337e382390SJung-uk Kim 			synerr( _( "bad character class" ) );
8347e382390SJung-uk Kim 			BEGIN(SECT2);
8357e382390SJung-uk Kim 			return ']';
8367e382390SJung-uk Kim 			}
8377e382390SJung-uk Kim }
8387e382390SJung-uk Kim 
8397e382390SJung-uk Kim <FIRSTCCL,CCL>{
8407e382390SJung-uk Kim 	"[:alnum:]"	BEGIN(CCL); return CCE_ALNUM;
8417e382390SJung-uk Kim 	"[:alpha:]"	BEGIN(CCL); return CCE_ALPHA;
8427e382390SJung-uk Kim 	"[:blank:]"	BEGIN(CCL); return CCE_BLANK;
8437e382390SJung-uk Kim 	"[:cntrl:]"	BEGIN(CCL); return CCE_CNTRL;
8447e382390SJung-uk Kim 	"[:digit:]"	BEGIN(CCL); return CCE_DIGIT;
8457e382390SJung-uk Kim 	"[:graph:]"	BEGIN(CCL); return CCE_GRAPH;
8467e382390SJung-uk Kim 	"[:lower:]"	BEGIN(CCL); return CCE_LOWER;
8477e382390SJung-uk Kim 	"[:print:]"	BEGIN(CCL); return CCE_PRINT;
8487e382390SJung-uk Kim 	"[:punct:]"	BEGIN(CCL); return CCE_PUNCT;
8497e382390SJung-uk Kim 	"[:space:]"	BEGIN(CCL); return CCE_SPACE;
8507e382390SJung-uk Kim 	"[:upper:]"	BEGIN(CCL); return CCE_UPPER;
8517e382390SJung-uk Kim 	"[:xdigit:]"	BEGIN(CCL); return CCE_XDIGIT;
8527e382390SJung-uk Kim 
8537e382390SJung-uk Kim 	"[:^alnum:]"	BEGIN(CCL); return CCE_NEG_ALNUM;
8547e382390SJung-uk Kim 	"[:^alpha:]"	BEGIN(CCL); return CCE_NEG_ALPHA;
8557e382390SJung-uk Kim 	"[:^blank:]"	BEGIN(CCL); return CCE_NEG_BLANK;
8567e382390SJung-uk Kim 	"[:^cntrl:]"	BEGIN(CCL); return CCE_NEG_CNTRL;
8577e382390SJung-uk Kim 	"[:^digit:]"	BEGIN(CCL); return CCE_NEG_DIGIT;
8587e382390SJung-uk Kim 	"[:^graph:]"	BEGIN(CCL); return CCE_NEG_GRAPH;
8597e382390SJung-uk Kim 	"[:^lower:]"	BEGIN(CCL); return CCE_NEG_LOWER;
8607e382390SJung-uk Kim 	"[:^print:]"	BEGIN(CCL); return CCE_NEG_PRINT;
8617e382390SJung-uk Kim 	"[:^punct:]"	BEGIN(CCL); return CCE_NEG_PUNCT;
8627e382390SJung-uk Kim 	"[:^space:]"	BEGIN(CCL); return CCE_NEG_SPACE;
8637e382390SJung-uk Kim 	"[:^upper:]"	BEGIN(CCL); return CCE_NEG_UPPER;
8647e382390SJung-uk Kim 	"[:^xdigit:]"	BEGIN(CCL); return CCE_NEG_XDIGIT;
8657e382390SJung-uk Kim 	{CCL_EXPR}	{
8667e382390SJung-uk Kim 			format_synerr(
8677e382390SJung-uk Kim 				_( "bad character class expression: %s" ),
8687e382390SJung-uk Kim 					yytext );
8697e382390SJung-uk Kim 			BEGIN(CCL); return CCE_ALNUM;
8707e382390SJung-uk Kim 			}
8717e382390SJung-uk Kim }
8727e382390SJung-uk Kim 
8737e382390SJung-uk Kim <NUM>{
8747e382390SJung-uk Kim 	[[:digit:]]+	{
8757e382390SJung-uk Kim 			yylval = myctoi( yytext );
8767e382390SJung-uk Kim 			return NUMBER;
8777e382390SJung-uk Kim 			}
8787e382390SJung-uk Kim 
8797e382390SJung-uk Kim 	","		return ',';
8807e382390SJung-uk Kim 	"}"		{
8817e382390SJung-uk Kim 			BEGIN(SECT2);
8827e382390SJung-uk Kim 			if ( lex_compat || posix_compat )
8837e382390SJung-uk Kim 				return END_REPEAT_POSIX;
8847e382390SJung-uk Kim 			else
8857e382390SJung-uk Kim 				return END_REPEAT_FLEX;
8867e382390SJung-uk Kim 			}
8877e382390SJung-uk Kim 
8887e382390SJung-uk Kim 	.		{
8897e382390SJung-uk Kim 			synerr( _( "bad character inside {}'s" ) );
8907e382390SJung-uk Kim 			BEGIN(SECT2);
8917e382390SJung-uk Kim 			return '}';
8927e382390SJung-uk Kim 			}
8937e382390SJung-uk Kim 
8947e382390SJung-uk Kim 	{NL}		{
8957e382390SJung-uk Kim 			synerr( _( "missing }" ) );
8967e382390SJung-uk Kim 			BEGIN(SECT2);
8977e382390SJung-uk Kim 			++linenum;
8987e382390SJung-uk Kim 			return '}';
8997e382390SJung-uk Kim 			}
9007e382390SJung-uk Kim }
9017e382390SJung-uk Kim 
9027e382390SJung-uk Kim 
9037e382390SJung-uk Kim <PERCENT_BRACE_ACTION>{
9047e382390SJung-uk Kim 	{OPTWS}"%}".*		bracelevel = 0;
9057e382390SJung-uk Kim 
9067e382390SJung-uk Kim 	<ACTION>"/*"		ACTION_ECHO; yy_push_state( CODE_COMMENT );
9077e382390SJung-uk Kim 
9087e382390SJung-uk Kim 	<CODEBLOCK,ACTION>{
9097e382390SJung-uk Kim 		"reject" {
9107e382390SJung-uk Kim             ACTION_ECHO;
9117e382390SJung-uk Kim             CHECK_REJECT(yytext);
9127e382390SJung-uk Kim         }
9137e382390SJung-uk Kim 		"yymore" {
9147e382390SJung-uk Kim             ACTION_ECHO;
9157e382390SJung-uk Kim             CHECK_YYMORE(yytext);
9167e382390SJung-uk Kim         }
9177e382390SJung-uk Kim 	}
9187e382390SJung-uk Kim 
9197e382390SJung-uk Kim     .       ACTION_ECHO;
9207e382390SJung-uk Kim 	{NL}	{
9217e382390SJung-uk Kim 		++linenum;
9227e382390SJung-uk Kim 		ACTION_ECHO;
9237e382390SJung-uk Kim 		if (bracelevel <= 0 || (doing_codeblock && indented_code)) {
9247e382390SJung-uk Kim             if ( doing_rule_action )
9257e382390SJung-uk Kim                 add_action( "\tYY_BREAK]""]\n" );
9267e382390SJung-uk Kim 
9277e382390SJung-uk Kim             doing_rule_action = doing_codeblock = false;
9287e382390SJung-uk Kim             BEGIN(SECT2);
9297e382390SJung-uk Kim         }
9307e382390SJung-uk Kim     }
9317e382390SJung-uk Kim }
9327e382390SJung-uk Kim 
9337e382390SJung-uk Kim 
9347e382390SJung-uk Kim 	/* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */
9357e382390SJung-uk Kim <ACTION>{
9367e382390SJung-uk Kim 	"{"		ACTION_ECHO; ++bracelevel;
9377e382390SJung-uk Kim 	"}"		ACTION_ECHO; --bracelevel;
9387e382390SJung-uk Kim 	[^[:alpha:]_{}\"'/\n\[\]]+	ACTION_ECHO;
9397e382390SJung-uk Kim         {NAME}		ACTION_ECHO;
9407e382390SJung-uk Kim         "'"([^\'\\\n]|\\.)"'" ACTION_ECHO; /* character constant */
9417e382390SJung-uk Kim         "'"             ACTION_ECHO; BEGIN(CHARACTER_CONSTANT);
9427e382390SJung-uk Kim 	\"		ACTION_ECHO; BEGIN(ACTION_STRING);
9437e382390SJung-uk Kim 	{NL} {
9447e382390SJung-uk Kim                 ++linenum;
9457e382390SJung-uk Kim                 ACTION_ECHO;
9467e382390SJung-uk Kim                 if (bracelevel <= 0) {
9477e382390SJung-uk Kim                    if ( doing_rule_action )
9487e382390SJung-uk Kim                       add_action( "\tYY_BREAK]""]\n" );
9497e382390SJung-uk Kim 
9507e382390SJung-uk Kim                    doing_rule_action = false;
9517e382390SJung-uk Kim                    BEGIN(SECT2);
9527e382390SJung-uk Kim                 }
9537e382390SJung-uk Kim              }
9547e382390SJung-uk Kim         .      ACTION_ECHO;
9557e382390SJung-uk Kim }
9567e382390SJung-uk Kim 
9577e382390SJung-uk Kim <ACTION_STRING>{
9587e382390SJung-uk Kim 	[^\[\]\"\\\n]+	ACTION_ECHO;
9597e382390SJung-uk Kim 	\"		ACTION_ECHO; BEGIN(ACTION);
9607e382390SJung-uk Kim }
9617e382390SJung-uk Kim <CHARACTER_CONSTANT>{
9627e382390SJung-uk Kim 	[^\[\]\'\\\n]+  ACTION_ECHO;
9637e382390SJung-uk Kim         \'              ACTION_ECHO; BEGIN(ACTION);
9647e382390SJung-uk Kim }
9657e382390SJung-uk Kim <ACTION_STRING,CHARACTER_CONSTANT>{
9667e382390SJung-uk Kim         (\\\n)*         ACTION_ECHO;
9677e382390SJung-uk Kim 	\\(\\\n)*.	ACTION_ECHO;
9687e382390SJung-uk Kim 	{NL}	++linenum; ACTION_ECHO; if (bracelevel <= 0) { BEGIN(SECT2); } else { BEGIN(ACTION); }
9697e382390SJung-uk Kim         .	ACTION_ECHO;
9707e382390SJung-uk Kim }
9717e382390SJung-uk Kim 
9727e382390SJung-uk Kim <COMMENT,CODE_COMMENT,COMMENT_DISCARD,ACTION,ACTION_STRING,CHARACTER_CONSTANT><<EOF>>	{
9737e382390SJung-uk Kim 			synerr( _( "EOF encountered inside an action" ) );
9747e382390SJung-uk Kim 			yyterminate();
9757e382390SJung-uk Kim 			}
9767e382390SJung-uk Kim 
9777e382390SJung-uk Kim <EXTENDED_COMMENT,GROUP_WITH_PARAMS,GROUP_MINUS_PARAMS><<EOF>>	{
9787e382390SJung-uk Kim 			synerr( _( "EOF encountered inside pattern" ) );
9797e382390SJung-uk Kim 			yyterminate();
9807e382390SJung-uk Kim 			}
9817e382390SJung-uk Kim 
9827e382390SJung-uk Kim <SECT2,QUOTE,FIRSTCCL,CCL>{ESCSEQ}	{
9837e382390SJung-uk Kim 			yylval = myesc( (unsigned char *) yytext );
9847e382390SJung-uk Kim 
9857e382390SJung-uk Kim 			if ( YY_START == FIRSTCCL )
9867e382390SJung-uk Kim 				BEGIN(CCL);
9877e382390SJung-uk Kim 
9887e382390SJung-uk Kim 			return CHAR;
9897e382390SJung-uk Kim 			}
9907e382390SJung-uk Kim 
9917e382390SJung-uk Kim <SECT3>{
9927e382390SJung-uk Kim     {M4QSTART}   fputs(escaped_qstart, yyout);
9937e382390SJung-uk Kim     {M4QEND}     fputs(escaped_qend, yyout);
9947e382390SJung-uk Kim     [^\[\]]*     ECHO;
9957e382390SJung-uk Kim     [][]         ECHO;
9967e382390SJung-uk Kim     <<EOF>>      {
9977e382390SJung-uk Kim         sectnum = 0;
9987e382390SJung-uk Kim         yyterminate();
9997e382390SJung-uk Kim     }
10007e382390SJung-uk Kim }
10017e382390SJung-uk Kim <SECT3_NOESCAPE>{
10027e382390SJung-uk Kim     {M4QSTART}  fprintf(yyout, "[""[%s]""]", escaped_qstart);
10037e382390SJung-uk Kim     {M4QEND}    fprintf(yyout, "[""[%s]""]", escaped_qend);
10047e382390SJung-uk Kim     [^][]*      ECHO;
10057e382390SJung-uk Kim     [][]        ECHO;
10067e382390SJung-uk Kim     <<EOF>>		{
10077e382390SJung-uk Kim        sectnum = 0;
10087e382390SJung-uk Kim        yyterminate();
10097e382390SJung-uk Kim     }
10107e382390SJung-uk Kim }
10117e382390SJung-uk Kim <*>.|\n			format_synerr( _( "bad character: %s" ), yytext );
10127e382390SJung-uk Kim 
10137e382390SJung-uk Kim %%
10147e382390SJung-uk Kim 
10157e382390SJung-uk Kim 
10167e382390SJung-uk Kim int yywrap(void)
10177e382390SJung-uk Kim 	{
10187e382390SJung-uk Kim 	if ( --num_input_files > 0 )
10197e382390SJung-uk Kim 		{
10207e382390SJung-uk Kim 		set_input_file( *++input_files );
10217e382390SJung-uk Kim 		return 0;
10227e382390SJung-uk Kim 		}
10237e382390SJung-uk Kim 
10247e382390SJung-uk Kim 	else
10257e382390SJung-uk Kim 		return 1;
10267e382390SJung-uk Kim 	}
10277e382390SJung-uk Kim 
10287e382390SJung-uk Kim 
10297e382390SJung-uk Kim /* set_input_file - open the given file (if NULL, stdin) for scanning */
10307e382390SJung-uk Kim 
10317e382390SJung-uk Kim void set_input_file( char *file )
10327e382390SJung-uk Kim 	{
10337e382390SJung-uk Kim 	if ( file && strcmp( file, "-" ) )
10347e382390SJung-uk Kim 		{
10357e382390SJung-uk Kim 		infilename = xstrdup(file);
10367e382390SJung-uk Kim 		yyin = fopen( infilename, "r" );
10377e382390SJung-uk Kim 
10387e382390SJung-uk Kim 		if ( yyin == NULL )
10397e382390SJung-uk Kim 			lerr( _( "can't open %s" ), file );
10407e382390SJung-uk Kim 		}
10417e382390SJung-uk Kim 
10427e382390SJung-uk Kim 	else
10437e382390SJung-uk Kim 		{
10447e382390SJung-uk Kim 		yyin = stdin;
10457e382390SJung-uk Kim 		infilename = xstrdup("<stdin>");
10467e382390SJung-uk Kim 		}
10477e382390SJung-uk Kim 
10487e382390SJung-uk Kim 	linenum = 1;
10497e382390SJung-uk Kim 	}
1050