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) 2017, 2021, Oracle and/or its affiliates. All rights reserved. 22*d219b4ceSAdam Hornacek * Portions Copyright (c) 2017-2018, Chris Fraire <cfraire@me.com>. 23*d219b4ceSAdam Hornacek */ 24*d219b4ceSAdam Hornacek 25*d219b4ceSAdam Hornacek package org.opengrok.indexer.analysis.powershell; 26*d219b4ceSAdam Hornacek 27*d219b4ceSAdam Hornacek import java.io.IOException; 28*d219b4ceSAdam Hornacek import java.util.Locale; 29*d219b4ceSAdam Hornacek import java.util.Stack; 30*d219b4ceSAdam Hornacek import java.util.regex.Matcher; 31*d219b4ceSAdam Hornacek import org.opengrok.indexer.analysis.JFlexSymbolMatcher; 32*d219b4ceSAdam Hornacek import org.opengrok.indexer.analysis.ScopeAction; 33*d219b4ceSAdam Hornacek import org.opengrok.indexer.web.HtmlConsts; 34*d219b4ceSAdam Hornacek %% 35*d219b4ceSAdam Hornacek %public 36*d219b4ceSAdam Hornacek %class PoshXref 37*d219b4ceSAdam Hornacek %extends JFlexSymbolMatcher 38*d219b4ceSAdam Hornacek %unicode 39*d219b4ceSAdam Hornacek %ignorecase 40*d219b4ceSAdam Hornacek %int 41*d219b4ceSAdam Hornacek %char 42*d219b4ceSAdam Hornacek %include ../CommonLexer.lexh 43*d219b4ceSAdam Hornacek %include ../CommonXref.lexh 44*d219b4ceSAdam Hornacek %{ 45*d219b4ceSAdam Hornacek private final Stack<String> styleStack = new Stack<String>(); 46*d219b4ceSAdam Hornacek 47*d219b4ceSAdam Hornacek @Override clearStack()48*d219b4ceSAdam Hornacek protected void clearStack() { 49*d219b4ceSAdam Hornacek super.clearStack(); 50*d219b4ceSAdam Hornacek styleStack.clear(); 51*d219b4ceSAdam Hornacek } 52*d219b4ceSAdam Hornacek emitComplexVariable()53*d219b4ceSAdam Hornacek private void emitComplexVariable() throws IOException { 54*d219b4ceSAdam Hornacek String id = yytext().substring(2, yylength() - 1); 55*d219b4ceSAdam Hornacek onNonSymbolMatched("${", yychar); 56*d219b4ceSAdam Hornacek onFilteredSymbolMatched(id, yychar, Consts.poshkwd, false); 57*d219b4ceSAdam Hornacek onNonSymbolMatched("}", yychar); 58*d219b4ceSAdam Hornacek } 59*d219b4ceSAdam Hornacek emitSimpleVariable()60*d219b4ceSAdam Hornacek private void emitSimpleVariable() throws IOException { 61*d219b4ceSAdam Hornacek String id = yytext().substring(1); 62*d219b4ceSAdam Hornacek onNonSymbolMatched("$", yychar); 63*d219b4ceSAdam Hornacek onFilteredSymbolMatched(id, yychar, Consts.poshkwd, false); 64*d219b4ceSAdam Hornacek } 65*d219b4ceSAdam Hornacek pushSpan(int newState,String className)66*d219b4ceSAdam Hornacek public void pushSpan(int newState, String className) throws IOException { 67*d219b4ceSAdam Hornacek onDisjointSpanChanged(className, yychar); 68*d219b4ceSAdam Hornacek yypush(newState); 69*d219b4ceSAdam Hornacek styleStack.push(className); 70*d219b4ceSAdam Hornacek } 71*d219b4ceSAdam Hornacek 72*d219b4ceSAdam Hornacek @Override yypop()73*d219b4ceSAdam Hornacek public void yypop() throws IOException { 74*d219b4ceSAdam Hornacek onDisjointSpanChanged(null, yychar); 75*d219b4ceSAdam Hornacek super.yypop(); 76*d219b4ceSAdam Hornacek styleStack.pop(); 77*d219b4ceSAdam Hornacek 78*d219b4ceSAdam Hornacek if (!styleStack.empty()) { 79*d219b4ceSAdam Hornacek String style = styleStack.peek(); 80*d219b4ceSAdam Hornacek onDisjointSpanChanged(style, yychar); 81*d219b4ceSAdam Hornacek } 82*d219b4ceSAdam Hornacek } 83*d219b4ceSAdam Hornacek chkLOC()84*d219b4ceSAdam Hornacek protected void chkLOC() { 85*d219b4ceSAdam Hornacek switch (yystate()) { 86*d219b4ceSAdam Hornacek case COMMENT: 87*d219b4ceSAdam Hornacek case SCOMMENT: 88*d219b4ceSAdam Hornacek break; 89*d219b4ceSAdam Hornacek default: 90*d219b4ceSAdam Hornacek phLOC(); 91*d219b4ceSAdam Hornacek break; 92*d219b4ceSAdam Hornacek } 93*d219b4ceSAdam Hornacek } 94*d219b4ceSAdam Hornacek %} 95*d219b4ceSAdam Hornacek 96*d219b4ceSAdam Hornacek File = {FNameChar}+ "." ([a-zA-Z0-9]+) 97*d219b4ceSAdam Hornacek 98*d219b4ceSAdam Hornacek /* 99*d219b4ceSAdam Hornacek * Differs from {FPath} in that the path segments are only constrained to be 100*d219b4ceSAdam Hornacek * {FNameChar}. 101*d219b4ceSAdam Hornacek */ 102*d219b4ceSAdam Hornacek AnyFPath = "/"? {FNameChar}+ ("/" {FNameChar}+)+ 103*d219b4ceSAdam Hornacek 104*d219b4ceSAdam Hornacek /* 105*d219b4ceSAdam Hornacek * States: 106*d219b4ceSAdam Hornacek * STRING - double-quoted string, ex: "hello, world!" 107*d219b4ceSAdam Hornacek * QSTRING - single-quoted string, ex: 'hello, world!' 108*d219b4ceSAdam Hornacek * COMMENT - multiple-line comment. 109*d219b4ceSAdam Hornacek * SCOMMENT - single-line comment, ex: # this is a comment 110*d219b4ceSAdam Hornacek * SUBSHELL - commands executed in a sub-shell, 111*d219b4ceSAdam Hornacek * example 1: (echo $header; cat file.txt) 112*d219b4ceSAdam Hornacek * HERESTRING - here-string, example: cat @" ... "@ 113*d219b4ceSAdam Hornacek * HEREQSTRING - here-string, example: cat @' ... '@ 114*d219b4ceSAdam Hornacek * DATATYPE - bracketed .NET datatype specification 115*d219b4ceSAdam Hornacek * DOTSYNTAX - await possible dot syntax -- e.g. property or methods 116*d219b4ceSAdam Hornacek */ 117*d219b4ceSAdam Hornacek %state STRING COMMENT SCOMMENT QSTRING SUBSHELL HERESTRING HEREQSTRING 118*d219b4ceSAdam Hornacek %state DATATYPE DOTSYNTAX 119*d219b4ceSAdam Hornacek 120*d219b4ceSAdam Hornacek %include ../Common.lexh 121*d219b4ceSAdam Hornacek %include ../CommonURI.lexh 122*d219b4ceSAdam Hornacek %include ../CommonPath.lexh 123*d219b4ceSAdam Hornacek %include Powershell.lexh 124*d219b4ceSAdam Hornacek %% 125*d219b4ceSAdam Hornacek 126*d219b4ceSAdam Hornacek <STRING>{ 127*d219b4ceSAdam Hornacek {ComplexVariable} { 128*d219b4ceSAdam Hornacek chkLOC(); 129*d219b4ceSAdam Hornacek emitComplexVariable(); 130*d219b4ceSAdam Hornacek } 131*d219b4ceSAdam Hornacek {SimpleVariable} { 132*d219b4ceSAdam Hornacek chkLOC(); 133*d219b4ceSAdam Hornacek emitSimpleVariable(); 134*d219b4ceSAdam Hornacek } 135*d219b4ceSAdam Hornacek } 136*d219b4ceSAdam Hornacek 137*d219b4ceSAdam Hornacek <YYINITIAL>{ 138*d219b4ceSAdam Hornacek \{ { chkLOC(); onScopeChanged(ScopeAction.INC, yytext(), yychar); } 139*d219b4ceSAdam Hornacek \} { chkLOC(); onScopeChanged(ScopeAction.DEC, yytext(), yychar); } 140*d219b4ceSAdam Hornacek \; { chkLOC(); onScopeChanged(ScopeAction.END, yytext(), yychar); } 141*d219b4ceSAdam Hornacek } 142*d219b4ceSAdam Hornacek 143*d219b4ceSAdam Hornacek <YYINITIAL, SUBSHELL> { 144*d219b4ceSAdam Hornacek ^ {Label} { 145*d219b4ceSAdam Hornacek chkLOC(); 146*d219b4ceSAdam Hornacek String capture = yytext(); 147*d219b4ceSAdam Hornacek onLabelMatched(capture, yychar, capture.substring(1)); 148*d219b4ceSAdam Hornacek } 149*d219b4ceSAdam Hornacek {Break} | 150*d219b4ceSAdam Hornacek {Continue} { 151*d219b4ceSAdam Hornacek chkLOC(); 152*d219b4ceSAdam Hornacek String capture = yytext(); 153*d219b4ceSAdam Hornacek Matcher m = PoshUtils.GOTO_LABEL.matcher(capture); 154*d219b4ceSAdam Hornacek if (!m.find()) { 155*d219b4ceSAdam Hornacek onNonSymbolMatched(capture, yychar); 156*d219b4ceSAdam Hornacek } else { 157*d219b4ceSAdam Hornacek String control = m.group(1); 158*d219b4ceSAdam Hornacek String space = m.group(2); 159*d219b4ceSAdam Hornacek String label = m.group(3); 160*d219b4ceSAdam Hornacek onFilteredSymbolMatched(control, yychar, Consts.poshkwd, false); 161*d219b4ceSAdam Hornacek onNonSymbolMatched(space, yychar); 162*d219b4ceSAdam Hornacek onLabelDefMatched(label, yychar); 163*d219b4ceSAdam Hornacek } 164*d219b4ceSAdam Hornacek } 165*d219b4ceSAdam Hornacek 166*d219b4ceSAdam Hornacek {DataType} { 167*d219b4ceSAdam Hornacek chkLOC(); 168*d219b4ceSAdam Hornacek yypushback(yylength()); 169*d219b4ceSAdam Hornacek pushSpan(DATATYPE, null); 170*d219b4ceSAdam Hornacek } 171*d219b4ceSAdam Hornacek } 172*d219b4ceSAdam Hornacek 173*d219b4ceSAdam Hornacek <YYINITIAL, SUBSHELL, DOTSYNTAX> { 174*d219b4ceSAdam Hornacek {ComplexVariable} { 175*d219b4ceSAdam Hornacek chkLOC(); 176*d219b4ceSAdam Hornacek emitComplexVariable(); 177*d219b4ceSAdam Hornacek if (yystate() != DOTSYNTAX) pushSpan(DOTSYNTAX, null); 178*d219b4ceSAdam Hornacek } 179*d219b4ceSAdam Hornacek {SimpleVariable} { 180*d219b4ceSAdam Hornacek chkLOC(); 181*d219b4ceSAdam Hornacek emitSimpleVariable(); 182*d219b4ceSAdam Hornacek if (yystate() != DOTSYNTAX) pushSpan(DOTSYNTAX, null); 183*d219b4ceSAdam Hornacek } 184*d219b4ceSAdam Hornacek } 185*d219b4ceSAdam Hornacek 186*d219b4ceSAdam Hornacek <YYINITIAL, SUBSHELL> { 187*d219b4ceSAdam Hornacek {Operator} { 188*d219b4ceSAdam Hornacek chkLOC(); 189*d219b4ceSAdam Hornacek String capture = yytext(); 190*d219b4ceSAdam Hornacek if (Consts.poshkwd.contains(capture.toLowerCase(Locale.ROOT))) { 191*d219b4ceSAdam Hornacek onKeywordMatched(capture, yychar); 192*d219b4ceSAdam Hornacek } else { 193*d219b4ceSAdam Hornacek String sigil = capture.substring(0, 1); 194*d219b4ceSAdam Hornacek String id = capture.substring(1); 195*d219b4ceSAdam Hornacek onNonSymbolMatched(sigil, yychar); 196*d219b4ceSAdam Hornacek onFilteredSymbolMatched(id, yychar, Consts.poshkwd, false); 197*d219b4ceSAdam Hornacek } 198*d219b4ceSAdam Hornacek } 199*d219b4ceSAdam Hornacek 200*d219b4ceSAdam Hornacek {Number} { 201*d219b4ceSAdam Hornacek chkLOC(); 202*d219b4ceSAdam Hornacek String lastClassName = getDisjointSpanClassName(); 203*d219b4ceSAdam Hornacek onDisjointSpanChanged(HtmlConsts.NUMBER_CLASS, yychar); 204*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 205*d219b4ceSAdam Hornacek onDisjointSpanChanged(lastClassName, yychar); 206*d219b4ceSAdam Hornacek } 207*d219b4ceSAdam Hornacek 208*d219b4ceSAdam Hornacek \" { 209*d219b4ceSAdam Hornacek chkLOC(); 210*d219b4ceSAdam Hornacek pushSpan(STRING, HtmlConsts.STRING_CLASS); 211*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 212*d219b4ceSAdam Hornacek } 213*d219b4ceSAdam Hornacek \' { 214*d219b4ceSAdam Hornacek chkLOC(); 215*d219b4ceSAdam Hornacek pushSpan(QSTRING, HtmlConsts.STRING_CLASS); 216*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 217*d219b4ceSAdam Hornacek } 218*d219b4ceSAdam Hornacek 219*d219b4ceSAdam Hornacek \# { 220*d219b4ceSAdam Hornacek pushSpan(SCOMMENT, HtmlConsts.COMMENT_CLASS); 221*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 222*d219b4ceSAdam Hornacek } 223*d219b4ceSAdam Hornacek \<\# { 224*d219b4ceSAdam Hornacek pushSpan(COMMENT, HtmlConsts.COMMENT_CLASS); 225*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 226*d219b4ceSAdam Hornacek } 227*d219b4ceSAdam Hornacek 228*d219b4ceSAdam Hornacek \@\" { 229*d219b4ceSAdam Hornacek chkLOC(); 230*d219b4ceSAdam Hornacek pushSpan(HERESTRING, HtmlConsts.STRING_CLASS); 231*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 232*d219b4ceSAdam Hornacek } 233*d219b4ceSAdam Hornacek \@\' { 234*d219b4ceSAdam Hornacek chkLOC(); 235*d219b4ceSAdam Hornacek pushSpan(HEREQSTRING, HtmlConsts.STRING_CLASS); 236*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 237*d219b4ceSAdam Hornacek } 238*d219b4ceSAdam Hornacek } 239*d219b4ceSAdam Hornacek 240*d219b4ceSAdam Hornacek <DOTSYNTAX> { 241*d219b4ceSAdam Hornacek "." { 242*d219b4ceSAdam Hornacek chkLOC(); 243*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 244*d219b4ceSAdam Hornacek } 245*d219b4ceSAdam Hornacek 246*d219b4ceSAdam Hornacek [^] { 247*d219b4ceSAdam Hornacek yypushback(yylength()); 248*d219b4ceSAdam Hornacek yypop(); 249*d219b4ceSAdam Hornacek } 250*d219b4ceSAdam Hornacek } 251*d219b4ceSAdam Hornacek 252*d219b4ceSAdam Hornacek <YYINITIAL, SUBSHELL, DATATYPE, DOTSYNTAX> { 253*d219b4ceSAdam Hornacek {Identifier} { 254*d219b4ceSAdam Hornacek chkLOC(); 255*d219b4ceSAdam Hornacek String id = yytext(); 256*d219b4ceSAdam Hornacek onFilteredSymbolMatched(id, yychar, Consts.poshkwd, false); 257*d219b4ceSAdam Hornacek } 258*d219b4ceSAdam Hornacek } 259*d219b4ceSAdam Hornacek 260*d219b4ceSAdam Hornacek <DATATYPE> { 261*d219b4ceSAdam Hornacek "]" { 262*d219b4ceSAdam Hornacek chkLOC(); 263*d219b4ceSAdam Hornacek yypushback(yylength()); 264*d219b4ceSAdam Hornacek yypop(); 265*d219b4ceSAdam Hornacek } 266*d219b4ceSAdam Hornacek } 267*d219b4ceSAdam Hornacek 268*d219b4ceSAdam Hornacek <STRING> { 269*d219b4ceSAdam Hornacek [`][\"\$`] | 270*d219b4ceSAdam Hornacek \"\" { chkLOC(); onNonSymbolMatched(yytext(), yychar); } 271*d219b4ceSAdam Hornacek 272*d219b4ceSAdam Hornacek \$? \" { 273*d219b4ceSAdam Hornacek chkLOC(); 274*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 275*d219b4ceSAdam Hornacek yypop(); 276*d219b4ceSAdam Hornacek } 277*d219b4ceSAdam Hornacek } 278*d219b4ceSAdam Hornacek 279*d219b4ceSAdam Hornacek <STRING, HERESTRING> { 280*d219b4ceSAdam Hornacek "$(" { 281*d219b4ceSAdam Hornacek chkLOC(); 282*d219b4ceSAdam Hornacek pushSpan(SUBSHELL, null); 283*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 284*d219b4ceSAdam Hornacek } 285*d219b4ceSAdam Hornacek } 286*d219b4ceSAdam Hornacek 287*d219b4ceSAdam Hornacek <QSTRING> { 288*d219b4ceSAdam Hornacek \'\' { chkLOC(); onNonSymbolMatched(yytext(), yychar); } 289*d219b4ceSAdam Hornacek \' { 290*d219b4ceSAdam Hornacek chkLOC(); 291*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 292*d219b4ceSAdam Hornacek yypop(); 293*d219b4ceSAdam Hornacek } 294*d219b4ceSAdam Hornacek } 295*d219b4ceSAdam Hornacek 296*d219b4ceSAdam Hornacek <COMMENT> { 297*d219b4ceSAdam Hornacek \#\> { 298*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 299*d219b4ceSAdam Hornacek yypop(); 300*d219b4ceSAdam Hornacek } 301*d219b4ceSAdam Hornacek } 302*d219b4ceSAdam Hornacek 303*d219b4ceSAdam Hornacek <SCOMMENT> { 304*d219b4ceSAdam Hornacek {WhspChar}*{EOL} { 305*d219b4ceSAdam Hornacek yypop(); 306*d219b4ceSAdam Hornacek onEndOfLineMatched(yytext(), yychar); 307*d219b4ceSAdam Hornacek } 308*d219b4ceSAdam Hornacek } 309*d219b4ceSAdam Hornacek 310*d219b4ceSAdam Hornacek <SUBSHELL> { 311*d219b4ceSAdam Hornacek \) { 312*d219b4ceSAdam Hornacek chkLOC(); 313*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 314*d219b4ceSAdam Hornacek yypop(); 315*d219b4ceSAdam Hornacek } 316*d219b4ceSAdam Hornacek } 317*d219b4ceSAdam Hornacek 318*d219b4ceSAdam Hornacek <HERESTRING> { 319*d219b4ceSAdam Hornacek // Match escaped dollar sign of variable 320*d219b4ceSAdam Hornacek // (eg. `$var) so it does not turn into web-link. 321*d219b4ceSAdam Hornacek "`$" { chkLOC(); onNonSymbolMatched(yytext(), yychar); } 322*d219b4ceSAdam Hornacek 323*d219b4ceSAdam Hornacek {SimpleVariable} { 324*d219b4ceSAdam Hornacek chkLOC(); 325*d219b4ceSAdam Hornacek emitSimpleVariable(); 326*d219b4ceSAdam Hornacek } 327*d219b4ceSAdam Hornacek 328*d219b4ceSAdam Hornacek {ComplexVariable} { 329*d219b4ceSAdam Hornacek chkLOC(); 330*d219b4ceSAdam Hornacek emitComplexVariable(); 331*d219b4ceSAdam Hornacek } 332*d219b4ceSAdam Hornacek ^ \"\@ { 333*d219b4ceSAdam Hornacek chkLOC(); 334*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 335*d219b4ceSAdam Hornacek yypop(); 336*d219b4ceSAdam Hornacek } 337*d219b4ceSAdam Hornacek } 338*d219b4ceSAdam Hornacek 339*d219b4ceSAdam Hornacek <HEREQSTRING> { 340*d219b4ceSAdam Hornacek ^ "'@" { 341*d219b4ceSAdam Hornacek chkLOC(); 342*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 343*d219b4ceSAdam Hornacek yypop(); 344*d219b4ceSAdam Hornacek } 345*d219b4ceSAdam Hornacek } 346*d219b4ceSAdam Hornacek 347*d219b4ceSAdam Hornacek <YYINITIAL, SUBSHELL> { 348*d219b4ceSAdam Hornacek /* Don't enter new state if special character is escaped. */ 349*d219b4ceSAdam Hornacek [`][`\(\)\{\}\"\'\$\#\\] { 350*d219b4ceSAdam Hornacek chkLOC(); 351*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 352*d219b4ceSAdam Hornacek } 353*d219b4ceSAdam Hornacek 354*d219b4ceSAdam Hornacek /* $# should not start a comment. */ 355*d219b4ceSAdam Hornacek "$#" { chkLOC(); onNonSymbolMatched(yytext(), yychar); } 356*d219b4ceSAdam Hornacek 357*d219b4ceSAdam Hornacek \$ ? \( { 358*d219b4ceSAdam Hornacek chkLOC(); 359*d219b4ceSAdam Hornacek pushSpan(SUBSHELL, null); 360*d219b4ceSAdam Hornacek onNonSymbolMatched(yytext(), yychar); 361*d219b4ceSAdam Hornacek } 362*d219b4ceSAdam Hornacek } 363*d219b4ceSAdam Hornacek 364*d219b4ceSAdam Hornacek <YYINITIAL, SUBSHELL, STRING, SCOMMENT, QSTRING> { 365*d219b4ceSAdam Hornacek {File} { 366*d219b4ceSAdam Hornacek chkLOC(); 367*d219b4ceSAdam Hornacek String path = yytext(); 368*d219b4ceSAdam Hornacek onFilelikeMatched(path, yychar); 369*d219b4ceSAdam Hornacek } 370*d219b4ceSAdam Hornacek 371*d219b4ceSAdam Hornacek {AnyFPath} { 372*d219b4ceSAdam Hornacek chkLOC(); 373*d219b4ceSAdam Hornacek onPathlikeMatched(yytext(), '/', false, yychar); 374*d219b4ceSAdam Hornacek } 375*d219b4ceSAdam Hornacek } 376*d219b4ceSAdam Hornacek 377*d219b4ceSAdam Hornacek <YYINITIAL, DATATYPE, SUBSHELL, STRING, COMMENT, SCOMMENT, QSTRING, HERESTRING, 378*d219b4ceSAdam Hornacek HEREQSTRING> { 379*d219b4ceSAdam Hornacek 380*d219b4ceSAdam Hornacek {WhspChar}*{EOL} { onEndOfLineMatched(yytext(), yychar); } 381*d219b4ceSAdam Hornacek [[\s]--[\n]] { onNonSymbolMatched(yytext(), yychar); } 382*d219b4ceSAdam Hornacek [^\n] { chkLOC(); onNonSymbolMatched(yytext(), yychar); } 383*d219b4ceSAdam Hornacek } 384*d219b4ceSAdam Hornacek 385*d219b4ceSAdam Hornacek <STRING, SCOMMENT, QSTRING> { 386*d219b4ceSAdam Hornacek {FNameChar}+ "@" {FNameChar}+ "." {FNameChar}+ 387*d219b4ceSAdam Hornacek { 388*d219b4ceSAdam Hornacek chkLOC(); 389*d219b4ceSAdam Hornacek onEmailAddressMatched(yytext(), yychar); 390*d219b4ceSAdam Hornacek } 391*d219b4ceSAdam Hornacek } 392*d219b4ceSAdam Hornacek 393*d219b4ceSAdam Hornacek <STRING, SCOMMENT> { 394*d219b4ceSAdam Hornacek {BrowseableURI} { 395*d219b4ceSAdam Hornacek chkLOC(); 396*d219b4ceSAdam Hornacek onUriMatched(yytext(), yychar); 397*d219b4ceSAdam Hornacek } 398*d219b4ceSAdam Hornacek } 399*d219b4ceSAdam Hornacek 400*d219b4ceSAdam Hornacek <QSTRING> { 401*d219b4ceSAdam Hornacek {BrowseableURI} { 402*d219b4ceSAdam Hornacek chkLOC(); 403*d219b4ceSAdam Hornacek onUriMatched(yytext(), yychar, PoshUtils.STRINGLITERAL_APOS_DELIMITER); 404*d219b4ceSAdam Hornacek } 405*d219b4ceSAdam Hornacek } 406*d219b4ceSAdam Hornacek 407*d219b4ceSAdam Hornacek <COMMENT> { 408*d219b4ceSAdam Hornacek {BrowseableURI} \>? { 409*d219b4ceSAdam Hornacek onUriMatched(yytext(), yychar, PoshUtils.MAYBE_END_MULTILINE_COMMENT); 410*d219b4ceSAdam Hornacek } 411*d219b4ceSAdam Hornacek } 412