lineno_trailing.l revision 1.1.1.1
1/* 2 * This file is part of flex. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * Neither the name of the University nor the names of its contributors 15 * may be used to endorse or promote products derived from this software 16 * without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 19 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 * PURPOSE. 22 */ 23 24%{ 25/* A template scanner file to build "scanner.c". 26 Run as: 27 test-lineno-trailing # report flex's yylineno 28 test-lineno-trailing 1 # report count_newlines(stdin) 29*/ 30 31#include <stdio.h> 32#include <stdlib.h> 33#include "config.h" 34 35%} 36 37%option 8bit prefix="test" 38%option nounput nomain noyywrap noinput yylineno 39%option warn 40 41WORD [[:alpha:]]+ 42 43%% 44 /* The goal here is to test the yylineno in the context of trailing-contexts. 45 Using rules that have newlines in look-ahead. 46 */ 47"Fixed_trailing:"/[\n]"test"[\n] {} 48"Var_trailing:"{WORD}/[\n] {} 49"Var_prefix_and_trailing:"{WORD}":"/(\n{WORD})* {} 50\n {} 51. {} 52<<EOF>> { printf("%d\n", yylineno); 53 yyterminate(); 54 } 55 56%% 57 58/* returns number of '\n' characters in input, plus one. 59 This is what flex does, essentially. */ 60 61static int 62count_newlines (FILE* in) 63{ 64 int n=1,c; 65 while ((c=fgetc(in)) != EOF) 66 if( c == '\n') 67 n++; 68 return n; 69} 70 71int main ( int, char**); 72 73int 74main ( argc, argv ) 75 int argc; 76 char** argv; 77{ 78 (void)argv; 79 80 if( argc > 1 ) 81 printf("%d\n", count_newlines(stdin)); 82 83 else{ 84 yyin = stdin; 85 yyout = stdout; 86 yylex(); 87 } 88 return 0; 89} 90