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