[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