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