summaryrefslogtreecommitdiffstats
path: root/Tools/android/flex-2.5.4a/MISC/flex.man
blob: d41f5ba5b3cdbbedb16fea786aa7f85e9ca470e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696



FLEX(1)                  USER COMMANDS                    FLEX(1)



NAME
     flex - fast lexical analyzer generator

SYNOPSIS
     flex [-bcdfhilnpstvwBFILTV78+? -C[aefFmr] -ooutput  -Pprefix
     -Sskeleton] [--help --version] [filename ...]

OVERVIEW
     This manual describes flex, a tool for  generating  programs
     that  perform pattern-matching on text.  The manual includes
     both tutorial and reference sections:

         Description
             a brief overview of the tool

         Some Simple Examples

         Format Of The Input File

         Patterns
             the extended regular expressions used by flex

         How The Input Is Matched
             the rules for determining what has been matched

         Actions
             how to specify what to do when a pattern is matched

         The Generated Scanner
             details regarding the scanner that flex produces;
             how to control the input source

         Start Conditions
             introducing context into your scanners, and
             managing "mini-scanners"

         Multiple Input Buffers
             how to manipulate multiple input sources; how to
             scan from strings instead of files

         End-of-file Rules
             special rules for matching the end of the input

         Miscellaneous Macros
             a summary of macros available to the actions

         Values Available To The User
             a summary of values available to the actions

         Interfacing With Yacc
             connecting flex scanners together with yacc parsers




Version 2.5          Last change: April 1995                    1






FLEX(1)                  USER COMMANDS                    FLEX(1)



         Options
             flex command-line options, and the "%option"
             directive

         Performance Considerations
             how to make your scanner go as fast as possible

         Generating C++ Scanners
             the (experimental) facility for generating C++
             scanner classes

         Incompatibilities With Lex And POSIX
             how flex differs from AT&T lex and the POSIX lex
             standard

         Diagnostics
             those error messages produced by flex (or scanners
             it generates) whose meanings might not be apparent

         Files
             files used by flex

         Deficiencies / Bugs
             known problems with flex

         See Also
             other documentation, related tools

         Author
             includes contact information


DESCRIPTION
     flex is a  tool  for  generating  scanners:  programs  which
     recognized  lexical  patterns in text.  flex reads the given
     input files, or its standard input  if  no  file  names  are
     given,  for  a  description  of  a scanner to generate.  The
     description is in the form of pairs of  regular  expressions
     and  C  code,  called  rules.  flex  generates as output a C
     source file, lex.yy.c, which defines a routine yylex(). This
     file is compiled and linked with the -lfl library to produce
     an executable.  When the executable is run, it analyzes  its
     input  for occurrences of the regular expressions.  Whenever
     it finds one, it executes the corresponding C code.

SOME SIMPLE EXAMPLES
     First some simple examples to get the flavor of how one uses
     flex.  The  following  flex  input specifies a scanner which
     whenever it encounters the string "username" will replace it
     with the user's login name:

         %%



Version 2.5          Last change: April 1995                    2






FLEX(1)                  USER COMMANDS                    FLEX(1)



         username    printf( "%s", getlogin() );

     By default, any text not matched by a flex scanner is copied
     to  the output, so the net effect of this scanner is to copy
     its input file to its output with each occurrence of  "user-
     name"  expanded.   In  this  input,  there is just one rule.
     "username" is the pattern and the "printf"  is  the  action.
     The "%%" marks the beginning of the rules.

     Here's another simple example:

                 int num_lines = 0, num_chars = 0;

         %%
         \n      ++num_lines; ++num_chars;
         .       ++num_chars;

         %%
         main()
                 {
                 yylex();
                 printf( "# of lines = %d, # of chars = %d\n",
                         num_lines, num_chars );
                 }

     This scanner counts the number of characters and the  number
     of  lines in its input (it produces no output other than the
     final report on the counts).  The first  line  declares  two
     globals,  "num_lines"  and "num_chars", which are accessible
     both inside yylex() and in the main() routine declared after
     the  second  "%%".  There are two rules, one which matches a
     newline ("\n") and increments both the line  count  and  the
     character  count,  and one which matches any character other
     than a newline (indicated by the "." regular expression).

     A somewhat more complicated example:

         /* scanner for a toy Pascal-like language */

         %{
         /* need this for the call to atof() below */
         #include <math.h>
         %}

         DIGIT    [0-9]
         ID       [a-z][a-z0-9]*

         %%

         {DIGIT}+    {
                     printf( "An integer: %s (%d)\n", yytext,
                             atoi( yytext ) );



Version 2.5          Last change: April 1995                    3






FLEX(1)                  USER COMMANDS                    FLEX(1)



                     }

         {DIGIT}+"."{DIGIT}*        {
                     printf( "A float: %s (%g)\n", yytext,
                             atof( yytext ) );
                     }

         if|then|begin|end|procedure|function        {
                     printf( "A keyword: %s\n", yytext );
                     }

         {ID}        printf( "An identifier: %s\n", yytext );

         "+"|"-"|"*"|"/"   printf( "An operator: %s\n", yytext );

         "{"[^}\n]*"}"     /* eat up one-line comments */

         [ \t\n]+          /* eat up whitespace */

         .           printf( "Unrecognized character: %s\n", yytext );

         %%

         main( argc, argv )
         int argc;
         char **argv;
             {
             ++argv, --argc;  /* skip over program name */
             if ( argc > 0 )
                     yyin = fopen( argv[0], "r" );
             else
                     yyin = stdin;

             yylex();
             }

     This is the beginnings of a simple scanner  for  a  language
     like  Pascal.   It  identifies different types of tokens and
     reports on what it has seen.

     The details of this example will be explained in the follow-
     ing sections.

FORMAT OF THE INPUT FILE
     The flex input file consists of three sections, separated by
     a line with just %% in it:

         definitions
         %%
         rules
         %%
         user code



Version 2.5          Last change: April 1995                    4






FLEX(1)                  USER COMMANDS                    FLEX(1)



     The definitions section contains declarations of simple name
     definitions  to  simplify  the  scanner  specification,  and
     declarations of start conditions, which are explained  in  a
     later section.

     Name definitions have the form:

         name definition

     The "name" is a word beginning with a letter  or  an  under-
     score  ('_')  followed by zero or more letters, digits, '_',
     or '-' (dash).  The definition is  taken  to  begin  at  the
     first  non-white-space character following the name and con-
     tinuing to the end of the line.  The definition  can  subse-
     quently  be referred to using "{name}", which will expand to
     "(definition)".  For example,

         DIGIT    [0-9]
         ID       [a-z][a-z0-9]*

     defines "DIGIT" to be a regular expression which  matches  a
     single  digit,  and  "ID"  to  be a regular expression which
     matches a letter followed by zero-or-more letters-or-digits.
     A subsequent reference to

         {DIGIT}+"."{DIGIT}*

     is identical to

         ([0-9])+"."([0-9])*

     and matches one-or-more digits followed by a '.' followed by
     zero-or-more digits.

     The rules section of the flex input  contains  a  series  of
     rules of the form:

         pattern   action

     where the pattern must be unindented  and  the  action  must
     begin on the same line.

     See below for a further description of patterns and actions.

     Finally, the user code section is simply copied to  lex.yy.c
     verbatim.   It  is used for companion routines which call or
     are called by the scanner.  The presence of this section  is
     optional;  if it is missing, the second %% in the input file
     may be skipped, too.

     In the definitions and rules sections, any indented text  or
     text  enclosed in %{ and %} is copied verbatim to the output



Version 2.5          Last change: April 1995                    5






