[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [Elist Home]
Subject: error-checking algorithm for the redefinition
Here is a summarized version of the algorithm that (I hope) correctly
handle inclusions, definitions, and redefinitions.
fields of RefPattern (of JTREX)
-------------------------------
combineMethod: (none/interleave/choice)
specifies what method is used to combine patterns.
haveHead: boolean
true if this named pattern already has a "head".
a "head" is a <define> declaration without @combine.
redefinition:
(a) notBeingRedefined
(b) beingRedefinedAndNoOriginal
(c) beingRedefinedAndOriginal
algorithm
---------
When an <include> element is encountered,
processInclude() {
variable tmp;
for( each <define> under <include> ) {
processDefine();
store values of the above three fields to tmp;
}
// to correctly handle grammars like [*1],
// we need two separate loops.
for( each <define> under <include> ) {
reset values to (none,false,(b)).
}
process included pattern.
for( each redefined pattern in this <include>) {
if( the redefinition field is (b) )
redefinedButNoOriginalFoundError();
restore the values of the three fields from tmp;
}
}
// normal processing of <define>
processDefine() {
// parse the body of <define>
p = parseBody();
if( the redefinition field is (a) ) {
adopt p as the pattern for this name.
don't forget to honor @combine.
} else {
set the redefinition field to (c).
discard p.
}
update the combineMethod field and the
haveHead field according to @combine.
}
[*1]
If defining a pattern more than once in the same file is allowed,
then a measure has to be taken to process the following pattern.
<include href="...">
<define name="foo"/>
<define name="foo"/>
</include>
--
Kohsuke KAWAGUCHI +1 650 786 0721
Sun Microsystems kohsuke.kawaguchi@sun.com
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [Elist Home]
Powered by eList eXpress LLC