xref: /OpenGrok/opengrok-indexer/src/main/jflex/analysis/tcl/TclSymbolTokenizer.lex (revision d219b4cea555a12b602d2d5518daa22134ad4879)
1*d219b4ceSAdam Hornacek /*
2*d219b4ceSAdam Hornacek  * CDDL HEADER START
3*d219b4ceSAdam Hornacek  *
4*d219b4ceSAdam Hornacek  * The contents of this file are subject to the terms of the
5*d219b4ceSAdam Hornacek  * Common Development and Distribution License (the "License").
6*d219b4ceSAdam Hornacek  * You may not use this file except in compliance with the License.
7*d219b4ceSAdam Hornacek  *
8*d219b4ceSAdam Hornacek  * See LICENSE.txt included in this distribution for the specific
9*d219b4ceSAdam Hornacek  * language governing permissions and limitations under the License.
10*d219b4ceSAdam Hornacek  *
11*d219b4ceSAdam Hornacek  * When distributing Covered Code, include this CDDL HEADER in each
12*d219b4ceSAdam Hornacek  * file and include the License file at LICENSE.txt.
13*d219b4ceSAdam Hornacek  * If applicable, add the following below this CDDL HEADER, with the
14*d219b4ceSAdam Hornacek  * fields enclosed by brackets "[]" replaced with your own identifying
15*d219b4ceSAdam Hornacek  * information: Portions Copyright [yyyy] [name of copyright owner]
16*d219b4ceSAdam Hornacek  *
17*d219b4ceSAdam Hornacek  * CDDL HEADER END
18*d219b4ceSAdam Hornacek  */
19*d219b4ceSAdam Hornacek 
20*d219b4ceSAdam Hornacek /*
21*d219b4ceSAdam Hornacek  * Copyright (c) 2008, 2021, Oracle and/or its affiliates. All rights reserved.
22*d219b4ceSAdam Hornacek  * Portions Copyright (c) 2017, Chris Fraire <cfraire@me.com>.
23*d219b4ceSAdam Hornacek  */
24*d219b4ceSAdam Hornacek 
25*d219b4ceSAdam Hornacek /*
26*d219b4ceSAdam Hornacek  * Gets Tcl symbols - ignores comments, strings, keywords
27*d219b4ceSAdam Hornacek  */
28*d219b4ceSAdam Hornacek 
29*d219b4ceSAdam Hornacek package org.opengrok.indexer.analysis.tcl;
30*d219b4ceSAdam Hornacek 
31*d219b4ceSAdam Hornacek import org.opengrok.indexer.analysis.JFlexSymbolMatcher;
32*d219b4ceSAdam Hornacek %%
33*d219b4ceSAdam Hornacek %public
34*d219b4ceSAdam Hornacek %class TclSymbolTokenizer
35*d219b4ceSAdam Hornacek %extends JFlexSymbolMatcher
36*d219b4ceSAdam Hornacek %unicode
37*d219b4ceSAdam Hornacek %int
38*d219b4ceSAdam Hornacek %include ../CommonLexer.lexh
39*d219b4ceSAdam Hornacek %char
40*d219b4ceSAdam Hornacek %{
41*d219b4ceSAdam Hornacek   private int braceCount;
42*d219b4ceSAdam Hornacek 
43*d219b4ceSAdam Hornacek   @Override
reset()44*d219b4ceSAdam Hornacek   public void reset() {
45*d219b4ceSAdam Hornacek       super.reset();
46*d219b4ceSAdam Hornacek       braceCount = 0;
47*d219b4ceSAdam Hornacek   }
48*d219b4ceSAdam Hornacek %}
49*d219b4ceSAdam Hornacek 
50*d219b4ceSAdam Hornacek %state STRING COMMENT SCOMMENT BRACES VARSUB2
51*d219b4ceSAdam Hornacek 
52*d219b4ceSAdam Hornacek %include ../Common.lexh
53*d219b4ceSAdam Hornacek %include Tcl.lexh
54*d219b4ceSAdam Hornacek %%
55*d219b4ceSAdam Hornacek 
56*d219b4ceSAdam Hornacek <YYINITIAL> {
57*d219b4ceSAdam Hornacek 
58*d219b4ceSAdam Hornacek  [\{]    {
59*d219b4ceSAdam Hornacek     ++braceCount;
60*d219b4ceSAdam Hornacek     yypush(BRACES);
61*d219b4ceSAdam Hornacek  }
62*d219b4ceSAdam Hornacek }
63*d219b4ceSAdam Hornacek 
64*d219b4ceSAdam Hornacek <YYINITIAL, BRACES> {
65*d219b4ceSAdam Hornacek  {Number}    {
66*d219b4ceSAdam Hornacek     // noop
67*d219b4ceSAdam Hornacek  }
68*d219b4ceSAdam Hornacek  \"     { yypush(STRING); }
69*d219b4ceSAdam Hornacek  "#"    { yypush(SCOMMENT); }
70*d219b4ceSAdam Hornacek  {WordOperators}    {
71*d219b4ceSAdam Hornacek     // noop
72*d219b4ceSAdam Hornacek  }
73*d219b4ceSAdam Hornacek }
74*d219b4ceSAdam Hornacek 
75*d219b4ceSAdam Hornacek <YYINITIAL, STRING, BRACES> {
76*d219b4ceSAdam Hornacek     {Backslash_sub}    {
77*d219b4ceSAdam Hornacek         // noop
78*d219b4ceSAdam Hornacek     }
79*d219b4ceSAdam Hornacek     {Backslash_nl}    {
80*d219b4ceSAdam Hornacek         // noop
81*d219b4ceSAdam Hornacek     }
82*d219b4ceSAdam Hornacek     {Varsub1}    {
83*d219b4ceSAdam Hornacek         String capture = yytext();
84*d219b4ceSAdam Hornacek         String sigil = capture.substring(0, 1);
85*d219b4ceSAdam Hornacek         String name = capture.substring(1);
86*d219b4ceSAdam Hornacek         if (!Consts.kwd.contains(name)) {
87*d219b4ceSAdam Hornacek             onSymbolMatched(name, yychar + 1);
88*d219b4ceSAdam Hornacek             return yystate();
89*d219b4ceSAdam Hornacek         }
90*d219b4ceSAdam Hornacek     }
91*d219b4ceSAdam Hornacek     {Varsub2}    {
92*d219b4ceSAdam Hornacek         yypush(VARSUB2);
93*d219b4ceSAdam Hornacek         String capture = yytext();
94*d219b4ceSAdam Hornacek         int lparen_i = capture.indexOf("(");
95*d219b4ceSAdam Hornacek         String name1 = capture.substring(1, lparen_i);
96*d219b4ceSAdam Hornacek         yypushback(capture.length() - lparen_i - 1);
97*d219b4ceSAdam Hornacek         if (name1.length() > 0 && !Consts.kwd.contains(name1)) {
98*d219b4ceSAdam Hornacek             onSymbolMatched(name1, yychar + 1);
99*d219b4ceSAdam Hornacek             return yystate();
100*d219b4ceSAdam Hornacek         }
101*d219b4ceSAdam Hornacek     }
102*d219b4ceSAdam Hornacek     {Varsub3}    {
103*d219b4ceSAdam Hornacek         String capture = yytext();
104*d219b4ceSAdam Hornacek         String name = capture.substring(2, capture.length() - 1);
105*d219b4ceSAdam Hornacek         if (!Consts.kwd.contains(name)) {
106*d219b4ceSAdam Hornacek             onSymbolMatched(name, yychar + 2);
107*d219b4ceSAdam Hornacek             return yystate();
108*d219b4ceSAdam Hornacek         }
109*d219b4ceSAdam Hornacek     }
110*d219b4ceSAdam Hornacek }
111*d219b4ceSAdam Hornacek 
112*d219b4ceSAdam Hornacek <VARSUB2> {
113*d219b4ceSAdam Hornacek     {name_unit}+    {
114*d219b4ceSAdam Hornacek         String name2 = yytext();
115*d219b4ceSAdam Hornacek         yypop();
116*d219b4ceSAdam Hornacek         if (!Consts.kwd.contains(name2)) {
117*d219b4ceSAdam Hornacek             onSymbolMatched(name2, yychar);
118*d219b4ceSAdam Hornacek             return yystate();
119*d219b4ceSAdam Hornacek         }
120*d219b4ceSAdam Hornacek     }
121*d219b4ceSAdam Hornacek }
122*d219b4ceSAdam Hornacek 
123*d219b4ceSAdam Hornacek <YYINITIAL, BRACES> {
124*d219b4ceSAdam Hornacek     {OrdinaryWord}    {
125*d219b4ceSAdam Hornacek         String id = yytext();
126*d219b4ceSAdam Hornacek         if (!Consts.kwd.contains(id)) {
127*d219b4ceSAdam Hornacek             onSymbolMatched(id, yychar);
128*d219b4ceSAdam Hornacek             return yystate();
129*d219b4ceSAdam Hornacek         }
130*d219b4ceSAdam Hornacek     }
131*d219b4ceSAdam Hornacek }
132*d219b4ceSAdam Hornacek 
133*d219b4ceSAdam Hornacek <STRING> {
134*d219b4ceSAdam Hornacek  \"     { yypop(); }
135*d219b4ceSAdam Hornacek }
136*d219b4ceSAdam Hornacek 
137*d219b4ceSAdam Hornacek <BRACES> {
138*d219b4ceSAdam Hornacek     [\}]    {
139*d219b4ceSAdam Hornacek         if (--braceCount == 0) {
140*d219b4ceSAdam Hornacek             yypop();
141*d219b4ceSAdam Hornacek         }
142*d219b4ceSAdam Hornacek     }
143*d219b4ceSAdam Hornacek     [\{]    {
144*d219b4ceSAdam Hornacek         ++braceCount;
145*d219b4ceSAdam Hornacek     }
146*d219b4ceSAdam Hornacek }
147*d219b4ceSAdam Hornacek 
148*d219b4ceSAdam Hornacek <SCOMMENT> {
149*d219b4ceSAdam Hornacek  {EOL}    { yypop(); }
150*d219b4ceSAdam Hornacek }
151*d219b4ceSAdam Hornacek 
152*d219b4ceSAdam Hornacek <YYINITIAL, STRING, COMMENT, SCOMMENT, BRACES> {
153*d219b4ceSAdam Hornacek {WhspChar}+ |
154*d219b4ceSAdam Hornacek [^]    {}
155*d219b4ceSAdam Hornacek }
156