# # puppetManifest.ctags --- multitable regex parser for Puppet's manifest file # # Copyright (c) 2017, Red Hat, Inc. # Copyright (c) 2017, Masatake YAMATO # # Author: Masatake YAMATO # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. # # # References: # # - https://github.com/puppetlabs/puppet-specifications/blob/master/language/intro.md # - https://docs.puppet.com/puppet/5.1/lang_visual_index.html # --langdef=PuppetManifest{_autoFQTag} --map-PuppetManifest=+.pp # # Kinds # --kinddef-PuppetManifest=c,class,classes --kinddef-PuppetManifest=d,definition,definitions --kinddef-PuppetManifest=n,node,nodes --kinddef-PuppetManifest=r,resource,resources --kinddef-PuppetManifest=v,variable,variables --kinddef-PuppetManifest=p,param,parameters --kinddef-PuppetManifest=V,vresource,virtual resources --kinddef-PuppetManifest=t,type,type aliases # # Separators # --_scopesep-PuppetManifest=/c::: --_scopesep-PuppetManifest=*/*::: # # Prelude # --_prelude-PuppetManifest={{ % spec:dict TRYMAKETAG tag:int true % spec:dict TRYMAKETAG false /trymaketag { { { 1 index _matchstr { % key value str 3 -1 roll % value str key _matchloc % value str loc 3 -1 roll exch % str value loc _tag _commit stop } { pop pop } ifelse } forall } stopped } def }} # # Tables # --_tabledef-PuppetManifest=main --_tabledef-PuppetManifest=separator --_tabledef-PuppetManifest=any --_tabledef-PuppetManifest=ignoreWhiteSpace --_tabledef-PuppetManifest=end --_tabledef-PuppetManifest=endWithPop --_tabledef-PuppetManifest=ssliteral --_tabledef-PuppetManifest=dsliteral --_tabledef-PuppetManifest=comment --_tabledef-PuppetManifest=blockStart --_tabledef-PuppetManifest=blockHead --_tabledef-PuppetManifest=blockHeadPopAtLast --_tabledef-PuppetManifest=block --_tabledef-PuppetManifest=classStart #--_tabledef-PuppetManifest=resourceBlock{args=end} --_tabledef-PuppetManifest=resourceBlock --_tabledef-PuppetManifest=skipLiteral --_tabledef-PuppetManifest=skipBlock --_tabledef-PuppetManifest=skipArray --_tabledef-PuppetManifest=skipArgs --_tabledef-PuppetManifest=skipCollector --_tabledef-PuppetManifest=signature --_tabledef-PuppetManifest=skipDefaultValue --_tabledef-PuppetManifest=var --_tabledef-PuppetManifest=defineStart --_tabledef-PuppetManifest=caseStart --_tabledef-PuppetManifest=ifStart --_tabledef-PuppetManifest=nodeStart --_tabledef-PuppetManifest=typeStart # # Utilities # --_mtable-regex-PuppetManifest=separator/[a-zA-Z0-9]// --_mtable-regex-PuppetManifest=separator///{tleave} --_mtable-regex-PuppetManifest=any/.// --_mtable-regex-PuppetManifest=ignoreWhiteSpace/[ \t\n]+// --_mtable-regex-PuppetManifest=end///{tleave} --_mtable-regex-PuppetManifest=endWithPop///{tleave}{scope=pop} --_mtable-regex-PuppetManifest=ssliteral/[^']*'//{tleave} --_mtable-regex-PuppetManifest=ssliteral/[^']+// --_mtable-regex-PuppetManifest=dsliteral/[^"]*"//{tleave} --_mtable-regex-PuppetManifest=dsliteral/[^"]+// # # comment # --_tabledef-PuppetManifest=comment_multiline --_tabledef-PuppetManifest=comment_oneline --_mtable-regex-PuppetManifest=comment/\/\*//{tenter=comment_multiline} --_mtable-regex-PuppetManifest=comment/\#//{tenter=comment_oneline} --_mtable-regex-PuppetManifest=comment_multiline/\*\///{tleave} --_mtable-extend-PuppetManifest=comment_multiline+any --_mtable-regex-PuppetManifest=comment_oneline/\n//{tleave} --_mtable-extend-PuppetManifest=comment_oneline+any # # skipLiteral # --_mtable-regex-PuppetManifest=skipLiteral/'//{tenter=ssliteral} --_mtable-regex-PuppetManifest=skipLiteral/"//{tenter=dsliteral} # # skipBlock # --_mtable-extend-PuppetManifest=skipBlock+comment --_mtable-extend-PuppetManifest=skipBlock+skipLiteral --_mtable-regex-PuppetManifest=skipBlock/\{//{tenter=skipBlock} --_mtable-regex-PuppetManifest=skipBlock/\}//{tleave} --_mtable-extend-PuppetManifest=skipBlock+any # # skipArray # --_mtable-extend-PuppetManifest=skipArray+comment --_mtable-extend-PuppetManifest=skipArray+skipLiteral --_mtable-regex-PuppetManifest=skipArray/\[//{tenter=skipArray} --_mtable-regex-PuppetManifest=skipArray/\]//{tleave} --_mtable-extend-PuppetManifest=skipArray+any # # skipArgs # --_mtable-extend-PuppetManifest=skipArgs+comment --_mtable-extend-PuppetManifest=skipArgs+skipLiteral --_mtable-regex-PuppetManifest=skipArgs/\(//{tenter=skipArgs} --_mtable-regex-PuppetManifest=skipArgs/\)//{tleave} --_mtable-extend-PuppetManifest=skipArgs+any # # signature # --_mtable-extend-PuppetManifest=signature+comment --_mtable-extend-PuppetManifest=signature+skipLiteral --_mtable-extend-PuppetManifest=signature+ignoreWhiteSpace --_mtable-regex-PuppetManifest=signature/\)//{tleave}{{ % % fill signature % dup ?, eq { pop } if ?) _buildstring _scopetop { exch signature: } { % something wrong pop } ifelse }} --_mtable-regex-PuppetManifest=signature/\$([a-zA-Z][_a-zA-Z0-9:]*)[ \t]*([=,])[ \t]*/\1/p/{scope=ref}{{ % push the name of parameter for filling the signature field of definition \2 0 get ?= eq { /skipDefaultValue _tenter } if ?$ \1 ?, }} --_mtable-extend-PuppetManifest=signature+any # # skipDefaultValue # --_mtable-extend-PuppetManifest=skipDefaultValue+comment --_mtable-extend-PuppetManifest=skipDefaultValue+skipLiteral --_mtable-regex-PuppetManifest=skipDefaultValue/\[//{tenter=skipArray} --_mtable-regex-PuppetManifest=skipDefaultValue/\{//{tenter=skipBlock} --_mtable-regex-PuppetManifest=skipDefaultValue/\(//{tenter=skipArgs} --_mtable-regex-PuppetManifest=skipDefaultValue/,//{tleave} --_mtable-regex-PuppetManifest=skipDefaultValue/\)//{tleave}{_advanceTo=0start} --_mtable-extend-PuppetManifest=skipDefaultValue+any # # skipCollector # --_mtable-extend-PuppetManifest=skipCollector+comment --_mtable-extend-PuppetManifest=skipCollector+skipLiteral --_mtable-regex-PuppetManifest=skipCollector/<>?//{tleave} --_mtable-extend-PuppetManifest=skipCollector+any # # block # --_mtable-regex-PuppetManifest=blockStart/(@)?(::[a-zA-Z0-9:_]+|[a-zA-Z][a-zA-Z0-9:_]*)[ \t\n]*\{//{tenter=resourceBlock}{{ \1 _isstring { /vresource } { /resource } ifelse \2 true % kind:name type:string true }} --_mtable-regex-PuppetManifest=blockStart/class[ \t\n]+//{tenter=classStart} --_mtable-regex-PuppetManifest=blockStart/define[ \t\n]+//{tenter=defineStart} --_mtable-regex-PuppetManifest=blockStart/case[ \t\n]+//{tenter=caseStart} --_mtable-regex-PuppetManifest=blockStart/(if|elsif|else|unless)[ \t\n]+//{tenter=ifStart} --_mtable-regex-PuppetManifest=blockStart/node[ \t\n]+//{tenter=nodeStart} --_mtable-regex-PuppetManifest=blockStart/type[ \t\n]+//{tenter=typeStart} --_mtable-regex-PuppetManifest=blockStart/\$//{tenter=var} --_mtable-extend-PuppetManifest=blockHead+comment --_mtable-extend-PuppetManifest=blockHead+ignoreWhiteSpace --_mtable-regex-PuppetManifest=blockHead/\{//{tenter=block,end} --_mtable-extend-PuppetManifest=blockHead+any --_mtable-extend-PuppetManifest=blockHeadPopAtLast+comment --_mtable-regex-PuppetManifest=blockHeadPopAtLast/\{//{tenter=block,endWithPop} --_mtable-extend-PuppetManifest=blockHeadPopAtLast+ignoreWhiteSpace --_mtable-regex-PuppetManifest=blockHeadPopAtLast/inherits[ \t\n]+(::[a-z][_a-zA-Z0-9:]*|[a-z][_a-zA-Z0-9:]*)[ \t\n]*//{{ _scopetop { dup :kind /class eq { \1 inherits: } { pop } ifelse } if }} --_mtable-extend-PuppetManifest=blockHeadPopAtLast+any --_mtable-extend-PuppetManifest=block+ignoreWhiteSpace --_mtable-extend-PuppetManifest=block+blockStart --_mtable-regex-PuppetManifest=block/< c; # "d": e => f; # } # B { # "g": h => i; # "j": k => k /* THIS COMMENT CANNOT BE IGNORED WELL */ # } --_mtable-regex-PuppetManifest=block/;?[ \t\n]*\}//{tleave} --_mtable-regex-PuppetManifest=block/;//{tjump=resourceBlock}{scope=pop}{{ false }} #--_mtable-regex-PuppetManifest=block/;//{tleave}{scope=pop} --_mtable-regex-PuppetManifest=block/:// --_mtable-extend-PuppetManifest=block+comment --_mtable-extend-PuppetManifest=block+skipLiteral --_mtable-regex-PuppetManifest=block/\{//{tenter=block} --_mtable-regex-PuppetManifest=block/.//{tenter=separator} # # main # --_mtable-extend-PuppetManifest=main+comment --_mtable-extend-PuppetManifest=main+ignoreWhiteSpace --_mtable-extend-PuppetManifest=main+skipLiteral --_mtable-regex-PuppetManifest=main/<> % kind:name type:string true [ (typename) type:string ] << 1 kind:name 2 kind:name >> trymaketag % kind:name type:string true [ (typename) type:string ] tag:int true % % kind:name type:string true [ (typename) type:string ] false { dup _scopepush exch typeref: } { pop } ifelse } { << 1 /resource 2 /resource >> trymaketag { _scopepush } if } ifelse }} --_mtable-regex-PuppetManifest=resourceName///{tquit} # resourceNameInArray expects data on optscript: # # false RESOURCENAMEINARRAY false # kind:name type:string true RESOURCENAMEINARRAY kind:name type:string true # --_mtable-regex-PuppetManifest=resourceNameInArray/'([^']+)'|"([^"]+)"///{tleave}{{ dup { % do the same as resourceName 1 index (typename) exch [ 3 1 roll ] << 4 index 1 exch dup 2 exch >> trymaketag { dup _scoperef exch typeref: } { pop } ifelse } { << 1 /resource 2 /resource >> trymaketag { _scoperef } if } ifelse }} --_mtable-regex-PuppetManifest=resourceNameInArray////{tquit} # --_mtable-extend-PuppetManifest=resourceBody+ignoreWhiteSpace # # Next pattern is just for optimization. # --_mtable-regex-PuppetManifest=resourceBody/[^\/#{'";}<]+// --_mtable-regex-PuppetManifest=resourceBody/'//{tenter=ssliteral} --_mtable-regex-PuppetManifest=resourceBody/"//{tenter=dsliteral} --_mtable-regex-PuppetManifest=resourceBody/\}//{tleave}{_advanceTo=0start}{scope=pop} --_mtable-regex-PuppetManifest=resourceBody/\{//{tenter=skipBlock} --_mtable-regex-PuppetManifest=resourceBody/;//{tleave}{scope=pop} --_mtable-regex-PuppetManifest=resourceBody/<