Posted to tcl by bairui at Fri Nov 02 04:47:04 GMT 2018view pretty
proc parseScript {script} { global knownGlobals unknownCommands knownCommands syntax catch {unset unknownCommands} set unknownCommands {} set knownVars {} array set ::knownAliases {} array set ::namespacePaths {} foreach g $knownGlobals { knownVar knownVars $g dict set knownVars $g set 1 } set ::Nagelfar(firstpass) 0 set script [buildLineDb $script] set ::instrumenting(script) $script pushNamespace {} if {$::Nagelfar(2pass)} { # First do one round with proc checking set ::Nagelfar(firstpass) 1 parseBody $script 0 knownVars #echo "Second pass" set ::Nagelfar(firstpass) 0 } parseBody $script 0 knownVars popNamespace # Check commands that where unknown when encountered # FIXA: aliases foreach apa $unknownCommands { foreach {cmd cmds index} $apa break set found 0 foreach cmdCandidate $cmds { if {[info exists syntax($cmdCandidate)] || \ [lsearch $knownCommands $cmdCandidate] >= 0} { set found 1 break } } if {!$found} { # Close brace is reported elsewhere if {$cmd ne "\}"} { # Different messages depending on name if {[regexp {^(?:(?:[\w',:.-]+)|(?:%W))$} $cmd]} { errorMsg W "Unknown command \"$cmd\"" $index } else { errorMsg E "Strange command \"$cmd\"" $index } } } } # Update known globals. foreach var [dict keys $knownVars] { if {[dict get $knownVars $var namespace] != ""} continue if {[dict get $knownVars $var local]} continue # Check if it has been set. if {[dict get $knownVars $var set]} { if {[lsearch $knownGlobals $var] == -1} { lappend knownGlobals $var } } } }