FLEX(1)                  USER COMMANDS                    FLEX(1)



     (with the %{}'s removed).  The %{}'s must appear  unindented
     on lines by themselves.

     In the rules section, any indented  or  %{}  text  appearing
     before the first rule may be used to declare variables which
     are local to the scanning routine and  (after  the  declara-
     tions)  code  which  is to be executed whenever the scanning
     routine is entered.  Other indented or %{} text in the  rule
     section  is  still  copied to the output, but its meaning is
     not well-defined and it may well cause  compile-time  errors
     (this feature is present for POSIX compliance; see below for
     other such features).

     In the definitions section (but not in the  rules  section),
     an  unindented comment (i.e., a line beginning with "/*") is
     also copied verbatim to the output up to the next "*/".

PATTERNS
     The patterns in the input are written using an extended  set
     of regular expressions.  These are:

         x          match the character 'x'
         .          any character (byte) except newline
         [xyz]      a "character class"; in this case, the pattern
                      matches either an 'x', a 'y', or a 'z'
         [abj-oZ]   a "character class" with a range in it; matches
                      an 'a', a 'b', any letter from 'j' through 'o',
                      or a 'Z'
         [^A-Z]     a "negated character class", i.e., any character
                      but those in the class.  In this case, any
                      character EXCEPT an uppercase letter.
         [^A-Z\n]   any character EXCEPT an uppercase letter or
                      a newline
         r*         zero or more r's, where r is any regular expression
         r+         one or more r's
         r?         zero or one r's (that is, "an optional r")
         r{2,5}     anywhere from two to five r's
         r{2,}      two or more r's
         r{4}       exactly 4 r's
         {name}     the expansion of the "name" definition
                    (see above)
         "[xyz]\"foo"
                    the literal string: [xyz]"foo
         \X         if X is an 'a', 'b', 'f', 'n', 'r', 't', or 'v',
                      then the ANSI-C interpretation of \x.
                      Otherwise, a literal 'X' (used to escape
                      operators such as '*')
         \0         a NUL character (ASCII code 0)
         \123       the character with octal value 123
         \x2a       the character with hexadecimal value 2a
         (r)        match an r; parentheses are used to override
                      precedence (see below)



Version 2.5          Last change: April 1995                    6






FLEX(1)                  USER COMMANDS                    FLEX(1)



         rs         the regular expression r followed by the
                      regular expression s; called "concatenation"


         r|s        either an r or an s


         r/s        an r but only if it is followed by an s.  The
                      text matched by s is included when determining
                      whether this rule is the "longest match",
                      but is then returned to the input before
                      the action is executed.  So the action only
                      sees the text matched by r.  This type
                      of pattern is called trailing context".
                      (There are some combinations of r/s that flex
                      cannot match correctly; see notes in the
                      Deficiencies / Bugs section below regarding
                      "dangerous trailing context".)
         ^r         an r, but only at the beginning of a line (i.e.,
                      which just starting to scan, or right after a
                      newline has been scanned).
         r$         an r, but only at the end of a line (i.e., just
                      before a newline).  Equivalent to "r/\n".

                    Note that flex's notion of "newline" is exactly
                    whatever the C compiler used to compile flex
                    interprets '\n' as; in particular, on some DOS
                    systems you must either filter out \r's in the
                    input yourself, or explicitly use r/\r\n for "r$".


         <s>r       an r, but only in start condition s (see
                      below for discussion of start conditions)
         <s1,s2,s3>r
                    same, but in any of start conditions s1,
                      s2, or s3
         <*>r       an r in any start condition, even an exclusive one.


         <<EOF>>    an end-of-file
         <s1,s2><<EOF>>
                    an end-of-file when in start condition s1 or s2

     Note that inside of a character class, all  regular  expres-
     sion  operators  lose  their  special  meaning except escape
     ('\') and the character class operators, '-', ']',  and,  at
     the beginning of the class, '^'.

     The regular expressions listed above are  grouped  according
     to  precedence, from highest precedence at the top to lowest
     at the bottom.   Those  grouped  together  have  equal  pre-
     cedence.  For example,



Version 2.5          Last change: April 1995                    7






FLEX(1)                  USER COMMANDS                    FLEX(1)



         foo|bar*

     is the same as

         (foo)|(ba(r*))

     since the '*' operator has higher precedence than concatena-
     tion, and concatenation higher than alternation ('|').  This
     pattern therefore matches either the  string  "foo"  or  the
     string "ba" followed by zero-or-more r's.  To match "foo" or
     zero-or-more "bar"'s, use:

         foo|(bar)*

     and to match zero-or-more "foo"'s-or-"bar"'s:

         (foo|bar)*


     In addition to characters and ranges of characters,  charac-
     ter  classes  can  also contain character class expressions.
     These are expressions enclosed inside [: and  :]  delimiters
     (which themselves must appear between the '[' and ']' of the
     character class; other elements may occur inside the charac-
     ter class, too).  The valid expressions are:

         [:alnum:] [:alpha:] [:blank:]
         [:cntrl:] [:digit:] [:graph:]
         [:lower:] [:print:] [:punct:]
         [:space:] [:upper:] [:xdigit:]

     These  expressions  all  designate  a  set   of   characters
     equivalent  to  the corresponding standard C isXXX function.
     For example, [:alnum:] designates those characters for which
     isalnum()  returns  true  - i.e., any alphabetic or numeric.
     Some  systems  don't  provide  isblank(),  so  flex  defines
     [:blank:] as a blank or a tab.

     For  example,  the  following  character  classes  are   all
     equivalent:

         [[:alnum:]]
         [[:alpha:][:digit:]
         [[:alpha:]0-9]
         [a-zA-Z0-9]

     If your scanner is  case-insensitive  (the  -i  flag),  then
     [:upper:] and [:lower:] are equivalent to [:alpha:].

     Some notes on patterns:

     -    A negated character class such as the example  "[^A-Z]"



Version 2.5          Last change: April 1995                    8






FLEX(1)                  USER COMMANDS                    FLEX(1)



          above   will   match  a  newline  unless  "\n"  (or  an
          equivalent escape sequence) is one  of  the  characters
          explicitly  present  in  the  negated  character  class
          (e.g., "[^A-Z\n]").  This is unlike how many other reg-
          ular  expression tools treat negated character classes,
          but unfortunately  the  inconsistency  is  historically
          entrenched.   Matching  newlines  means  that a pattern
          like [^"]* can match the entire  input  unless  there's
          another quote in the input.

     -    A rule can have at most one instance of  trailing  con-
          text (the '/' operator or the '$' operator).  The start
          condition, '^', and "<<EOF>>" patterns can  only  occur
          at the beginning of a pattern, and, as well as with '/'
          and '$', cannot be grouped inside parentheses.   A  '^'
          which  does  not  occur at the beginning of a rule or a
          '$' which does not occur at the end of a rule loses its
          special  properties  and is treated as a normal charac-
          ter.

          The following are illegal:

              foo/bar$
              <sc1>foo<sc2>bar

          Note  that  the  first  of  these,   can   be   written
          "foo/bar\n".

          The following will result in '$' or '^'  being  treated
          as a normal character:

              foo|(bar$)
              foo|^bar

          If what's wanted is a  "foo"  or  a  bar-followed-by-a-
          newline,  the  following could be used (the special '|'
          action is explained below):

              foo      |
              bar$     /* action goes here */

          A similar trick will work for matching a foo or a  bar-
          at-the-beginning-of-a-line.

HOW THE INPUT IS MATCHED
     When the generated scanner is run,  it  analyzes  its  input
     looking  for strings which match any of its patterns.  If it
     finds more than one match, it takes  the  one  matching  the
     most  text  (for  trailing  context rules, this includes the
     length of the trailing part, even though  it  will  then  be
     returned  to the input).  If it finds two or more matches of
     the same length, the rule listed first  in  the  flex  input



Version 2.5          Last change: April 1995                    9






FLEX(1)                  USER COMMANDS                    FLEX(1)



     file is chosen.

     Once the match is determined, the text corresponding to  the
     match  (called  the  token)  is made available in the global
     character pointer yytext,  and  its  length  in  the  global
     integer yyleng. The action corresponding to the matched pat-
     tern is  then  executed  (a  more  detailed  description  of
     actions  follows),  and  then the remaining input is scanned
     for another match.

     If no match is found, then the default rule is executed: the
     next character in the input is considered matched and copied
     to the standard output.  Thus, the simplest legal flex input
     is:

         %%

     which generates a scanner that simply copies its input  (one
     character at a time) to its output.

     Note that yytext can  be  defined  in  two  different  ways:
     either  as  a character pointer or as a character array. You
     can control which definition flex uses by including  one  of
     the  special  directives  %pointer  or  %array  in the first
     (definitions) section of your flex input.   The  default  is
     %pointer, unless you use the -l lex compatibility option, in
     which case yytext will be an array.  The advantage of  using
     %pointer  is  substantially  faster  scanning  and no buffer
     overflow when matching very large tokens (unless you run out
     of  dynamic  memory).  The disadvantage is that you are res-
     tricted in how your actions can modify yytext (see the  next
     section),  and  calls  to  the unput() function destroys the
     present contents of yytext,  which  can  be  a  considerable
     porting headache when moving between different lex versions.

     The advantage of %array is that you can then  modify  yytext
     to your heart's content, and calls to unput() do not destroy
     yytext (see  below).   Furthermore,  existing  lex  programs
     sometimes access yytext externally using declarations of the
     form:
         extern char yytext[];
     This definition is erroneous when used  with  %pointer,  but
     correct for %array.

     %array defines yytext to be an array of  YYLMAX  characters,
     which  defaults to a fairly large value.  You can change the
     size by simply #define'ing YYLMAX to a  different  value  in
     the  first  section of your flex input.  As mentioned above,
     with %pointer yytext grows dynamically to accommodate  large
     tokens.  While this means your %pointer scanner can accommo-
     date very large tokens (such as matching  entire  blocks  of
     comments),  bear  in  mind  that  each time the scanner must



Version 2.5          Last change: April 1995                   10






FLEX(1)                  USER COMMANDS                    FLEX(1)



     resize yytext it also must rescan the entire token from  the
     beginning,  so  matching such tokens can prove slow.  yytext
     presently does not dynamically grow if  a  call  to  unput()
     results  in too much text being pushed back; instead, a run-
     time error results.

     Also note that  you  cannot  use  %array  with  C++  scanner
     classes (the c++ option; see below).

ACTIONS
     Each pattern in a rule has a corresponding action, which can
     be any arbitrary C statement.  The pattern ends at the first
     non-escaped whitespace character; the remainder of the  line
     is  its  action.  If the action is empty, then when the pat-
     tern is matched the input token is  simply  discarded.   For
     example,  here  is  the  specification  for  a program which
     deletes all occurrences of "zap me" from its input:

         %%
         "zap me"

     (It will copy all other characters in the input to the  out-
     put since they will be matched by the default rule.)

     Here is a program which compresses multiple blanks and  tabs
     down  to a single blank, and throws away whitespace found at
     the end of a line:

         %%
         [ \t]+        putchar( ' ' );
         [ \t]+$       /* ignore this token */


     If the action contains a '{', then the action spans till the
     balancing  '}'  is  found, and the action may cross multiple
     lines.  flex knows about C strings and comments and won't be
     fooled  by braces found within them, but also allows actions
     to begin with %{ and will consider the action to be all  the
     text up to the next %} (regardless of ordinary braces inside
     the action).

     An action consisting solely of a vertical  bar  ('|')  means
     "same  as  the  action for the next rule."  See below for an
     illustration.

     Actions can  include  arbitrary  C  code,  including  return
     statements  to  return  a  value  to whatever routine called
     yylex(). Each time yylex() is called it continues processing
     tokens  from  where it last left off until it either reaches
     the end of the file or executes a return.





Version 2.5          Last change: April 1995                   11






FLEX(1)                  USER COMMANDS                    FLEX(1)



     Actions are free to modify yytext except for lengthening  it
     (adding  characters  to  its end--these will overwrite later
     characters in the input  stream).   This  however  does  not
     apply  when  using  %array (see above); in that case, yytext
     may be freely modified in any way.

     Actions are free to modify yyleng except they should not  do
     so if the action also includes use of yymore() (see below).

     There are a  number  of  special  directives  which  can  be
     included within an action:

     -    ECHO copies yytext to the scanner's output.

     -    BEGIN followed by the name of a start condition  places
          the  scanner  in the corresponding start condition (see
          below).

     -    REJECT directs the scanner to proceed on to the "second
          best"  rule which matched the input (or a prefix of the
          input).  The rule is chosen as described above in  "How
          the  Input  is  Matched",  and yytext and yyleng set up
          appropriately.  It may either be one which  matched  as
          much  text as the originally chosen rule but came later
          in the flex input file, or one which matched less text.
          For example, the following will both count the words in
          the input  and  call  the  routine  special()  whenever
          "frob" is seen:

                      int word_count = 0;
              %%

              frob        special(); REJECT;
              [^ \t\n]+   ++word_count;

          Without the REJECT, any "frob"'s in the input would not
          be  counted  as  words, since the scanner normally exe-
          cutes only one action per token.  Multiple REJECT's are
          allowed,  each  one finding the next best choice to the
          currently active rule.  For example, when the following
          scanner  scans the token "abcd", it will write "abcdab-
          caba" to the output:

              %%
              a        |
              ab       |
              abc      |
              abcd     ECHO; REJECT;
              .|\n     /* eat up any unmatched character */

          (The first three rules share the fourth's action  since
          they   use   the  special  '|'  action.)  REJECT  is  a



Version 2.5          Last change: April 1995                   12






FLEX(1)                  USER COMMANDS                    FLEX(1)



          particularly expensive feature in terms of scanner per-
          formance; if it is used in any of the scanner's actions
          it will  slow  down  all  of  the  scanner's  matching.
          Furthermore,  REJECT cannot be used with the -Cf or -CF
          options (see below).

          Note also that unlike the other special actions, REJECT
          is  a  branch;  code  immediately  following  it in the
          action will not be executed.

     -    yymore() tells  the  scanner  that  the  next  time  it
          matches  a  rule,  the  corresponding  token  should be
          appended onto the current value of yytext  rather  than
          replacing  it.   For  example,  given  the input "mega-
          kludge" the following will write "mega-mega-kludge"  to
          the output:

              %%
              mega-    ECHO; yymore();
              kludge   ECHO;

          First "mega-" is matched  and  echoed  to  the  output.
          Then  "kludge"  is matched, but the previous "mega-" is
          still hanging around at the beginning of yytext so  the
          ECHO  for  the "kludge" rule will actually write "mega-
          kludge".

     Two notes regarding use of yymore(). First, yymore() depends
     on  the value of yyleng correctly reflecting the size of the
     current token, so you must not  modify  yyleng  if  you  are
     using  yymore().  Second,  the  presence  of yymore() in the
     scanner's action entails a minor performance penalty in  the
     scanner's matching speed.

     -    yyless(n) returns all but the first n characters of the
          current token back to the input stream, where they will
          be rescanned when the scanner looks for the next match.
          yytext  and  yyleng  are  adjusted appropriately (e.g.,
          yyleng will now be equal to n ).  For example,  on  the
          input  "foobar"  the  following will write out "foobar-
          bar":

              %%
              foobar    ECHO; yyless(3);
              [a-z]+    ECHO;

          An argument of  0  to  yyless  will  cause  the  entire
          current  input  string  to  be  scanned  again.  Unless
          you've changed how the scanner will  subsequently  pro-
          cess  its  input  (using BEGIN, for example), this will
          result in an endless loop.




Version 2.5          Last change: April 1995                   13






FLEX(1)                  USER COMMANDS                    FLEX(1)



     Note that yyless is a macro and can only be used in the flex
     input file, not from other source files.

     -    unput(c) puts the  character  c  back  onto  the  input
          stream.   It  will  be the next character scanned.  The
          following action will take the current token and  cause
          it to be rescanned enclosed in parentheses.

              {
              int i;
              /* Copy yytext because unput() trashes yytext */
              char *yycopy = strdup( yytext );
              unput( ')' );
              for ( i = yyleng - 1; i >= 0; --i )
                  unput( yycopy[i] );
              unput( '(' );
              free( yycopy );
              }

          Note that since each unput() puts the  given  character
          back at the beginning of the input stream, pushing back
          strings must be done back-to-front.

     An important potential problem when using unput() is that if
     you are using %pointer (the default), a call to unput() des-
     troys the contents of yytext, starting  with  its  rightmost
     character  and devouring one character to the left with each
     call.  If you need the value of  yytext  preserved  after  a
     call  to  unput() (as in the above example), you must either
     first copy it elsewhere, or build your scanner using  %array
     instead (see How The Input Is Matched).

     Finally, note that you cannot put back  EOF  to  attempt  to
     mark the input stream with an end-of-file.

     -    input() reads the next character from the input stream.
          For  example, the following is one way to eat up C com-
          ments:

              %%
              "/*"        {
                          register int c;

                          for ( ; ; )
                              {
                              while ( (c = input()) != '*' &&
                                      c != EOF )
                                  ;    /* eat up text of comment */

                              if ( c == '*' )
                                  {
                                  while ( (c = input()) == '*' )



Version 2.5          Last change: April 1995                   14






FLEX(1)                  USER COMMANDS                    FLEX(1)



                                      ;
                                  if ( c == '/' )
                                      break;    /* found the end */
                                  }

                              if ( c == EOF )
                                  {
                                  error( "EOF in comment" );
                                  break;
                                  }
                              }
                          }

          (Note that if the scanner is compiled using  C++,  then
          input()  is  instead referred to as yyinput(), in order
          to avoid a name clash with the C++ stream by  the  name
          of input.)

     -    YY_FLUSH_BUFFER flushes the scanner's  internal  buffer
          so  that  the next time the scanner attempts to match a
          token, it will first refill the buffer  using  YY_INPUT
          (see  The  Generated Scanner, below).  This action is a
          special case  of  the  more  general  yy_flush_buffer()
          function, described below in the section Multiple Input
          Buffers.

     -    yyterminate() can be used in lieu of a return statement
          in  an action.  It terminates the scanner and returns a
          0 to the scanner's caller, indicating "all  done".   By
          default,  yyterminate()  is also called when an end-of-
          file is encountered.  It is a macro and  may  be  rede-
          fined.

THE GENERATED SCANNER
     The output of flex is the file lex.yy.c, which contains  the
     scanning  routine yylex(), a number of tables used by it for
     matching tokens, and a number of auxiliary routines and mac-
     ros.  By default, yylex() is declared as follows:

         int yylex()
             {
             ... various definitions and the actions in here ...
             }

     (If your environment supports function prototypes,  then  it
     will  be  "int  yylex(  void  )".)   This  definition may be
     changed by defining the "YY_DECL" macro.  For  example,  you
     could use:

         #define YY_DECL float lexscan( a, b ) float a, b;

     to give the scanning routine the name lexscan,  returning  a



Version 2.5          Last change: April 1995                   15






FLEX(1)                  USER COMMANDS                    FLEX(1)



     float, and taking two floats as arguments.  Note that if you
     give  arguments  to  the  scanning  routine  using  a   K&R-
     style/non-prototyped  function  declaration,  you  must ter-
     minate the definition with a semi-colon (;).

     Whenever yylex() is called, it scans tokens from the  global
     input  file  yyin  (which  defaults to stdin).  It continues
     until it either reaches an end-of-file (at  which  point  it
     returns the value 0) or one of its actions executes a return
     statement.

     If the scanner reaches an end-of-file, subsequent calls  are
     undefined  unless either yyin is pointed at a new input file
     (in which case scanning continues from that file), or yyres-
     tart()  is called.  yyrestart() takes one argument, a FILE *
     pointer (which can be nil, if you've set up YY_INPUT to scan
     from  a  source  other  than yyin), and initializes yyin for
     scanning from that file.  Essentially there is no difference
     between  just  assigning  yyin  to a new input file or using
     yyrestart() to do so; the latter is available  for  compati-
     bility with previous versions of flex, and because it can be
     used to switch input files in the middle  of  scanning.   It
     can  also be used to throw away the current input buffer, by
     calling it with an argument of yyin; but better  is  to  use
     YY_FLUSH_BUFFER (see above).  Note that yyrestart() does not
     reset the start condition to INITIAL (see Start  Conditions,
     below).

     If yylex() stops scanning due to executing a  return  state-
     ment  in  one of the actions, the scanner may then be called
     again and it will resume scanning where it left off.

     By default (and for purposes  of  efficiency),  the  scanner
     uses  block-reads  rather  than  simple getc() calls to read
     characters from yyin. The nature of how it  gets  its  input
     can   be   controlled   by   defining  the  YY_INPUT  macro.
     YY_INPUT's           calling           sequence           is
     "YY_INPUT(buf,result,max_size)".   Its action is to place up
     to max_size characters in the character array buf and return
     in  the integer variable result either the number of charac-
     ters read or the constant YY_NULL (0  on  Unix  systems)  to
     indicate  EOF.   The  default YY_INPUT reads from the global
     file-pointer "yyin".

     A sample definition of YY_INPUT (in the definitions  section
     of the input file):

         %{
         #define YY_INPUT(buf,result,max_size) \
             { \
             int c = getchar(); \
             result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \



Version 2.5          Last change: April 1995                   16






FLEX(1)                  USER COMMANDS                    FLEX(1)



             }
         %}

     This definition will change the input  processing  to  occur
     one character at a time.

     When the scanner receives  an  end-of-file  indication  from
     YY_INPUT, it then checks the yywrap() function.  If yywrap()
     returns false (zero), then it is assumed that  the  function
     has  gone  ahead  and  set up yyin to point to another input
     file, and scanning continues.   If  it  returns  true  (non-
     zero),  then  the  scanner  terminates,  returning  0 to its
     caller.  Note that  in  either  case,  the  start  condition
     remains unchanged; it does not revert to INITIAL.

     If you do not supply your own version of yywrap(), then  you
     must  either use %option noyywrap (in which case the scanner
     behaves as though yywrap() returned 1),  or  you  must  link
     with  -lfl  to  obtain  the  default version of the routine,
     which always returns 1.

     Three routines are available  for  scanning  from  in-memory
     buffers     rather     than     files:     yy_scan_string(),
     yy_scan_bytes(), and yy_scan_buffer(). See the discussion of
     them below in the section Multiple Input Buffers.

     The scanner writes its  ECHO  output  to  the  yyout  global
     (default, stdout), which may be redefined by the user simply
     by assigning it to some other FILE pointer.

START CONDITIONS
     flex  provides  a  mechanism  for  conditionally  activating
     rules.   Any rule whose pattern is prefixed with "<sc>" will
     only be active when the scanner is in  the  start  condition
     named "sc".  For example,

         <STRING>[^"]*        { /* eat up the string body ... */
                     ...
                     }

     will be active only when the  scanner  is  in  the  "STRING"
     start condition, and

         <INITIAL,STRING,QUOTE>\.        { /* handle an escape ... */
                     ...
                     }

     will be active only when  the  current  start  condition  is
     either "INITIAL", "STRING", or "QUOTE".

     Start conditions are declared  in  the  definitions  (first)
     section  of  the input using unindented lines beginning with



Version 2.5          Last change: April 1995                   17






FLEX(1)                  USER COMMANDS                    FLEX(1)



     either %s or %x followed by a list  of  names.   The  former
     declares  inclusive  start  conditions, the latter exclusive
     start conditions.  A start condition is activated using  the
     BEGIN  action.   Until  the  next  BEGIN action is executed,
     rules with the given start  condition  will  be  active  and
     rules  with other start conditions will be inactive.  If the
     start condition is inclusive, then rules with no start  con-
     ditions  at  all  will  also be active.  If it is exclusive,
     then only rules qualified with the start condition  will  be
     active.   A  set  of  rules contingent on the same exclusive
     start condition describe a scanner which is  independent  of
     any  of the other rules in the flex input.  Because of this,
     exclusive start conditions make it easy  to  specify  "mini-
     scanners"  which scan portions of the input that are syntac-
     tically different from the rest (e.g., comments).

     If the distinction between  inclusive  and  exclusive  start
     conditions  is still a little vague, here's a simple example
     illustrating the connection between the  two.   The  set  of
     rules:

         %s example
         %%

         <example>foo   do_something();

         bar            something_else();

     is equivalent to

         %x example
         %%

         <example>foo   do_something();

         <INITIAL,example>bar    something_else();

     Without the <INITIAL,example> qualifier, the bar pattern  in
     the second example wouldn't be active (i.e., couldn't match)
     when in start condition example. If we just  used  <example>
     to  qualify  bar,  though,  then  it would only be active in
     example and not in INITIAL, while in the first example  it's
     active  in  both,  because  in the first example the example
     startion condition is an inclusive (%s) start condition.

     Also note that the  special  start-condition  specifier  <*>
     matches  every  start  condition.   Thus,  the above example
     could also have been written;

         %x example
         %%




Version 2.5          Last change: April 1995                   18






FLEX(1)                  USER COMMANDS                    FLEX(1)



         <example>foo   do_something();

         <*>bar    something_else();


     The default rule (to ECHO any unmatched  character)  remains
     active in start conditions.  It is equivalent to:

         <*>.|\n     ECHO;


     BEGIN(0) returns to the original state where only the  rules
     with no start conditions are active.  This state can also be
     referred   to   as   the   start-condition   "INITIAL",   so
     BEGIN(INITIAL)  is  equivalent to BEGIN(0). (The parentheses
     around the start condition name are  not  required  but  are
     considered good style.)

     BEGIN actions can also be given  as  indented  code  at  the
     beginning  of the rules section.  For example, the following
     will cause the scanner to enter the "SPECIAL"  start  condi-
     tion  whenever  yylex()  is  called  and the global variable
     enter_special is true:

                 int enter_special;

         %x SPECIAL
         %%
                 if ( enter_special )
                     BEGIN(SPECIAL);

         <SPECIAL>blahblahblah
         ...more rules follow...


     To illustrate the  uses  of  start  conditions,  here  is  a
     scanner  which  provides  two different interpretations of a
     string like "123.456".  By default it will treat it as three
     tokens,  the  integer  "123",  a  dot ('.'), and the integer
     "456".  But if the string is preceded earlier in the line by
     the  string  "expect-floats"  it  will  treat it as a single
     token, the floating-point number 123.456:

         %{
         #include <math.h>
         %}
         %s expect

         %%
         expect-floats        BEGIN(expect);

         <expect>[0-9]+"."[0-9]+      {



Version 2.5          Last change: April 1995                   19






FLEX(1)                  USER COMMANDS                    FLEX(1)



                     printf( "found a float, = %f\n",
                             atof( yytext ) );
                     }
         <expect>\n           {
                     /* that's the end of the line, so
                      * we need another "expect-number"
                      * before we'll recognize any more
                      * numbers
                      */
                     BEGIN(INITIAL);
                     }

         [0-9]+      {
                     printf( "found an integer, = %d\n",
                             atoi( yytext ) );
                     }

         "."         printf( "found a dot\n" );

     Here is a scanner which recognizes (and discards) C comments
     while maintaining a count of the current input line.

         %x comment
         %%
                 int line_num = 1;

         "/*"         BEGIN(comment);

         <comment>[^*\n]*        /* eat anything that's not a '*' */
         <comment>"*"+[^*/\n]*   /* eat up '*'s not followed by '/'s */
         <comment>\n             ++line_num;
         <comment>"*"+"/"        BEGIN(INITIAL);

     This scanner goes to a bit of trouble to match as much  text
     as  possible with each rule.  In general, when attempting to
     write a high-speed scanner try to match as much possible  in
     each rule, as it's a big win.

     Note that start-conditions names are really  integer  values
     and  can  be  stored  as  such.   Thus,  the  above could be
     extended in the following fashion:

         %x comment foo
         %%
                 int line_num = 1;
                 int comment_caller;

         "/*"         {
                      comment_caller = INITIAL;
                      BEGIN(comment);
                      }




Version 2.5          Last change: April 1995                   20






FLEX(1)                  USER COMMANDS                    FLEX(1)



         ...

         <foo>"/*"    {
                      comment_caller = foo;
                      BEGIN(comment);
                      }

         <comment>[^*\n]*        /* eat anything that's not a '*' */
         <comment>"*"+[^*/\n]*   /* eat up '*'s not followed by '/'s */
         <comment>\n             ++line_num;
         <comment>"*"+"/"        BEGIN(comment_caller);

     Furthermore, you can  access  the  current  start  condition
     using  the  integer-valued YY_START macro.  For example, the
     above assignments to comment_caller could instead be written

         comment_caller = YY_START;

     Flex provides YYSTATE as an alias for YY_START  (since  that
     is what's used by AT&T lex).

     Note that start conditions do not have their own name-space;
     %s's   and  %x's  declare  names  in  the  same  fashion  as
     #define's.

     Finally, here's an example of how to  match  C-style  quoted
     strings using exclusive start conditions, including expanded
     escape sequences (but not including checking  for  a  string
     that's too long):

         %x str

         %%
                 char string_buf[MAX_STR_CONST];
                 char *string_buf_ptr;


         \"      string_buf_ptr = string_buf; BEGIN(str);

         <str>\"        { /* saw closing quote - all done */
                 BEGIN(INITIAL);
                 *string_buf_ptr = '\0';
                 /* return string constant token type and
                  * value to parser
                  */
                 }

         <str>\n        {
                 /* error - unterminated string constant */
                 /* generate error message */
                 }




Version 2.5          Last change: April 1995                   21






FLEX(1)                  USER COMMANDS                    FLEX(1)



         <str>\\[0-7]{1,3} {
                 /* octal escape sequence */
                 int result;

                 (void) sscanf( yytext + 1, "%o", &result );

                 if ( result > 0xff )
                         /* error, constant is out-of-bounds */

                 *string_buf_ptr++ = result;
                 }

         <str>\\[0-9]+ {
                 /* generate error - bad escape sequence; something
                  * like '\48' or '\0777777'
                  */
                 }

         <str>\\n  *string_buf_ptr++ = '\n';
         <str>\\t  *string_buf_ptr++ = '\t';
         <str>\\r  *string_buf_ptr++ = '\r';
         <str>\\b  *string_buf_ptr++ = '\b';
         <str>\\f  *string_buf_ptr++ = '\f';

         <str>\\(.|\n)  *string_buf_ptr++ = yytext[1];

         <str>[^\\\n\"]+        {
                 char *yptr = yytext;

                 while ( *yptr )
                         *string_buf_ptr++ = *yptr++;
                 }


     Often, such as in some of the examples above,  you  wind  up
     writing  a  whole  bunch  of  rules all preceded by the same
     start condition(s).  Flex makes this  a  little  easier  and
     cleaner  by introducing a notion of start condition scope. A
     start condition scope is begun with:

         <SCs>{

     where SCs is a list of one or more start conditions.  Inside
     the  start condition scope, every rule automatically has the
     prefix <SCs> applied to it, until a '}'  which  matches  the
     initial '{'. So, for example,

         <ESC>{
             "\\n"   return '\n';
             "\\r"   return '\r';
             "\\f"   return '\f';
             "\\0"   return '\0';



Version 2.5          Last change: April 1995                   22






FLEX(1)                  USER COMMANDS                    FLEX(1)



         }

     is equivalent to:

         <ESC>"\\n"  return '\n';
         <ESC>"\\r"  return '\r';
         <ESC>"\\f"  return '\f';
         <ESC>"\\0"  return '\0';

     Start condition scopes may be nested.

     Three routines are  available  for  manipulating  stacks  of
     start conditions:

     void yy_push_state(int new_state)
          pushes the current start condition onto the top of  the
          start  condition  stack  and  switches  to new_state as
          though you had used BEGIN new_state (recall that  start
          condition names are also integers).

     void yy_pop_state()
          pops the top of the stack and switches to it via BEGIN.

     int yy_top_state()
          returns the top  of  the  stack  without  altering  the
          stack's contents.

     The start condition stack grows dynamically and  so  has  no
     built-in  size  limitation.  If memory is exhausted, program
     execution aborts.

     To use start condition stacks, your scanner must  include  a
     %option stack directive (see Options below).

MULTIPLE INPUT BUFFERS
     Some scanners (such as those which support "include"  files)
     require   reading  from  several  input  streams.   As  flex
     scanners do a large amount of buffering, one cannot  control
     where  the  next input will be read from by simply writing a
     YY_INPUT  which  is  sensitive  to  the  scanning   context.
     YY_INPUT  is only called when the scanner reaches the end of
     its buffer, which may be a long time after scanning a state-
     ment such as an "include" which requires switching the input
     source.

     To negotiate  these  sorts  of  problems,  flex  provides  a
     mechanism  for creating and switching between multiple input
     buffers.  An input buffer is created by using:

         YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )

     which takes a FILE pointer and a size and creates  a  buffer



Version 2.5          Last change: April 1995                   23






FLEX(1)                  USER COMMANDS                    FLEX(1)



     associated with the given file and large enough to hold size
     characters (when in doubt, use YY_BUF_SIZE  for  the  size).
     It  returns  a  YY_BUFFER_STATE  handle,  which  may then be
     passed to other routines (see below).   The  YY_BUFFER_STATE
     type is a pointer to an opaque struct yy_buffer_state struc-
     ture, so you may safely initialize YY_BUFFER_STATE variables
     to  ((YY_BUFFER_STATE) 0) if you wish, and also refer to the
     opaque structure in order to correctly declare input buffers
     in  source files other than that of your scanner.  Note that
     the FILE pointer in the call  to  yy_create_buffer  is  only
     used  as the value of yyin seen by YY_INPUT; if you redefine
     YY_INPUT so it no longer uses yyin, then you can safely pass
     a nil FILE pointer to yy_create_buffer. You select a partic-
     ular buffer to scan from using:

         void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )

     switches the scanner's input  buffer  so  subsequent  tokens
     will  come  from new_buffer. Note that yy_switch_to_buffer()
     may be used by yywrap() to set things up for continued scan-
     ning, instead of opening a new file and pointing yyin at it.
     Note  also  that  switching   input   sources   via   either
     yy_switch_to_buffer()  or yywrap() does not change the start
     condition.

         void yy_delete_buffer( YY_BUFFER_STATE buffer )

     is used to reclaim the storage associated with a buffer.   (
     buffer  can be nil, in which case the routine does nothing.)
     You can also clear the current contents of a buffer using:

         void yy_flush_buffer( YY_BUFFER_STATE buffer )

     This function discards the buffer's contents,  so  the  next
     time  the scanner attempts to match a token from the buffer,
     it will first fill the buffer anew using YY_INPUT.

     yy_new_buffer() is an alias for yy_create_buffer(), provided
     for  compatibility  with  the  C++ use of new and delete for
     creating and destroying dynamic objects.

     Finally,   the    YY_CURRENT_BUFFER    macro    returns    a
     YY_BUFFER_STATE handle to the current buffer.

     Here is an example of using these  features  for  writing  a
     scanner  which expands include files (the <<EOF>> feature is
     discussed below):

         /* the "incl" state is used for picking up the name
          * of an include file
          */
         %x incl



Version 2.5          Last change: April 1995                   24






FLEX(1)                  USER COMMANDS                    FLEX(1)



         %{
         #define MAX_INCLUDE_DEPTH 10
         YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
         int include_stack_ptr = 0;
         %}

         %%
         include             BEGIN(incl);

         [a-z]+              ECHO;
         [^a-z\n]*\n?        ECHO;

         <incl>[ \t]*      /* eat the whitespace */
         <incl>[^ \t\n]+   { /* got the include file name */
                 if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
                     {
                     fprintf( stderr, "Includes nested too deeply" );
                     exit( 1 );
                     }

                 include_stack[include_stack_ptr++] =
                     YY_CURRENT_BUFFER;

                 yyin = fopen( yytext, "r" );

                 if ( ! yyin )
                     error( ... );

                 yy_switch_to_buffer(
                     yy_create_buffer( yyin, YY_BUF_SIZE ) );

                 BEGIN(INITIAL);
                 }

         <<EOF>> {
                 if ( --include_stack_ptr < 0 )
                     {
                     yyterminate();
                     }

                 else
                     {
                     yy_delete_buffer( YY_CURRENT_BUFFER );
                     yy_switch_to_buffer(
                          include_stack[include_stack_ptr] );
                     }
                 }

     Three routines are available for setting  up  input  buffers
     for  scanning  in-memory  strings  instead of files.  All of
     them create a new input buffer for scanning the string,  and
     return  a  corresponding  YY_BUFFER_STATE  handle (which you



Version 2.5          Last change: April 1995                   25






FLEX(1)                  USER COMMANDS                    FLEX(1)



     should delete with yy_delete_buffer() when  done  with  it).
     They    also    switch    to    the    new    buffer   using
     yy_switch_to_buffer(), so the  next  call  to  yylex()  will
     start scanning the string.

     yy_scan_string(const char *str)
          scans a NUL-terminated string.

     yy_scan_bytes(const char *bytes, int len)
          scans len bytes (including possibly NUL's) starting  at
          location bytes.

     Note that both of these functions create and scan a copy  of
     the  string or bytes.  (This may be desirable, since yylex()
     modifies the contents of the buffer it  is  scanning.)   You
     can avoid the copy by using:

     yy_scan_buffer(char *base, yy_size_t size)
          which scans in place the buffer starting at base,  con-
          sisting of size bytes, the last two bytes of which must
          be YY_END_OF_BUFFER_CHAR (ASCII NUL).  These  last  two
          bytes  are  not  scanned;  thus,  scanning  consists of
          base[0] through base[size-2], inclusive.

          If you fail to set up base in this manner (i.e., forget
          the   final   two  YY_END_OF_BUFFER_CHAR  bytes),  then
          yy_scan_buffer()  returns  a  nil  pointer  instead  of
          creating a new input buffer.

          The type yy_size_t is an integral type to which you can
          cast  an  integer expression reflecting the size of the
          buffer.

END-OF-FILE RULES
     The special rule "<<EOF>>" indicates actions which are to be
     taken  when  an  end-of-file  is  encountered  and  yywrap()
     returns non-zero (i.e., indicates no further files  to  pro-
     cess).  The action must finish by doing one of four things:

     -    assigning yyin to a new input file  (in  previous  ver-
          sions  of  flex,  after doing the assignment you had to
          call the special action YY_NEW_FILE; this is no  longer
          necessary);

     -    executing a return statement;

     -    executing the special yyterminate() action;

     -    or,    switching    to    a    new     buffer     using
          yy_switch_to_buffer() as shown in the example above.





Version 2.5          Last change: April 1995                   26






FLEX(1)                  USER COMMANDS                    FLEX(1)



     <<EOF>> rules may not be used with other patterns; they  may
     only  be  qualified  with a list of start conditions.  If an
     unqualified <<EOF>> rule is given, it applies to  all  start
     conditions  which  do  not already have <<EOF>> actions.  To
     specify an <<EOF>> rule for only the  initial  start  condi-
     tion, use

         <INITIAL><<EOF>>


     These rules are useful for  catching  things  like  unclosed
     comments.  An example:

         %x quote
         %%

         ...other rules for dealing with quotes...

         <quote><<EOF>>   {
                  error( "unterminated quote" );
                  yyterminate();
                  }
         <<EOF>>  {
                  if ( *++filelist )
                      yyin = fopen( *filelist, "r" );
                  else
                     yyterminate();
                  }


MISCELLANEOUS MACROS
     The macro YY_USER_ACTION can be defined to provide an action
     which is always executed prior to the matched rule's action.
     For example, it could be #define'd to call a routine to con-
     vert  yytext to lower-case.  When YY_USER_ACTION is invoked,
     the variable yy_act gives the number  of  the  matched  rule
     (rules  are  numbered starting with 1).  Suppose you want to
     profile how often each of your rules is matched.   The  fol-
     lowing would do the trick:

         #define YY_USER_ACTION ++ctr[yy_act]

     where ctr is an array to hold the counts for  the  different
     rules.   Note  that  the  macro YY_NUM_RULES gives the total
     number of rules (including the default rule, even if you use
     -s), so a correct declaration for ctr is:

         int ctr[YY_NUM_RULES];


     The macro YY_USER_INIT may be defined to provide  an  action
     which  is  always executed before the first scan (and before



Version 2.5          Last change: April 1995                   27






FLEX(1)                  USER COMMANDS                    FLEX(1)



     the scanner's internal initializations are done).  For exam-
     ple,  it  could  be used to call a routine to read in a data
     table or open a logging file.

     The macro yy_set_interactive(is_interactive) can be used  to
     control  whether  the  current buffer is considered interac-
     tive. An interactive buffer is processed  more  slowly,  but
     must  be  used  when  the  scanner's  input source is indeed
     interactive to avoid problems due to waiting to fill buffers
     (see the discussion of the -I flag below).  A non-zero value
     in the macro invocation marks the buffer as  interactive,  a
     zero  value as non-interactive.  Note that use of this macro
     overrides  %option  always-interactive  or  %option   never-
     interactive  (see Options below).  yy_set_interactive() must
     be invoked prior to beginning to scan the buffer that is (or
     is not) to be considered interactive.

     The macro yy_set_bol(at_bol) can be used to control  whether
     the  current  buffer's  scanning  context for the next token
     match is done as though at the beginning of a line.  A  non-
     zero macro argument makes rules anchored with

     The macro YY_AT_BOL() returns true if the next token scanned
     from  the  current  buffer will have '^' rules active, false
     otherwise.

     In the generated scanner, the actions are  all  gathered  in
     one  large  switch  statement  and separated using YY_BREAK,
     which may be redefined.  By default, it is simply a "break",
     to  separate  each  rule's action from the following rule's.
     Redefining  YY_BREAK  allows,  for  example,  C++  users  to
     #define  YY_BREAK  to  do  nothing (while being very careful
     that every rule ends with a "break" or a "return"!) to avoid
     suffering  from unreachable statement warnings where because
     a rule's action ends with "return", the YY_BREAK is inacces-
     sible.

VALUES AVAILABLE TO THE USER
     This section summarizes the various values available to  the
     user in the rule actions.

     -    char *yytext holds the text of the current  token.   It
          may  be  modified but not lengthened (you cannot append
          characters to the end).

          If the special directive %array appears  in  the  first
          section  of  the  scanner  description,  then yytext is
          instead declared char yytext[YYLMAX], where YYLMAX is a
          macro  definition  that  you  can redefine in the first
          section if you don't like the default value  (generally
          8KB).    Using   %array   results  in  somewhat  slower
          scanners, but the value of  yytext  becomes  immune  to



Version 2.5          Last change: April 1995                   28






FLEX(1)                  USER COMMANDS                    FLEX(1)



          calls to input() and unput(), which potentially destroy
          its value when yytext  is  a  character  pointer.   The
          opposite of %array is %pointer, which is the default.

          You cannot  use  %array  when  generating  C++  scanner
          classes (the -+ flag).

     -    int yyleng holds the length of the current token.

     -    FILE *yyin is the file  which  by  default  flex  reads
          from.   It  may  be  redefined  but doing so only makes
          sense before scanning begins or after an EOF  has  been
          encountered.  Changing it in the midst of scanning will
          have unexpected results since flex buffers  its  input;
          use  yyrestart()  instead.   Once  scanning  terminates
          because an end-of-file has been seen,  you  can  assign
          yyin  at  the  new input file and then call the scanner
          again to continue scanning.

     -    void yyrestart( FILE *new_file ) may be called to point
          yyin at the new input file.  The switch-over to the new
          file is immediate (any previously buffered-up input  is
          lost).   Note  that calling yyrestart() with yyin as an
          argument thus throws away the current input buffer  and
          continues scanning the same input file.

     -    FILE *yyout is the file to which ECHO actions are done.
          It can be reassigned by the user.

     -    YY_CURRENT_BUFFER returns a YY_BUFFER_STATE  handle  to
          the current buffer.

     -    YY_START returns an integer value corresponding to  the
          current start condition.  You can subsequently use this
          value with BEGIN to return to that start condition.

INTERFACING WITH YACC
     One of the main uses of flex is as a companion to  the  yacc
     parser-generator.   yacc  parsers  expect  to call a routine
     named yylex() to find the next input token.  The routine  is
     supposed  to  return  the  type of the next token as well as
     putting any associated value in the global  yylval.  To  use
     flex  with  yacc,  one  specifies  the  -d option to yacc to
     instruct it to generate the file y.tab.h containing  defini-
     tions  of all the %tokens appearing in the yacc input.  This
     file is then included in the flex scanner.  For example,  if
     one of the tokens is "TOK_NUMBER", part of the scanner might
     look like:

         %{
         #include "y.tab.h"
         %}



Version 2.5          Last change: April 1995                   29






FLEX(1)                  USER COMMANDS                    FLEX(1)



         %%

         [0-9]+        yylval = atoi( yytext ); return TOK_NUMBER;


OPTIONS
     flex has the following options:

     -b   Generate backing-up information to lex.backup. This  is
          a  list  of scanner states which require backing up and
          the input characters on which they do  so.   By  adding
          rules   one  can  remove  backing-up  states.   If  all
          backing-up states are eliminated  and  -Cf  or  -CF  is
          used, the generated scanner will run faster (see the -p
          flag).  Only users who wish to squeeze every last cycle
          out  of  their  scanners  need worry about this option.
          (See the section on Performance Considerations below.)

     -c   is a do-nothing, deprecated option included  for  POSIX
          compliance.

     -d   makes the generated scanner run in debug  mode.   When-
          ever   a   pattern   is   recognized   and  the  global
          yy_flex_debug is non-zero (which is the  default),  the
          scanner will write to stderr a line of the form:

              --accepting rule at line 53 ("the matched text")

          The line number refers to the location of the  rule  in
          the  file defining the scanner (i.e., the file that was
          fed to flex).  Messages are  also  generated  when  the
          scanner backs up, accepts the default rule, reaches the
          end of its input buffer (or encounters a NUL;  at  this
          point,  the  two  look the same as far as the scanner's
          concerned), or reaches an end-of-file.

     -f   specifies fast scanner. No table  compression  is  done
          and  stdio  is bypassed.  The result is large but fast.
          This option is equivalent to -Cfr (see below).

     -h   generates a "help" summary of flex's options to  stdout
          and then exits.  -? and --help are synonyms for -h.

     -i   instructs flex to generate a case-insensitive  scanner.
          The  case  of  letters given in the flex input patterns
          will be ignored,  and  tokens  in  the  input  will  be
          matched  regardless of case.  The matched text given in
          yytext will have the preserved case (i.e., it will  not
          be folded).

     -l   turns on maximum compatibility with the  original  AT&T
          lex  implementation.  Note that this does not mean full



Version 2.5          Last change: April 1995                   30






FLEX(1)                  USER COMMANDS                    FLEX(1)



          compatibility.  Use of this option costs a considerable
          amount  of  performance, and it cannot be used with the
          -+, -f, -F, -Cf, or -CF options.  For  details  on  the
          compatibilities  it provides, see the section "Incompa-
          tibilities With Lex And POSIX" below.  This option also
          results  in the name YY_FLEX_LEX_COMPAT being #define'd
          in the generated scanner.

     -n   is another do-nothing, deprecated option included  only
          for POSIX compliance.

     -p   generates a performance report to stderr.   The  report
          consists  of  comments  regarding  features of the flex
          input file which will cause a serious loss  of  perfor-
          mance  in  the resulting scanner.  If you give the flag
          twice, you will also get  comments  regarding  features
          that lead to minor performance losses.

          Note that the use  of  REJECT,  %option  yylineno,  and
          variable  trailing context (see the Deficiencies / Bugs
          section  below)  entails  a   substantial   performance
          penalty;  use  of  yymore(), the ^ operator, and the -I
          flag entail minor performance penalties.

     -s   causes the default rule (that unmatched  scanner  input
          is  echoed to stdout) to be suppressed.  If the scanner
          encounters input that does not match any of its  rules,
          it  aborts  with  an  error.  This option is useful for
          finding holes in a scanner's rule set.

     -t   instructs flex to write the  scanner  it  generates  to
          standard output instead of lex.yy.c.

     -v   specifies that flex should write to stderr a summary of
          statistics regarding the scanner it generates.  Most of
          the statistics are meaningless to the casual flex user,
          but the first line identifies the version of flex (same
          as reported by -V), and the next line  the  flags  used
          when  generating  the scanner, including those that are
          on by default.

     -w   suppresses warning messages.

     -B   instructs flex to generate a batch scanner,  the  oppo-
          site  of  interactive  scanners  generated  by  -I (see
          below).  In general, you use -B when  you  are  certain
          that your scanner will never be used interactively, and
          you want to squeeze a little more  performance  out  of
          it.   If your goal is instead to squeeze out a lot more
          performance, you  should   be  using  the  -Cf  or  -CF
          options  (discussed  below), which turn on -B automati-
          cally anyway.



Version 2.5          Last change: April 1995                   31






FLEX(1)                  USER COMMANDS                    FLEX(1)



     -F   specifies that the fast  scanner  table  representation
          should  be used (and stdio bypassed).  This representa-
          tion is about as fast as the full table  representation
          (-f),  and  for some sets of patterns will be consider-
          ably smaller (and for others, larger).  In general,  if
          the  pattern  set contains both "keywords" and a catch-
          all, "identifier" rule, such as in the set:

              "case"    return TOK_CASE;
              "switch"  return TOK_SWITCH;
              ...
              "default" return TOK_DEFAULT;
              [a-z]+    return TOK_ID;

          then you're better off using the full table representa-
          tion.  If only the "identifier" rule is present and you
          then use a hash table or some such to detect  the  key-
          words, you're better off using -F.

          This option is equivalent to -CFr (see below).  It can-
          not be used with -+.

     -I   instructs flex to generate an interactive scanner.   An
          interactive  scanner  is  one  that only looks ahead to
          decide what token has been  matched  if  it  absolutely
          must.  It turns out that always looking one extra char-
          acter ahead, even  if  the  scanner  has  already  seen
          enough text to disambiguate the current token, is a bit
          faster than only looking  ahead  when  necessary.   But
          scanners  that always look ahead give dreadful interac-
          tive performance; for example, when a user types a new-
          line,  it  is  not  recognized as a newline token until
          they enter another token, which often means  typing  in
          another whole line.

          Flex scanners default to interactive unless you use the
          -Cf  or  -CF  table-compression  options  (see  below).
          That's because if you're looking  for  high-performance
          you  should  be  using  one of these options, so if you
          didn't, flex assumes you'd rather trade off  a  bit  of
          run-time    performance   for   intuitive   interactive
          behavior.  Note also that you cannot use -I in conjunc-
          tion  with  -Cf or -CF. Thus, this option is not really
          needed; it is on by default  for  all  those  cases  in
          which it is allowed.

          You can force a scanner to not be interactive by  using
          -B (see above).

     -L   instructs  flex  not  to  generate  #line   directives.
          Without this option, flex peppers the generated scanner
          with #line directives so error messages in the  actions



Version 2.5          Last change: April 1995                   32






FLEX(1)                  USER COMMANDS                    FLEX(1)



          will  be  correctly  located with respect to either the
          original flex input file (if the errors are due to code
          in  the  input  file),  or  lex.yy.c (if the errors are
          flex's fault -- you should report these sorts of errors
          to the email address given below).

     -T   makes flex run in trace mode.  It will generate  a  lot
          of  messages to stderr concerning the form of the input
          and the resultant non-deterministic  and  deterministic
          finite  automata.   This  option  is  mostly for use in
          maintaining flex.

     -V   prints the version number to stdout and exits.   --ver-
          sion is a synonym for -V.

     -7   instructs flex to generate a 7-bit scanner,  i.e.,  one
          which  can  only  recognized  7-bit  characters  in its
          input.  The advantage of using -7 is that the scanner's
          tables  can  be  up to half the size of those generated
          using the -8 option (see below).  The  disadvantage  is
          that  such  scanners often hang or crash if their input
          contains an 8-bit character.

          Note, however, that unless you  generate  your  scanner
          using  the -Cf or -CF table compression options, use of
          -7 will save only a small amount of  table  space,  and
          make  your  scanner considerably less portable.  Flex's
          default behavior is to generate an 8-bit scanner unless
          you  use the -Cf or -CF, in which case flex defaults to
          generating 7-bit scanners unless your site  was  always
          configured to generate 8-bit scanners (as will often be
          the case with non-USA sites).   You  can  tell  whether
          flex  generated a 7-bit or an 8-bit scanner by inspect-
          ing the flag summary in  the  -v  output  as  described
          above.

          Note that if you use -Cfe or -CFe (those table compres-
          sion  options,  but  also  using equivalence classes as
          discussed see below), flex still defaults to generating
          an  8-bit scanner, since usually with these compression
          options full 8-bit tables are not much  more  expensive
          than 7-bit tables.

     -8   instructs flex to generate an 8-bit scanner, i.e.,  one
          which  can  recognize  8-bit  characters.  This flag is
          only needed for scanners generated using -Cf or -CF, as
          otherwise  flex defaults to generating an 8-bit scanner
          anyway.

          See the discussion  of  -7  above  for  flex's  default
          behavior  and  the  tradeoffs  between  7-bit and 8-bit
          scanners.



Version 2.5          Last change: April 1995                   33






FLEX(1)                  USER COMMANDS                    FLEX(1)



     -+   specifies that you want flex to generate a C++  scanner
          class.   See  the  section  on  Generating C++ Scanners
          below for details.

     -C[aefFmr]
          controls the degree of table compression and, more gen-
          erally,  trade-offs  between  small  scanners  and fast
          scanners.

          -Ca ("align") instructs flex to trade off larger tables
          in the generated scanner for faster performance because
          the elements of  the  tables  are  better  aligned  for
          memory  access and computation.  On some RISC architec-
          tures, fetching  and  manipulating  longwords  is  more
          efficient  than with smaller-sized units such as short-
          words.  This option can double the size of  the  tables
          used by your scanner.

          -Ce directs  flex  to  construct  equivalence  classes,
          i.e.,  sets  of characters which have identical lexical
          properties (for example,  if  the  only  appearance  of
          digits  in  the  flex  input  is in the character class
          "[0-9]" then the digits '0', '1', ..., '9' will all  be
          put   in  the  same  equivalence  class).   Equivalence
          classes usually give dramatic reductions in  the  final
          table/object file sizes (typically a factor of 2-5) and
          are pretty cheap performance-wise  (one  array  look-up
          per character scanned).

          -Cf specifies that the full scanner  tables  should  be
          generated - flex should not compress the tables by tak-
          ing advantages of similar transition functions for dif-
          ferent states.

          -CF specifies that the alternate fast scanner represen-
          tation  (described  above  under the -F flag) should be
          used.  This option cannot be used with -+.

          -Cm directs flex to construct meta-equivalence classes,
          which  are  sets of equivalence classes (or characters,
          if equivalence classes are not  being  used)  that  are
          commonly  used  together.  Meta-equivalence classes are
          often a big win when using compressed tables, but  they
          have  a  moderate  performance  impact (one or two "if"
          tests and one array look-up per character scanned).

          -Cr causes the generated scanner to bypass use  of  the
          standard  I/O  library  (stdio)  for input.  Instead of
          calling fread() or getc(), the  scanner  will  use  the
          read()  system  call,  resulting  in a performance gain
          which varies from system to system, but in  general  is
          probably  negligible  unless  you are also using -Cf or



Version 2.5          Last change: April 1995                   34






FLEX(1)                  USER COMMANDS                    FLEX(1)



          -CF. Using -Cr can cause strange behavior if, for exam-
          ple,  you  read  from yyin using stdio prior to calling
          the scanner (because the  scanner  will  miss  whatever
          text  your  previous  reads  left  in  the  stdio input
          buffer).

          -Cr has no effect if you define YY_INPUT (see The  Gen-
          erated Scanner above).

          A lone -C specifies that the scanner tables  should  be
          compressed  but  neither  equivalence classes nor meta-
          equivalence classes should be used.

          The options -Cf or  -CF  and  -Cm  do  not  make  sense
          together - there is no opportunity for meta-equivalence
          classes if the table is not being  compressed.   Other-
          wise  the  options may be freely mixed, and are cumula-
          tive.

          The default setting is -Cem, which specifies that  flex
          should   generate   equivalence   classes   and   meta-
          equivalence classes.  This setting provides the highest
          degree   of  table  compression.   You  can  trade  off
          faster-executing scanners at the cost of larger  tables
          with the following generally being true:

              slowest & smallest
                    -Cem
                    -Cm
                    -Ce
                    -C
                    -C{f,F}e
                    -C{f,F}
                    -C{f,F}a
              fastest & largest

          Note that scanners with the smallest tables are usually
          generated and compiled the quickest, so during develop-
          ment you will usually want to use the default,  maximal
          compression.

          -Cfe is often a good compromise between speed and  size
          for production scanners.

     -ooutput
          directs flex to write the scanner to  the  file  output
          instead  of  lex.yy.c.  If  you  combine -o with the -t
          option, then the scanner is written to stdout  but  its
          #line directives (see the -L option above) refer to the
          file output.

     -Pprefix



Version 2.5          Last change: April 1995                   35






FLEX(1)                  USER COMMANDS                    FLEX(1)



          changes the default yy prefix  used  by  flex  for  all
          globally-visible variable and function names to instead
          be prefix. For  example,  -Pfoo  changes  the  name  of
          yytext  to  footext.  It  also  changes the name of the
          default output file from lex.yy.c  to  lex.foo.c.  Here
          are all of the names affected:

              yy_create_buffer
              yy_delete_buffer
              yy_flex_debug
              yy_init_buffer
              yy_flush_buffer
              yy_load_buffer_state
              yy_switch_to_buffer
              yyin
              yyleng
              yylex
              yylineno
              yyout
              yyrestart
              yytext
              yywrap

          (If you are using a C++ scanner, then only  yywrap  and
          yyFlexLexer  are affected.) Within your scanner itself,
          you can still refer to the global variables  and  func-
          tions  using  either  version of their name; but exter-
          nally, they have the modified name.

          This option lets you easily link together multiple flex
          programs  into the same executable.  Note, though, that
          using this option also renames  yywrap(),  so  you  now
          must either provide your own (appropriately-named) ver-
          sion of the routine for your scanner,  or  use  %option
          noyywrap,  as  linking with -lfl no longer provides one
          for you by default.

     -Sskeleton_file
          overrides the default skeleton  file  from  which  flex
          constructs its scanners.  You'll never need this option
          unless you are doing flex maintenance or development.

     flex also  provides  a  mechanism  for  controlling  options
     within  the  scanner  specification itself, rather than from
     the flex command-line.  This is done  by  including  %option
     directives  in  the  first section of the scanner specifica-
     tion.  You  can  specify  multiple  options  with  a  single
     %option directive, and multiple directives in the first sec-
     tion of your flex input file.

     Most options are given simply as names, optionally  preceded
     by  the word "no" (with no intervening whitespace) to negate



Version 2.5          Last change: April 1995                   36






FLEX(1)                  USER COMMANDS                    FLEX(1)



     their meaning.  A number are equivalent  to  flex  flags  or
     their negation:

         7bit            -7 option
         8bit            -8 option
         align           -Ca option
         backup          -b option
         batch           -B option
         c++             -+ option

         caseful or
         case-sensitive  opposite of -i (default)

         case-insensitive or
         caseless        -i option

         debug           -d option
         default         opposite of -s option
         ecs             -Ce option
         fast            -F option
         full            -f option
         interactive     -I option
         lex-compat      -l option
         meta-ecs        -Cm option
         perf-report     -p option
         read            -Cr option
         stdout          -t option
         verbose         -v option
         warn            opposite of -w option
                         (use "%option nowarn" for -w)

         array           equivalent to "%array"
         pointer         equivalent to "%pointer" (default)

     Some %option's provide features otherwise not available:

     always-interactive
          instructs flex to generate a scanner which always  con-
          siders  its input "interactive".  Normally, on each new
          input file the scanner calls isatty() in an attempt  to
          determine   whether   the  scanner's  input  source  is
          interactive and thus should be read a  character  at  a
          time.   When this option is used, however, then no such
          call is made.

     main directs flex to provide a default  main()  program  for
          the  scanner,  which  simply calls yylex(). This option
          implies noyywrap (see below).

     never-interactive
          instructs flex to generate a scanner which  never  con-
          siders  its input "interactive" (again, no call made to



Version 2.5          Last change: April 1995                   37






FLEX(1)                  USER COMMANDS                    FLEX(1)



          isatty()). This is the opposite of always-interactive.

     stack
          enables the use of start condition  stacks  (see  Start
          Conditions above).

     stdinit
          if set (i.e., %option  stdinit)  initializes  yyin  and
          yyout  to  stdin  and stdout, instead of the default of
          nil.  Some  existing  lex  programs  depend   on   this
          behavior,  even though it is not compliant with ANSI C,
          which does not require stdin and stdout to be  compile-
          time constant.

     yylineno
          directs flex to generate a scanner that  maintains  the
          number  of  the current line read from its input in the
          global variable yylineno. This  option  is  implied  by
          %option lex-compat.

     yywrap
          if unset (i.e., %option noyywrap),  makes  the  scanner
          not  call  yywrap()  upon  an  end-of-file,  but simply
          assume that there are no more files to scan (until  the
          user  points  yyin  at  a  new  file  and calls yylex()
          again).

     flex scans your rule actions to determine  whether  you  use
     the  REJECT  or  yymore()  features.   The reject and yymore
     options are available to override its decision as to whether
     you  use  the options, either by setting them (e.g., %option
     reject) to indicate the feature is indeed used, or unsetting
     them  to  indicate  it  actually  is not used (e.g., %option
     noyymore).

     Three options take string-delimited values, offset with '=':

         %option outfile="ABC"

     is equivalent to -oABC, and

         %option prefix="XYZ"

     is equivalent to -PXYZ. Finally,

         %option yyclass="foo"

     only applies when generating a C++ scanner ( -+ option).  It
     informs  flex  that  you  have  derived foo as a subclass of
     yyFlexLexer, so flex will place your actions in  the  member
     function  foo::yylex()  instead  of yyFlexLexer::yylex(). It
     also generates a yyFlexLexer::yylex() member  function  that



Version 2.5          Last change: April 1995                   38






FLEX(1)                  USER COMMANDS                    FLEX(1)



     emits      a      run-time      error      (by      invoking
     yyFlexLexer::LexerError()) if called.   See  Generating  C++
     Scanners, below, for additional information.

     A number of options are available for lint purists who  want
     to  suppress the appearance of unneeded routines in the gen-
     erated scanner.  Each of  the  following,  if  unset  (e.g.,
     %option  nounput ), results in the corresponding routine not
     appearing in the generated scanner:

         input, unput
         yy_push_state, yy_pop_state, yy_top_state
         yy_scan_buffer, yy_scan_bytes, yy_scan_string

     (though yy_push_state()  and  friends  won't  appear  anyway
     unless you use %option stack).

PERFORMANCE CONSIDERATIONS
     The main design goal of  flex  is  that  it  generate  high-
     performance  scanners.   It  has  been optimized for dealing
     well with large sets of rules.  Aside from  the  effects  on
     scanner  speed  of the table compression -C options outlined
     above, there are a number of options/actions  which  degrade
     performance.  These are, from most expensive to least:

         REJECT
         %option yylineno
         arbitrary trailing context

         pattern sets that require backing up
         %array
         %option interactive
         %option always-interactive

         '^' beginning-of-line operator
         yymore()

     with the first three all being quite expensive and the  last
     two  being  quite  cheap.   Note also that unput() is imple-
     mented as a routine call that potentially does quite  a  bit
     of  work,  while yyless() is a quite-cheap macro; so if just
     putting back some excess text you scanned, use yyless().

     REJECT should be avoided at all costs  when  performance  is
     important.  It is a particularly expensive option.

     Getting rid of backing up is messy and often may be an enor-
     mous  amount  of work for a complicated scanner.  In princi-
     pal,  one  begins  by  using  the  -b  flag  to  generate  a
     lex.backup file.  For example, on the input

         %%



Version 2.5          Last change: April 1995                   39






FLEX(1)                  USER COMMANDS                    FLEX(1)



         foo        return TOK_KEYWORD;
         foobar     return TOK_KEYWORD;

     the file looks like:

         State #6 is non-accepting -
          associated rule line numbers:
                2       3
          out-transitions: [ o ]
          jam-transitions: EOF [ \001-n  p-\177 ]

         State #8 is non-accepting -
          associated rule line numbers:
                3
          out-transitions: [ a ]
          jam-transitions: EOF [ \001-`  b-\177 ]

         State #9 is non-accepting -
          associated rule line numbers:
                3
          out-transitions: [ r ]
          jam-transitions: EOF [ \001-q  s-\177 ]

         Compressed tables always back up.

     The first few lines tell us that there's a scanner state  in
     which  it  can  make  a  transition on an 'o' but not on any
     other character,  and  that  in  that  state  the  currently
     scanned text does not match any rule.  The state occurs when
     trying to match the rules found at lines  2  and  3  in  the
     input  file.  If the scanner is in that state and then reads
     something other than an 'o', it will have to back up to find
     a  rule  which is matched.  With a bit of headscratching one
     can see that this must be the state it's in when it has seen
     "fo".   When  this  has  happened,  if  anything  other than
     another 'o' is seen, the scanner will have  to  back  up  to
     simply match the 'f' (by the default rule).

     The comment regarding State #8 indicates there's  a  problem
     when  "foob"  has  been  scanned.   Indeed, on any character
     other than an 'a', the scanner  will  have  to  back  up  to
     accept  "foo".  Similarly, the comment for State #9 concerns
     when "fooba" has been scanned and an 'r' does not follow.

     The final comment reminds us that there's no point going  to
     all the trouble of removing backing up from the rules unless
     we're using -Cf or -CF, since there's  no  performance  gain
     doing so with compressed scanners.

     The way to remove the backing up is to add "error" rules:

         %%



Version 2.5          Last change: April 1995                   40






FLEX(1)                  USER COMMANDS                    FLEX(1)



         foo         return TOK_KEYWORD;
         foobar      return TOK_KEYWORD;

         fooba       |
         foob        |
         fo          {
                     /* false alarm, not really a keyword */
                     return TOK_ID;
                     }


     Eliminating backing up among a list of keywords can also  be
     done using a "catch-all" rule:

         %%
         foo         return TOK_KEYWORD;
         foobar      return TOK_KEYWORD;

         [a-z]+      return TOK_ID;

     This is usually the best solution when appropriate.

     Backing up messages tend to cascade.  With a complicated set
     of  rules it's not uncommon to get hundreds of messages.  If
     one can decipher them, though, it often only takes  a  dozen
     or so rules to eliminate the backing up (though it's easy to
     make a mistake and have an error rule accidentally  match  a
     valid  token.   A  possible  future  flex feature will be to
     automatically add rules to eliminate backing up).

     It's important to keep in mind that you gain the benefits of
     eliminating  backing up only if you eliminate every instance
     of backing up.  Leaving just one means you gain nothing.

     Variable trailing context (where both the leading and trail-
     ing  parts  do  not  have a fixed length) entails almost the
     same performance loss as  REJECT  (i.e.,  substantial).   So
     when possible a rule like:

         %%
         mouse|rat/(cat|dog)   run();

     is better written:

         %%
         mouse/cat|dog         run();
         rat/cat|dog           run();

     or as

         %%
         mouse|rat/cat         run();



Version 2.5          Last change: April 1995                   41






FLEX(1)                  USER COMMANDS                    FLEX(1)



         mouse|rat/dog         run();

     Note that here the special '|' action does not  provide  any
     savings,  and can even make things worse (see Deficiencies /
     Bugs below).

     Another area where the user can increase a scanner's perfor-
     mance  (and  one that's easier to implement) arises from the
     fact that the longer the  tokens  matched,  the  faster  the
     scanner will run.  This is because with long tokens the pro-
     cessing of most input characters takes place in the  (short)
     inner  scanning  loop, and does not often have to go through
     the additional work of setting up the  scanning  environment
     (e.g.,  yytext)  for  the  action.  Recall the scanner for C
     comments:

         %x comment
         %%
                 int line_num = 1;

         "/*"         BEGIN(comment);

         <comment>[^*\n]*
         <comment>"*"+[^*/\n]*
         <comment>\n             ++line_num;
         <comment>"*"+"/"        BEGIN(INITIAL);

     This could be sped up by writing it as:

         %x comment
         %%
                 int line_num = 1;

         "/*"         BEGIN(comment);

         <comment>[^*\n]*
         <comment>[^*\n]*\n      ++line_num;
         <comment>"*"+[^*/\n]*
         <comment>"*"+[^*/\n]*\n ++line_num;
         <comment>"*"+"/"        BEGIN(INITIAL);

     Now instead of each  newline  requiring  the  processing  of
     another  action,  recognizing  the newlines is "distributed"
     over the other rules to keep the matched  text  as  long  as
     possible.   Note  that  adding  rules does not slow down the
     scanner!  The speed of the scanner  is  independent  of  the
     number  of  rules or (modulo the considerations given at the
     beginning of this section) how  complicated  the  rules  are
     with regard to operators such as '*' and '|'.

     A final example in speeding up a scanner: suppose  you  want
     to  scan through a file containing identifiers and keywords,



Version 2.5          Last change: April 1995                   42






FLEX(1)                  USER COMMANDS                    FLEX(1)



     one per line and with no other  extraneous  characters,  and
     recognize all the keywords.  A natural first approach is:

         %%
         asm      |
         auto     |
         break    |
         ... etc ...
         volatile |
         while    /* it's a keyword */

         .|\n     /* it's not a keyword */

     To eliminate the back-tracking, introduce a catch-all rule:

         %%
         asm      |
         auto     |
         break    |
         ... etc ...
         volatile |
         while    /* it's a keyword */

         [a-z]+   |
         .|\n     /* it's not a keyword */

     Now, if it's guaranteed that there's exactly  one  word  per
     line,  then  we  can reduce the total number of matches by a
     half by merging in the recognition of newlines with that  of
     the other tokens:

         %%
         asm\n    |
         auto\n   |
         break\n  |
         ... etc ...
         volatile\n |
         while\n  /* it's a keyword */

         [a-z]+\n |
         .|\n     /* it's not a keyword */

     One has to be careful here,  as  we  have  now  reintroduced
     backing  up  into the scanner.  In particular, while we know
     that there will never be any characters in the input  stream
     other  than letters or newlines, flex can't figure this out,
     and it will plan for possibly needing to back up when it has
     scanned  a  token like "auto" and then the next character is
     something other than a newline or a letter.   Previously  it
     would  then  just match the "auto" rule and be done, but now
     it has no "auto" rule, only a "auto\n" rule.   To  eliminate
     the possibility of backing up, we could either duplicate all



Version 2.5          Last change: April 1995                   43






FLEX(1)                  USER COMMANDS                    FLEX(1)



     rules but without final newlines, or, since we never  expect
     to  encounter  such  an  input  and therefore don't how it's
     classified, we can introduce one more catch-all  rule,  this
     one which doesn't include a newline:

         %%
         asm\n    |
         auto\n   |
         break\n  |
         ... etc ...
         volatile\n |
         while\n  /* it's a keyword */

         [a-z]+\n |
         [a-z]+   |
         .|\n     /* it's not a keyword */

     Compiled with -Cf, this is about as fast as one  can  get  a
     flex scanner to go for this particular problem.

     A final note: flex is slow when matching NUL's, particularly
     when  a  token  contains multiple NUL's.  It's best to write
     rules which match short amounts of text if it's  anticipated
     that the text will often include NUL's.

     Another final note regarding performance: as mentioned above
     in  the section How the Input is Matched, dynamically resiz-
     ing yytext to accommodate huge  tokens  is  a  slow  process
     because  it presently requires that the (huge) token be res-
     canned from the beginning.  Thus if  performance  is  vital,
     you  should  attempt to match "large" quantities of text but
     not "huge" quantities, where the cutoff between the  two  is
     at about 8K characters/token.

GENERATING C++ SCANNERS
     flex provides two different ways to  generate  scanners  for
     use  with C++.  The first way is to simply compile a scanner
     generated by flex using a C++ compiler instead of a  C  com-
     piler.   You  should  not  encounter any compilations errors
     (please report any you find to the email  address  given  in
     the  Author  section  below).   You can then use C++ code in
     your rule actions instead of C code.  Note that the  default
     input  source  for  your  scanner  remains yyin, and default
     echoing is still done to yyout. Both of these remain FILE  *
     variables and not C++ streams.

     You can also use flex to generate a C++ scanner class, using
     the  -+  option  (or,  equivalently,  %option c++), which is
     automatically specified if the name of the  flex  executable
     ends  in a '+', such as flex++. When using this option, flex
     defaults to generating the scanner  to  the  file  lex.yy.cc
     instead  of  lex.yy.c.  The  generated  scanner includes the



Version 2.5          Last change: April 1995                   44






FLEX(1)                  USER COMMANDS                    FLEX(1)



     header file FlexLexer.h, which defines the interface to  two
     C++ classes.

     The first class, FlexLexer, provides an abstract base  class
     defining  the  general scanner class interface.  It provides
     the following member functions:

     const char* YYText()
          returns the text of the most  recently  matched  token,
          the equivalent of yytext.

     int YYLeng()
          returns the length of the most recently matched  token,
          the equivalent of yyleng.

     int lineno() const
          returns the current  input  line  number  (see  %option
          yylineno), or 1 if %option yylineno was not used.

     void set_debug( int flag )
          sets the debugging flag for the scanner, equivalent  to
          assigning  to  yy_flex_debug  (see  the Options section
          above).  Note that you must  build  the  scanner  using
          %option debug to include debugging information in it.

     int debug() const
          returns the current setting of the debugging flag.

     Also   provided   are   member   functions   equivalent   to
     yy_switch_to_buffer(),  yy_create_buffer() (though the first
     argument is an istream* object pointer  and  not  a  FILE*),
     yy_flush_buffer(),   yy_delete_buffer(),   and   yyrestart()
     (again, the first argument is a istream* object pointer).

     The second class  defined  in  FlexLexer.h  is  yyFlexLexer,
     which  is  derived  from FlexLexer. It defines the following
     additional member functions:

     yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 )
          constructs a yyFlexLexer object using the given streams
          for  input  and  output.  If not specified, the streams
          default to cin and cout, respectively.

     virtual int yylex()
          performs the same role is  yylex()  does  for  ordinary
          flex  scanners:  it  scans  the input stream, consuming
          tokens, until a rule's action returns a value.  If  you
          derive a subclass S from yyFlexLexer and want to access
          the member functions and variables of S inside yylex(),
          then you need to use %option yyclass="S" to inform flex
          that you will be using that subclass instead of yyFlex-
          Lexer.   In   this   case,   rather   than   generating



Version 2.5          Last change: April 1995                   45






FLEX(1)                  USER COMMANDS                    FLEX(1)



          yyFlexLexer::yylex(), flex  generates  S::yylex()  (and
          also  generates a dummy yyFlexLexer::yylex() that calls
          yyFlexLexer::LexerError() if called).

     virtual void switch_streams(istream* new_in = 0,
          ostream* new_out = 0)  reassigns  yyin  to  new_in  (if
          non-nil)  and  yyout  to  new_out (ditto), deleting the
          previous input buffer if yyin is reassigned.

     int yylex( istream* new_in, ostream* new_out = 0 )
          first switches the input  streams  via  switch_streams(
          new_in,  new_out  )  and  then  returns  the  value  of
          yylex().

     In addition, yyFlexLexer  defines  the  following  protected
     virtual  functions which you can redefine in derived classes
     to tailor the scanner:

     virtual int LexerInput( char* buf, int max_size )
          reads up to max_size characters into  buf  and  returns
          the  number  of  characters  read.  To indicate end-of-
          input, return 0 characters.   Note  that  "interactive"
          scanners  (see  the  -B  and -I flags) define the macro
          YY_INTERACTIVE. If you redefine LexerInput()  and  need
          to  take  different actions depending on whether or not
          the scanner might  be  scanning  an  interactive  input
          source,  you can test for the presence of this name via
          #ifdef.

     virtual void LexerOutput( const char* buf, int size )
          writes out size characters from the buffer buf,  which,
          while NUL-terminated, may also contain "internal" NUL's
          if the scanner's rules can match  text  with  NUL's  in
          them.

     virtual void LexerError( const char* msg )
          reports a fatal error message.  The default version  of
          this function writes the message to the stream cerr and
          exits.

     Note that a yyFlexLexer object contains its entire  scanning
     state.   Thus  you  can use such objects to create reentrant
     scanners.  You can instantiate  multiple  instances  of  the
     same  yyFlexLexer  class,  and you can also combine multiple
     C++ scanner classes together in the same program  using  the
     -P option discussed above.

     Finally, note that the %array feature is  not  available  to
     C++ scanner classes; you must use %pointer (the default).

     Here is an example of a simple C++ scanner:




Version 2.5          Last change: April 1995                   46






FLEX(1)                  USER COMMANDS                    FLEX(1)



             // An example of using the flex C++ scanner class.

         %{
         int mylineno = 0;
         %}

         string  \"[^\n"]+\"

         ws      [ \t]+

         alpha   [A-Za-z]
         dig     [0-9]
         name    ({alpha}|{dig}|\$)({alpha}|{dig}|[_.\-/$])*
         num1    [-+]?{dig}+\.?([eE][-+]?{dig}+)?
         num2    [-+]?{dig}*\.{dig}+([eE][-+]?{dig}+)?
         number  {num1}|{num2}

         %%

         {ws}    /* skip blanks and tabs */

         "/*"    {
                 int c;

                 while((c = yyinput()) != 0)
                     {
                     if(c == '\n')
                         ++mylineno;

                     else if(c == '*')
                         {
                         if((c = yyinput()) == '/')
                             break;
                         else
                             unput(c);
                         }
                     }
                 }

         {number}  cout << "number " << YYText() << '\n';

         \n        mylineno++;

         {name}    cout << "name " << YYText() << '\n';

         {string}  cout << "string " << YYText() << '\n';

         %%

         int main( int /* argc */, char** /* argv */ )
             {
             FlexLexer* lexer = new yyFlexLexer;



Version 2.5          Last change: April 1995                   47






FLEX(1)                  USER COMMANDS                    FLEX(1)



             while(lexer->yylex() != 0)
                 ;
             return 0;
             }
     If you want to create multiple  (different)  lexer  classes,
     you  use  the -P flag (or the prefix= option) to rename each
     yyFlexLexer to some other xxFlexLexer. You then can  include
     <FlexLexer.h>  in  your  other sources once per lexer class,
     first renaming yyFlexLexer as follows:

         #undef yyFlexLexer
         #define yyFlexLexer xxFlexLexer
         #include <FlexLexer.h>

         #undef yyFlexLexer
         #define yyFlexLexer zzFlexLexer
         #include <FlexLexer.h>

     if, for example, you used %option  prefix="xx"  for  one  of
     your scanners and %option prefix="zz" for the other.

     IMPORTANT: the present form of the scanning class is experi-
     mental and may change considerably between major releases.

INCOMPATIBILITIES WITH LEX AND POSIX
     flex is a rewrite of the AT&T Unix lex tool (the two  imple-
     mentations  do not share any code, though), with some exten-
     sions and incompatibilities, both of which are of concern to
     those who wish to write scanners acceptable to either imple-
     mentation.  Flex is  fully  compliant  with  the  POSIX  lex
     specification,   except   that   when  using  %pointer  (the
     default), a call to unput() destroys the contents of yytext,
     which is counter to the POSIX specification.

     In this section we discuss all of the known areas of  incom-
     patibility  between flex, AT&T lex, and the POSIX specifica-
     tion.

     flex's -l option turns on  maximum  compatibility  with  the
     original  AT&T  lex  implementation,  at the cost of a major
     loss in the generated scanner's performance.  We note  below
     which incompatibilities can be overcome using the -l option.

     flex is fully compatible with lex with the following  excep-
     tions:

     -    The undocumented lex scanner internal variable yylineno
          is not supported unless -l or %option yylineno is used.

          yylineno should be maintained on  a  per-buffer  basis,
          rather  than  a  per-scanner  (single  global variable)
          basis.



Version 2.5          Last change: April 1995                   48






FLEX(1)                  USER COMMANDS                    FLEX(1)



          yylineno is not part of the POSIX specification.

     -    The input() routine is not redefinable, though  it  may
          be  called  to  read  characters following whatever has
          been matched by a rule.  If input() encounters an  end-
          of-file  the  normal  yywrap()  processing  is done.  A
          ``real'' end-of-file is returned by input() as EOF.

          Input is instead controlled by  defining  the  YY_INPUT
          macro.

          The flex restriction that input() cannot  be  redefined
          is  in  accordance  with the POSIX specification, which
          simply does not specify  any  way  of  controlling  the
          scanner's input other than by making an initial assign-
          ment to yyin.

     -    The unput() routine is not redefinable.  This  restric-
          tion is in accordance with POSIX.

     -    flex scanners are not as reentrant as lex scanners.  In
          particular,  if  you have an interactive scanner and an
          interrupt handler which long-jumps out of the  scanner,
          and  the  scanner is subsequently called again, you may
          get the following message:

              fatal flex scanner internal error--end of buffer missed

          To reenter the scanner, first use

              yyrestart( yyin );

          Note that this call will throw away any buffered input;
          usually  this  isn't  a  problem  with  an  interactive
          scanner.

          Also note that flex C++ scanner classes are  reentrant,
          so  if  using  C++ is an option for you, you should use
          them instead.  See "Generating C++ Scanners" above  for
          details.

     -    output() is not supported.  Output from the ECHO  macro
          is done to the file-pointer yyout (default stdout).

          output() is not part of the POSIX specification.

     -    lex does not support exclusive start  conditions  (%x),
          though they are in the POSIX specification.

     -    When definitions are expanded, flex  encloses  them  in
          parentheses.  With lex, the following:




Version 2.5          Last change: April 1995                   49






FLEX(1)                  USER COMMANDS                    FLEX(1)



              NAME    [A-Z][A-Z0-9]*
              %%
              foo{NAME}?      printf( "Found it\n" );
              %%

          will not match the string "foo" because when the  macro
          is  expanded  the rule is equivalent to "foo[A-Z][A-Z0-
          9]*?" and the precedence is such that the '?' is  asso-
          ciated  with  "[A-Z0-9]*".  With flex, the rule will be
          expanded to "foo([A-Z][A-Z0-9]*)?" and  so  the  string
          "foo" will match.

          Note that if the definition begins with ^ or ends  with
          $  then  it  is not expanded with parentheses, to allow
          these operators to appear in definitions without losing
          their  special  meanings.   But the <s>, /, and <<EOF>>
          operators cannot be used in a flex definition.

          Using -l results in the lex behavior of no  parentheses
          around the definition.

          The POSIX  specification  is  that  the  definition  be
          enclosed in parentheses.

     -    Some implementations of lex allow a  rule's  action  to
          begin  on  a  separate  line, if the rule's pattern has
          trailing whitespace:

              %%
              foo|bar<space here>
                { foobar_action(); }

          flex does not support this feature.

     -    The lex %r (generate a Ratfor scanner)  option  is  not
          supported.  It is not part of the POSIX specification.

     -    After a call to unput(), yytext is undefined until  the
          next  token  is  matched,  unless the scanner was built
          using %array. This is not the  case  with  lex  or  the
          POSIX specification.  The -l option does away with this
          incompatibility.

     -    The precedence of the {} (numeric  range)  operator  is
          different.   lex  interprets  "abc{1,3}" as "match one,
          two, or  three  occurrences  of  'abc'",  whereas  flex
          interprets  it  as "match 'ab' followed by one, two, or
          three occurrences of 'c'".  The latter is in  agreement
          with the POSIX specification.

     -    The precedence of the ^  operator  is  different.   lex
          interprets  "^foo|bar"  as  "match  either 'foo' at the



Version 2.5          Last change: April 1995                   50






FLEX(1)                  USER COMMANDS                    FLEX(1)



          beginning of a line, or 'bar' anywhere",  whereas  flex
          interprets  it  as "match either 'foo' or 'bar' if they
          come at the beginning of a line".   The  latter  is  in
          agreement with the POSIX specification.

     -    The special table-size declarations  such  as  %a  sup-
          ported  by  lex are not required by flex scanners; flex
          ignores them.

     -    The name FLEX_SCANNER is #define'd so scanners  may  be
          written  for use with either flex or lex. Scanners also
          include YY_FLEX_MAJOR_VERSION and YY_FLEX_MINOR_VERSION
          indicating  which version of flex generated the scanner
          (for example, for the 2.5 release, these defines  would
          be 2 and 5 respectively).

     The following flex features are not included in lex  or  the
     POSIX specification:

         C++ scanners
         %option
         start condition scopes
         start condition stacks
         interactive/non-interactive scanners
         yy_scan_string() and friends
         yyterminate()
         yy_set_interactive()
         yy_set_bol()
         YY_AT_BOL()
         <<EOF>>
         <*>
         YY_DECL
         YY_START
         YY_USER_ACTION
         YY_USER_INIT
         #line directives
         %{}'s around actions
         multiple actions on a line

     plus almost all of the flex flags.  The last feature in  the
     list  refers to the fact that with flex you can put multiple
     actions on the same line, separated with semi-colons,  while
     with lex, the following

         foo    handle_foo(); ++num_foos_seen;

     is (rather surprisingly) truncated to

         foo    handle_foo();

     flex does not truncate the action.   Actions  that  are  not
     enclosed  in  braces are simply terminated at the end of the



Version 2.5          Last change: April 1995                   51






FLEX(1)                  USER COMMANDS                    FLEX(1)



     line.

DIAGNOSTICS
     warning, rule cannot be matched  indicates  that  the  given
     rule  cannot  be matched because it follows other rules that
     will always match the same text as it.  For example, in  the
     following  "foo" cannot be matched because it comes after an
     identifier "catch-all" rule:

         [a-z]+    got_identifier();
         foo       got_foo();

     Using REJECT in a scanner suppresses this warning.

     warning, -s option given but default  rule  can  be  matched
     means  that  it  is  possible  (perhaps only in a particular
     start condition) that the default  rule  (match  any  single
     character)  is  the  only  one  that will match a particular
     input.  Since -s was given, presumably this is not intended.

     reject_used_but_not_detected          undefined           or
     yymore_used_but_not_detected  undefined  -  These errors can
     occur at compile time.  They indicate that the scanner  uses
     REJECT  or yymore() but that flex failed to notice the fact,
     meaning that flex scanned the first two sections looking for
     occurrences  of  these  actions  and failed to find any, but
     somehow you snuck some in (via a #include  file,  for  exam-
     ple).   Use  %option reject or %option yymore to indicate to
     flex that you really do use these features.

     flex scanner jammed - a scanner compiled with -s has encoun-
     tered  an  input  string  which wasn't matched by any of its
     rules.  This error can also occur due to internal problems.

     token too large, exceeds YYLMAX - your scanner  uses  %array
     and one of its rules matched a string longer than the YYLMAX
     constant (8K bytes by default).  You can increase the  value
     by  #define'ing  YYLMAX  in  the definitions section of your
     flex input.

     scanner requires -8 flag to use the  character  'x'  -  Your
     scanner specification includes recognizing the 8-bit charac-
     ter 'x' and you did  not  specify  the  -8  flag,  and  your
     scanner  defaulted  to 7-bit because you used the -Cf or -CF
     table compression options.  See the  discussion  of  the  -7
     flag for details.

     flex scanner push-back overflow - you used unput()  to  push
     back  so  much text that the scanner's buffer could not hold
     both the pushed-back text and the current token  in  yytext.
     Ideally  the scanner should dynamically resize the buffer in
     this case, but at present it does not.



Version 2.5          Last change: April 1995                   52






FLEX(1)                  USER COMMANDS                    FLEX(1)



     input buffer overflow, can't enlarge buffer because  scanner
     uses  REJECT  -  the  scanner  was  working  on  matching an
     extremely large token and needed to expand the input buffer.
     This doesn't work with scanners that use REJECT.

     fatal flex scanner internal error--end of  buffer  missed  -
     This  can  occur  in  an  scanner which is reentered after a
     long-jump has jumped out (or over) the scanner's  activation
     frame.  Before reentering the scanner, use:

         yyrestart( yyin );

     or, as noted above, switch to using the C++ scanner class.

     too many start conditions in <> you listed more start condi-
     tions  in a <> construct than exist (so you must have listed
     at least one of them twice).

FILES
     -lfl library with which scanners must be linked.

     lex.yy.c
          generated scanner (called lexyy.c on some systems).

     lex.yy.cc
          generated C++ scanner class, when using -+.

     <FlexLexer.h>
          header file defining the C++ scanner base class,  Flex-
          Lexer, and its derived class, yyFlexLexer.

     flex.skl
          skeleton scanner.  This file is only used when building
          flex, not when flex executes.

     lex.backup
          backing-up information for -b flag (called  lex.bck  on
          some systems).

DEFICIENCIES / BUGS
     Some trailing context patterns cannot  be  properly  matched
     and  generate  warning  messages  ("dangerous  trailing con-
     text").  These are patterns where the ending  of  the  first
     part  of  the rule matches the beginning of the second part,
     such as "zx*/xy*", where the 'x*' matches  the  'x'  at  the
     beginning  of  the  trailing  context.  (Note that the POSIX
     draft states that the text matched by such patterns is unde-
     fined.)

     For some trailing context rules, parts  which  are  actually
     fixed-length  are  not  recognized  as  such, leading to the
     abovementioned performance loss.  In particular, parts using



Version 2.5          Last change: April 1995                   53






FLEX(1)                  USER COMMANDS                    FLEX(1)



     '|'   or  {n}  (such  as  "foo{3}")  are  always  considered
     variable-length.

     Combining trailing context with the special '|'  action  can
     result  in fixed trailing context being turned into the more
     expensive variable trailing context.  For  example,  in  the
     following:

         %%
         abc      |
         xyz/def


     Use of unput() invalidates yytext  and  yyleng,  unless  the
     %array directive or the -l option has been used.

     Pattern-matching  of  NUL's  is  substantially  slower  than
     matching other characters.

     Dynamic resizing of the input buffer is slow, as it  entails
     rescanning  all the text matched so far by the current (gen-
     erally huge) token.

     Due to both buffering of input and  read-ahead,  you  cannot
     intermix  calls to <stdio.h> routines, such as, for example,
     getchar(), with flex rules and  expect  it  to  work.   Call
     input() instead.

     The total table entries listed by the -v flag  excludes  the
     number  of  table  entries needed to determine what rule has
     been matched.  The number of entries is equal to the  number
     of  DFA states if the scanner does not use REJECT, and some-
     what greater than the number of states if it does.

     REJECT cannot be used with the -f or -F options.

     The flex internal algorithms need documentation.

SEE ALSO
     lex(1), yacc(1), sed(1), awk(1).

     John Levine,  Tony  Mason,  and  Doug  Brown,  Lex  &  Yacc,
     O'Reilly and Associates.  Be sure to get the 2nd edition.

     M. E. Lesk and E. Schmidt, LEX - Lexical Analyzer Generator

     Alfred Aho, Ravi Sethi and Jeffrey Ullman, Compilers:  Prin-
     ciples,   Techniques   and   Tools,  Addison-Wesley  (1986).
     Describes  the  pattern-matching  techniques  used  by  flex
     (deterministic finite automata).





Version 2.5          Last change: April 1995                   54






FLEX(1)                  USER COMMANDS                    FLEX(1)



AUTHOR
     Vern Paxson, with the help of many ideas and  much  inspira-
     tion  from Van Jacobson.  Original version by Jef Poskanzer.
     The fast table representation is a partial implementation of
     a  design done by Van Jacobson.  The implementation was done
     by Kevin Gong and Vern Paxson.

     Thanks to the many flex beta-testers, feedbackers, and  con-
     tributors,  especially Francois Pinard, Casey Leedom, Robert
     Abramovitz,  Stan  Adermann,  Terry  Allen,  David   Barker-
     Plummer,  John  Basrai,  Neal  Becker,  Nelson  H.F.  Beebe,
     benson@odi.com, Karl Berry, Peter A. Bigot, Simon Blanchard,
     Keith  Bostic,  Frederic Brehm, Ian Brockbank, Kin Cho, Nick
     Christopher, Brian Clapper, J.T.  Conklin,  Jason  Coughlin,
     Bill  Cox,  Nick  Cropper, Dave Curtis, Scott David Daniels,
     Chris  G.  Demetriou,  Theo  Deraadt,  Mike  Donahue,  Chuck
     Doucette,  Tom  Epperly,  Leo  Eskin,  Chris  Faylor,  Chris
     Flatters, Jon Forrest, Jeffrey Friedl, Joe Gayda,  Kaveh  R.
     Ghazi,  Wolfgang  Glunz, Eric Goldman, Christopher M. Gould,
     Ulrich Grepel, Peer Griebel, Jan  Hajic,  Charles  Hemphill,
     NORO  Hideo,  Jarkko  Hietaniemi, Scott Hofmann, Jeff Honig,
     Dana Hudes, Eric Hughes,  John  Interrante,  Ceriel  Jacobs,
     Michal Jaegermann, Sakari Jalovaara, Jeffrey R. Jones, Henry
     Juengst, Klaus Kaempf, Jonathan I. Kamens, Terrence O  Kane,
     Amir  Katz, ken@ken.hilco.com, Kevin B. Kenny, Steve Kirsch,
     Winfried Koenig, Marq  Kole,  Ronald  Lamprecht,  Greg  Lee,
     Rohan  Lenard, Craig Leres, John Levine, Steve Liddle, David
     Loffredo, Mike Long, Mohamed el Lozy, Brian  Madsen,  Malte,
     Joe Marshall, Bengt Martensson, Chris Metcalf, Luke Mewburn,
     Jim Meyering,  R.  Alexander  Milowski,  Erik  Naggum,  G.T.
     Nicol,  Landon  Noll,  James  Nordby,  Marc  Nozell, Richard
     Ohnemus, Karsten Pahnke, Sven Panne,  Roland  Pesch,  Walter
     Pelissero,  Gaumond  Pierre, Esmond Pitt, Jef Poskanzer, Joe
     Rahmeh, Jarmo Raiha, Frederic Raimbault,  Pat  Rankin,  Rick
     Richardson,  Kevin  Rodgers,  Kai  Uwe  Rommel, Jim Roskind,
     Alberto Santini,  Andreas  Scherer,  Darrell  Schiebel,  Raf
     Schietekat,  Doug  Schmidt,  Philippe  Schnoebelen,  Andreas
     Schwab, Larry Schwimmer, Alex Siegel, Eckehard  Stolz,  Jan-
     Erik  Strvmquist, Mike Stump, Paul Stuart, Dave Tallman, Ian
     Lance Taylor, Chris Thewalt, Richard M. Timoney, Jodi  Tsai,
     Paul  Tuinenga,  Gary  Weik, Frank Whaley, Gerhard Wilhelms,
     Kent Williams, Ken Yap,  Ron  Zellar,  Nathan  Zelle,  David
     Zuhn,  and  those whose names have slipped my marginal mail-
     archiving skills but whose contributions are appreciated all
     the same.

     Thanks to Keith Bostic, Jon  Forrest,  Noah  Friedman,  John
     Gilmore, Craig Leres, John Levine, Bob Mulcahy, G.T.  Nicol,
     Francois Pinard, Rich Salz, and Richard  Stallman  for  help
     with various distribution headaches.





Version 2.5          Last change: April 1995                   55






FLEX(1)                  USER COMMANDS                    FLEX(1)



     Thanks to Esmond Pitt and Earle Horton for  8-bit  character
     support; to Benson Margulies and Fred Burke for C++ support;
     to Kent Williams and Tom Epperly for C++ class  support;  to
     Ove  Ewerlid  for  support  of NUL's; and to Eric Hughes for
     support of multiple buffers.

     This work was primarily done when I was with the  Real  Time
     Systems  Group at the Lawrence Berkeley Laboratory in Berke-
     ley, CA.  Many  thanks  to  all  there  for  the  support  I
     received.

     Send comments to vern@ee.lbl.gov.











































Version 2.5          Last change: April 1995                   56