| 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-nr    # report flex's yylineno | 
|---|
| 28 | test-lineno-nr 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 outfile="scanner.c" prefix="test" | 
|---|
| 38 | %option nounput nomain noyywrap yylineno | 
|---|
| 39 | %option warn | 
|---|
| 40 |  | 
|---|
| 41 | WORD [[:alpha:]]+ | 
|---|
| 42 | DIGIT [[:digit:]] | 
|---|
| 43 |  | 
|---|
| 44 | %% | 
|---|
| 45 | /* The goal here is to test the yylineno processing by: | 
|---|
| 46 | - providing some rules than CAN match newlines and | 
|---|
| 47 | other rules that can NOT match newlines, | 
|---|
| 48 | - matching several newlines in one rule, | 
|---|
| 49 | - directly modifying yylineno. | 
|---|
| 50 | */ | 
|---|
| 51 |  | 
|---|
| 52 | "yylineno++"          yylineno++; | 
|---|
| 53 | "yylineno--"          yylineno--; | 
|---|
| 54 | [[:blank:]]+ | 
|---|
| 55 | {WORD} | 
|---|
| 56 | {DIGIT}+(\n{DIGIT}+)* | 
|---|
| 57 | \n | 
|---|
| 58 | . | 
|---|
| 59 | <<EOF>>  { printf("%d\n", yylineno); | 
|---|
| 60 | yyterminate(); | 
|---|
| 61 | } | 
|---|
| 62 |  | 
|---|
| 63 | %% | 
|---|
| 64 |  | 
|---|
| 65 | /* returns number of '\n' characters in input, plus one. | 
|---|
| 66 | This is what flex does, essentially. */ | 
|---|
| 67 |  | 
|---|
| 68 | static int | 
|---|
| 69 | count_newlines (FILE* in) | 
|---|
| 70 | { | 
|---|
| 71 | int n=1,c; | 
|---|
| 72 | while ((c=fgetc(in)) != EOF) | 
|---|
| 73 | if( c == '\n') | 
|---|
| 74 | n++; | 
|---|
| 75 | return n; | 
|---|
| 76 | } | 
|---|
| 77 |  | 
|---|
| 78 | int main ( int, char**); | 
|---|
| 79 |  | 
|---|
| 80 | int | 
|---|
| 81 | main ( argc,  argv ) | 
|---|
| 82 | int argc; | 
|---|
| 83 | char** argv; | 
|---|
| 84 | { | 
|---|
| 85 | if( argc > 1 ) | 
|---|
| 86 | printf("%d\n", count_newlines(stdin)); | 
|---|
| 87 |  | 
|---|
| 88 | else{ | 
|---|
| 89 | yyin = stdin; | 
|---|
| 90 | yyout = stdout; | 
|---|
| 91 | yylex(); | 
|---|
| 92 | } | 
|---|
| 93 | return 0; | 
|---|
| 94 | } | 
|---|