diff options
Diffstat (limited to 'src/symtable.xsl')
-rw-r--r-- | src/symtable.xsl | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/symtable.xsl b/src/symtable.xsl new file mode 100644 index 0000000..93a9923 --- /dev/null +++ b/src/symtable.xsl @@ -0,0 +1,101 @@ +<?xml version="1.0"?> +<!-- + Symbol table + + Copyright (C) 2016 LoVullo Associates, Inc. + + This file is part of TAME. + + TAME 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 3 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, see + <http://www.gnu.org/licenses/>. +--> +<stylesheet version="2.0" + xmlns="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:f="http://mikegerwitz.com/hoxsl/apply" + xmlns:symtable="http://www.lovullo.com/tame/symtable" + xmlns:preproc="http://www.lovullo.com/rater/preproc"> + +<import href="symtable.xsl.apply" /> + + +<!-- + @node Symbol Table + @section Symbol Table + + The @dfn{symbol table} holds declarations for each symbol known to + a@tie{}particular package. + Symbol tables are represented by @code{preproc:syms} + elements.@footnote{ + The @code{preproc} namespace exists for legacy reasons; + it will change in the future.} + + A @dfn{symbol} is an abstract representation of some object@mdash{ + }a calculation, classification, typedef, etc.@mdash{ + }containing the source location and useful metadata. + @todo{Document symbol format and metadata.} + Symbols are represented by @code{preproc:sym} elements. +--> + + +<!-- + Produce a list of duplicate symbols in@tie{}@var{$symtable}, + grouped by @code{@@name}. + All duplicates will be returned@mdash{ + }that is, if @math{S_1} appears before duplicate @math{S_2} + in the symbol table, both@tie{}@math{S_1} and@tie{}@math{S_2} + will be returned. + + If two symbols have duplicate @code{@@name}s but the same + @code{@@src}, + then they are not considered to be duplicates, + @emph{unless} another duplicate symbol of the + same@tie{}@code{@@name} is found with a different @code{@@src}, + in which case all symbols will be returned. + This allows sloppy comparison on concatenated symbol tables before + tidying it up. + + Externs are ignored, since they represent symbols that need to be + satisfied at some point@mdash{ + }this will be checked during linking. + + Symbols (@code{preproc:sym} nodes) are returned by reference. + + This method name is ``find'' duplicates rather than ``get'' to + emphasize that processing is performed, which is potentially + intensive given a large symbol table@tie{}@var{$symtable}. +--> +<function name="symtable:find-duplicates" as="element( preproc:sym )*"> + <param name="symtable" as="element( preproc:syms )" /> + + <for-each-group select="$symtable/preproc:sym[ + not( @extern = 'true' ) ]" + group-by="@name"> + <!-- @src may be omitted to convey a local symbol --> + <variable name="srcs" as="xs:string*" + select="distinct-values( + for $sym in current-group() + return if ( exists( $sym/@src ) ) then + $sym/@src + else + '.' )" /> + + <sequence select="if ( count( $srcs ) gt 1 ) then + current-group() + else + ()" /> + </for-each-group> +</function> + +</stylesheet> |