xref: /OpenGrok/opengrok-indexer/src/main/jflex/analysis/sh/ShSymbolTokenizer.lex (revision d219b4cea555a12b602d2d5518daa22134ad4879)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * See LICENSE.txt included in this distribution for the specific
9  * language governing permissions and limitations under the License.
10  *
11  * When distributing Covered Code, include this CDDL HEADER in each
12  * file and include the License file at LICENSE.txt.
13  * If applicable, add the following below this CDDL HEADER, with the
14  * fields enclosed by brackets "[]" replaced with your own identifying
15  * information: Portions Copyright [yyyy] [name of copyright owner]
16  *
17  * CDDL HEADER END
18  */
19 
20 /*
21  * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved.
22  * Portions Copyright (c) 2017, Chris Fraire <cfraire@me.com>.
23  */
24 
25 package org.opengrok.indexer.analysis.sh;
26 
27 import org.opengrok.indexer.analysis.JFlexSymbolMatcher;
28 %%
29 %public
30 %class ShSymbolTokenizer
31 %extends JFlexSymbolMatcher
32 %unicode
33 %int
34 %include ../CommonLexer.lexh
35 %char
36 
37 %state STRING COMMENT SCOMMENT QSTRING
38 
39 %include ../Common.lexh
40 %include Sh.lexh
41 %%
42 
43 <YYINITIAL> {
44 {Identifier}    {
45     String id = yytext();
46                 if(!Consts.shkwd.contains(id)){
47                         onSymbolMatched(id, yychar);
48                         return yystate(); }
49               }
50  {Number}    {}
51  \"     { yybegin(STRING); }
52  \'     { yybegin(QSTRING); }
53  "#"    { yybegin(SCOMMENT); }
54 
55  {Unary_op_req_lookahead} / \W    {
56     // noop
57  }
58  {Unary_op_req_lookahead} $    {
59     // noop
60  }
61  {WhspChar}+ {Unary_op_char} / ")"    {
62     // noop
63  }
64  {Binary_op}    {
65     // noop
66  }
67 }
68 
69 <STRING> {
70 "$" {Identifier}    {
71     onSymbolMatched(yytext().substring(1), yychar + 1);
72     return yystate();
73  }
74 
75 "${" {Identifier} "}"    {
76     int startOffset = 2;            // trim away the "${" prefix
77     int endOffset = yylength() - 1; // trim away the "}" suffix
78     onSymbolMatched(yytext().substring(startOffset, endOffset), yychar +
79         startOffset);
80     return yystate();
81  }
82 
83  \"     { yybegin(YYINITIAL); }
84  \\[\"\$\`\\]    {}
85 }
86 
87 <QSTRING> {
88  \\[\']    {}
89  \'     { yybegin(YYINITIAL); }
90 }
91 
92 <SCOMMENT> {
93 {WhspChar}+    {}
94 {EOL}      { yybegin(YYINITIAL);}
95 }
96 
97 <YYINITIAL, STRING, SCOMMENT, QSTRING> {
98 [^]    {}
99 }
100