1# 2# systemtap.ctags --- multitable regex parser for SystemTap script file 3# 4# Copyright (c) 2018, Red Hat, Inc. 5# Copyright (c) 2018, Masatake YAMATO 6# 7# Author: Masatake YAMATO <yamato@redhat.com> 8# 9# This program is free software; you can redistribute it and/or 10# modify it under the terms of the GNU General Public License 11# as published by the Free Software Foundation; either version 2 12# of the License, or (at your option) any later version. 13# 14# This program is distributed in the hope that it will be useful, 15# but WITHOUT ANY WARRANTY; without even the implied warranty of 16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17# GNU General Public License for more details. 18# 19# You should have received a copy of the GNU General Public License 20# along with this program; if not, write to the Free Software 21# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 22# USA. 23# 24# 25# References: 26# 27# - https://sourceware.org/systemtap/langref/ 28# 29--langdef=SystemTap 30--map-SystemTap=+.stp 31--map-SystemTap=+.stpm 32--alias-SystemTap=+stap 33 34--kinddef-SystemTap=p,probe,probe aliases 35--kinddef-SystemTap=f,function,functions 36--kinddef-SystemTap=v,variable,variables 37--kinddef-SystemTap=m,macro,macros 38 39--_tabledef-SystemTap=main 40--_tabledef-SystemTap=comment 41--_tabledef-SystemTap=any 42--_tabledef-SystemTap=skipWhiteSpace 43--_tabledef-SystemTap=skipLiteral 44--_tabledef-SystemTap=ssliteral 45--_tabledef-SystemTap=dsliteral 46--_tabledef-SystemTap=arraysize 47 48--_tabledef-SystemTap=stmtend 49 50--_tabledef-SystemTap=probe 51--_tabledef-SystemTap=probeBody 52--_tabledef-SystemTap=probeStmt 53 54--_tabledef-SystemTap=func 55--_tabledef-SystemTap=funcSig 56--_tabledef-SystemTap=funcBody 57--_tabledef-SystemTap=funcStmt 58--_tabledef-SystemTap=cfuncStmt 59 60--_tabledef-SystemTap=vars 61 62--_tabledef-SystemTap=macro 63--_tabledef-SystemTap=macroSig 64--_tabledef-SystemTap=macroBody 65--_tabledef-SystemTap=macroStmt 66 67# 68# Utilities 69# 70--_mtable-regex-SystemTap=any/.// 71--_mtable-regex-SystemTap=skipWhiteSpace/[ \t\n]+// 72--_mtable-regex-SystemTap=skipLiteral/"//{tenter=dsliteral} 73--_mtable-regex-SystemTap=skipLiteral/'//{tenter=ssliteral} 74--_mtable-regex-SystemTap=ssliteral/[^']*'//{tleave} 75--_mtable-regex-SystemTap=ssliteral/[^']+// 76--_mtable-regex-SystemTap=dsliteral/[^"\\]+// 77--_mtable-regex-SystemTap=dsliteral/"//{tleave} 78--_mtable-regex-SystemTap=dsliteral/\\.// 79--_mtable-regex-SystemTap=stmtend///{tleave}{scope=pop} 80--_mtable-regex-SystemTap=arraysize/[^]\/#]+// 81--_mtable-regex-SystemTap=arraysize/]//{tleave} 82--_mtable-extend-SystemTap=arraysize+comment 83--_mtable-extend-SystemTap=arraysize+any 84 85# 86# comment 87# 88--_tabledef-SystemTap=comment_multiline 89--_tabledef-SystemTap=comment_oneline 90--_mtable-regex-SystemTap=comment/\#//{tenter=comment_oneline} 91--_mtable-regex-SystemTap=comment/\/\*//{tenter=comment_multiline} 92--_mtable-regex-SystemTap=comment/\/\///{tenter=comment_oneline} 93 94--_mtable-regex-SystemTap=comment_multiline/[^*]+// 95--_mtable-regex-SystemTap=comment_multiline/\*\///{tleave} 96--_mtable-extend-SystemTap=comment_multiline+any 97 98--_mtable-regex-SystemTap=comment_oneline/[^\n]*\n//{tleave} 99--_mtable-extend-SystemTap=comment_oneline+any 100 101# 102# main 103# 104--_mtable-regex-SystemTap=main/[^#\/'"pfg@%]+// 105--_mtable-regex-SystemTap=main/probe[[:space:]]+//{tenter=probe} 106--_mtable-extend-SystemTap=main+comment 107--_mtable-regex-SystemTap=main/@define[[:space:]]+//{tenter=macro} 108--_mtable-regex-SystemTap=main/function[[:space:]]+//{tenter=func} 109--_mtable-regex-SystemTap=main/global[[:space:]]+//{tenter=vars} 110--_mtable-regex-SystemTap=main/%[\{(]//{tenter=cfuncStmt} 111--_mtable-extend-SystemTap=main+any 112 113# 114# probe 115# 116--_mtable-regex-SystemTap=probe/([[:alpha:]_][[:alnum:]_.]*)[[:space:]]*\+?=[[:space:]]*/\1/p/{tenter=probeBody}{scope=push} 117 118# This "push" is dummy. 119--_mtable-regex-SystemTap=probe/([[:alpha:]_][[:alnum:]_.]*)[[:space:]]*///{tenter=probeBody}{scope=push} 120 121# 122# probeBody 123# 124--_mtable-regex-SystemTap=probeBody/[^\{\/#'"]+// 125--_mtable-regex-SystemTap=probeBody/\{//{tenter=probeStmt,stmtend} 126--_mtable-extend-SystemTap=probeBody+skipLiteral 127--_mtable-extend-SystemTap=probeBody+comment 128--_mtable-extend-SystemTap=probeBody+any 129 130# 131# probeStmt 132# 133--_mtable-regex-SystemTap=probeStmt/[^\{\}\/#'"]+// 134--_mtable-regex-SystemTap=probeStmt/\}//{tleave} 135--_mtable-extend-SystemTap=probeStmt+skipLiteral 136--_mtable-regex-SystemTap=probeStmt/\{//{tenter=probeStmt} 137--_mtable-extend-SystemTap=probeStmt+comment 138--_mtable-extend-SystemTap=probeStmt+any 139 140# 141# func 142# 143 144# TODO: return type should be recorded to typeref field 145--_mtable-regex-SystemTap=func/([[:alpha:]_][[:alnum:]_]*)(:[[:alpha:]_][[:alnum:]_]*)?[[:space:]]*\(/\1/f/{tenter=funcSig,funcBody}{scope=push} 146 147# TODO: capture parameters 148--_mtable-regex-SystemTap=funcSig/[^)\/]+// 149--_mtable-regex-SystemTap=funcSig/\)(:[0-9]+)?//{tleave} 150--_mtable-extend-SystemTap=funcSig+comment 151--_mtable-extend-SystemTap=funcSig+any 152 153--_mtable-regex-SystemTap=funcBody/[^\{%'"#]+// 154--_mtable-regex-SystemTap=funcBody/\{//{tenter=funcStmt,stmtend} 155--_mtable-regex-SystemTap=funcBody/%[\{(]//{tenter=cfuncStmt,stmtend} 156--_mtable-extend-SystemTap=funcBody+comment 157--_mtable-extend-SystemTap=funcBody+any 158 159# 160# funcStmt and cfuncStmt 161# 162--_mtable-regex-SystemTap=funcStmt/[^%\/#'"\{\}]+// 163--_mtable-regex-SystemTap=funcStmt/\}//{tleave} 164--_mtable-extend-SystemTap=funcStmt+skipLiteral 165--_mtable-extend-SystemTap=funcStmt+comment 166--_mtable-regex-SystemTap=funcStmt/%[\{(]//{tenter=cfuncStmt} 167--_mtable-regex-SystemTap=funcStmt/\{//{tenter=funcStmt} 168--_mtable-extend-SystemTap=funcStmt+any 169 170--_mtable-regex-SystemTap=cfuncStmt/[^%\/#'"]+// 171--_mtable-extend-SystemTap=cfuncStmt+comment 172--_mtable-extend-SystemTap=cfuncStmt+skipLiteral 173--_mtable-regex-SystemTap=cfuncStmt/%[\})]//{tleave} 174--_mtable-regex-SystemTap=cfuncStmt/%[\{(]//{tenter=cfuncStmt} 175--_mtable-extend-SystemTap=cfuncStmt+any 176 177# 178# vars 179# 180--_mtable-regex-SystemTap=vars/([[:alpha:]_][[:alnum:]_]*)%?/\1/v/ 181--_mtable-regex-SystemTap=vars/[\n]//{tleave} 182--_mtable-regex-SystemTap=vars/,[[:space:]]*//{tjump=vars} 183--_mtable-extend-SystemTap=vars+comment 184--_mtable-extend-SystemTap=vars+skipLiteral 185--_mtable-regex-SystemTap=vars/\[//{tenter=arraysize} 186--_mtable-extend-SystemTap=vars+any 187 188# 189# macro 190# 191--_mtable-regex-SystemTap=macro/([[:alpha:]_][[:alnum:]_]*)[[:space:]]*\(/\1/m/{tenter=macroSig,macroBody}{scope=push} 192--_mtable-regex-SystemTap=macro/([[:alpha:]_][[:alnum:]_]*)[[:space:]]*/\1/m/{tenter=macroBody,stmtend}{scope=push} 193 194# TODO: capture parameters 195--_mtable-regex-SystemTap=macroSig/[^#\/)]+// 196--_mtable-regex-SystemTap=macroSig/\)//{tleave} 197--_mtable-extend-SystemTap=macroSig+comment 198--_mtable-extend-SystemTap=macroSig+any 199 200 201--_mtable-regex-SystemTap=macroBody/[^%#\/)]+// 202--_mtable-regex-SystemTap=macroBody/%\(//{tenter=macroStmt,stmtend} 203--_mtable-extend-SystemTap=macroBody+comment 204--_mtable-extend-SystemTap=macroBody+any 205 206--_mtable-regex-SystemTap=macroStmt/[^#\/%'"]+// 207--_mtable-regex-SystemTap=macroStmt/%\)//{tleave} 208--_mtable-extend-SystemTap=macroStmt+skipLiteral 209--_mtable-extend-SystemTap=macroStmt+comment 210--_mtable-regex-SystemTap=macroStmt/%\(//{tenter=macroStmt} 211--_mtable-extend-SystemTap=macroStmt+any 212