CONTENT
|
Pending themes |
 |
C++ / ISO 14882 parser |
State |
Description |
in progress |
BNF-parsing script of the C++ grammar to be able to extract the AST and to
provide smart and powerful C++ source file transformation.
|
UML / Rational ROSE 98 |
State |
Description |
pending |
BNF-parsing script of a "*.mdl" file generated by Rational ROSE for
extracting class diagrams to start.
|
Modeling language |
State |
Description |
pending |
BNF-parsing script of a tailorable modeling language and some
template-based scripts to offer useful transversal features for the
software infrastructure.
|
|
XML |
This section proposes some scripts to work on XML, which isn't the native manner
to represent the knowledge in CodeWorker but that cannot be ignored as a very
convenient and widely admitted format for expressing specifications.
|
|
XML parser |
A script for scanning a XML file in general (with no DTD) and for populating a parse
tree of CodeWorker that conforms to the logic structure of the XML hierarchy.
|
|
Script |
Description |
|
XMLparser.cwp |
the production rule XML_DOCUMENT scans and parses XML files in general.
The parse tree conforms to the following logic structure that matches to the XML one
exactly:
- name-of-XML-element[]: all elements that share the same parent node
and the same name name-of-XML-element are put into an array of nodes
whose name is the name of the XML element.
If the element is alone, the structure doesn't change and the array contains the
element only.
- name-of-XML-attribute: the value of the attribute is assigned to a
folder of the parse tree, which stands as a child of the owner element and whose
name is the name of the attribute.
Please note that an XML identifier admits '.' and '-' characters, which
are rejected by CodeWorker in an identifier. So, these characters are degenerated in
underscores.
|
|
Example |
Description |
|
XMLparser-example1.cws |
Parses the XML file "cdcatalog.xml" and then generates a HTML presentation of
data in "XMLparser-cdcatalog.html" following the template "cdcatalog.cwt".
Input files:
examples/cdcatalog.xml, examples/cdcatalog.cwt.
output files:
examples/cdcatalog.html.
|
|
|
DTD parser |
A script for building the AST (Abstract Syntactic Tree) of a DTD file. This AST
might be used for translating from a DTD to a template-based script or
for any other application.
|
|
Script |
Description |
|
DTDparser.cwp |
Parses a DTD (Document Type Description) file.
The parse tree conforms to the following logic structure:
- comment (optional) holds the last comment block found into the DTD
before the first DTD element, if any. This comment is interpreted as an explanation on
what the DTD is for.
- listOfElements[] contains the list of all "<!ELEMENT" nodes encountered:
- comment (optional) holds the comment block that stands just before the element
description in the DTD, if any.
- category (optional) is worth "EMPTY" or "ANY".
- composite (present if and only if category doesn't exist)
- multiplicity (optional) is worth '?' or '*'
or '+'
- nodes put into the array (composite[]):
- operator (present on each node, except the last one) is worth
',' or '|'
- constant (one and only one field amongst constant and element and composite) is worth "#PCDATA"
- element name of an element
- multiplicity (optional) is worth '?' or '*' or '+'
- composite recursive structure
- listOfAttributes[] contains the list of all attributes belonging
to the element (one and only one amongst type, listOfEnums
and constant):
- type is worth "CDATA" or "ID" or "IDREF"
or "IDREFS" or "NMTOKEN" or "NMTOKENS" or "ENTITY"
or "ENTITIES" or "NOTATION"
- listOfEnums list of enumerated values
- constant a constant value
- value (optional, constant must be populated) is worth
"#IMPLIED" or "#REQUIRED" or "DEFAULT" or
"FIXED"
- listOfEntities[] contains the list of all "<!ENTITY" nodes encountered.
- comment (optional) holds the comment block that stands just before
the entity description in the DTD, if any.
- external (optional) is worth "SYSTEM"
- constant is the value of the entity after resolution of references
to other entities.
Note that the grammar doesn't handle entities correctly yet. If you need it or if you
encounter some bugs, please send an email to codeworker@free.fr and your request will be
taken into account as fast as possible.
|
|
Example |
Description |
|
DTDtoBNF-example1.cws |
Parses the DTD of the ejb_jar descriptor as provided by Sun Microsystems, Inc and generates a
BNF-parsing script for parsing and validating any kind of XML ejb_jar files.
Input files:
examples/ejb-jar_2_0.dtd.
output files:
examples/ejb-jar_2_0-parser.cwp.
|
|
|
XSL parser |
A script for building the AST (Abstract Syntactic Tree) of a XSL file. This AST
might be used for translating from XSL to TL (Template Language of
Craig Cleaveland) or to a template-based script or for any other application.
|
|
Script |
Description |
|
XSLparser.cwp |
Parses an XSL file, building a parse tree that conforms to the following logic structure:
It recognizes some XSL elements (not all yet), such as:
- xsl:template
- xsl:foreach
- xsl:value-of
- xsl:sort
- xsl:when
- xsl:choose
- xsl:otherwise
XPath is parsed completely according to the specifications for XSLT 1.0.
If you encounter bugs or limitations, please send a mail to codeworker@free.fr.
|
|
Program transformation |
A program transformation changes the source code, to do optimizations, code intrusion or rewriting. |
|
C++ profiling |
Here is a coding pattern that enables to include source code for profiling in the
C++ function bodies. This transformation doesn't require to construct the AST
of the C++ source code.
|
|
Script |
Description |
|
RawProfilingLeader.cws |
Leader script that drives the intrusion of profiling code in C++ source files. This
is called a raw profiling, because it doesn't pretend to offer a smart and
efficient profiling mechanism. It is more like an illustration of what is possible as
a program transformation.
Two properties must be passed on the command line:
- SOURCES gives the file masks of C++ bodies to select for the
transformation. If more than one mask, one cancatenates them, separated by a
semi-comma.
- RAW_PROFILING_DIR provides the directory where to generate the
profiling module. The profiling module manages the time spent
in each profiled function and how many times they have been called.
The profiling module is implemented in files "RawProfiling.h" and
"RawProfiling.cpp".
|
|
RawProfilingCppTransformation.cwp |
Script that operates the transformation of a C++ source file to insert profiling code
in the body of functions.
Here, no parsing is processed for recognizing the signature of functions and the body.
So, some troubles might appear if a #define macro describes a part or the whole
of the function.
One activates the profiling by setting the preprocessor definition RAW_PROFILING
at compile-time (-D RAW_PROFILING on the command line of the C++ compiler).
To make it simple, the header of the profiling module is inserted after the first
#include encountered. It may cause some troubles if the first include is put in
a conditional preprocessing block (#ifdef WIN32 ... #endif/#else).
The body of the function starts by incrementing its assigned counter held by the
profiling module and by timing the visit of the controlled sequence.
Note that the transformation can be applied more than once: the second pass will not
affect the source file.
|
|
RawProfilingCpp.cwt |
This script generates the mplementation of the profiling module.
Each function scanned for the profiling has both a counter and a chronograph assigned.
The chronograph holds the total time spent in the function.
The display of result is the simplest that may exist: functions are listed with the number
of calls and the total time (RawProfiling::displayResults()).
The file to generate is "RawProfiling.cpp" and will be put in RAW_PROFILING_DIR.
|
|
RawProfilingHpp.cwt |
|
|
File |
Description |
|
RawProfiling.h |
Header of the profiling module.
It must be expanded by the template-based script called "RawProfilingHpp.cwt".
|
|
Example |
Description |
|
RawProfiling-example1.cws |
To illustrate the profiling intrusion of code, one distinguish the C++ sources
before and after the transformation.
C++ source files before transformation are postfixed by "_before.*".
C++ source files after transformation are postfixed by "_after.*".
In the real life, this distinction has no sense and one modifies the C++ source
files directly. But in all cases, the file "repository/RawProfiling.h"
must be copied in the directory used for the profiling module.
The file "examples/RawProfiling_main.cpp" computes the Towers of Hanoi.
Then, it writes the results of the profiling in a HTML file.
Input files:
examples/RawProfiling_before.cpp.
quoted files:
examples/RawProfiling_example1.h, examples/RawProfiling_main.cpp.
output files:
examples/RawProfiling_after.cpp, examples/RawProfiling.html.
|
|
source-to-source translation |
A source-to-source translation consists on translating a text from a format to
another. It may require a first pass to extract the parse tree of the text or may
construct the target on the fly.
|
|
CodeWorker script to HTML |
Translates any CodeWorker script to HTML, highlighting the code according to
the syntax and linking keywords to the online-documentation.
|
|
Script |
Description |
|
CWscript2HTML.cwp |
It takes in charge of translating any CodeWorker script to HTML.
The source file is highlighted and keywords plus particular symbols of the
language are linked to the online-documentation.
Note that this.docURL designates the URL or the directory where both the CSS
and the HTML documentation of CodeWorker are stored. If not populated, it will resolve
links from the directory where is the target HTML file. Don't forget to end the URL or
directory with a trailing slash.
If this.includeCSS is set to a path, the styles are included into the HTML file from the path,
rather that being linked to a file while browsing.
To highlight any script, type:
CodeWorker -translate CWscript2HTML.cwp <CW-script.cw> <CW-script.html>
to consider that the documentation and the CSS are in the same directory, and:
CodeWorker -translate CWscript2HTML.cwp <CW-script.cw> <CW-script.html> -insert docURL HTML-doc-URL
otherwise.
|
|
CodeWorker_grammar.cwp |
Here is the complete grammar of the CodeWorker's scripting language.
It is expressed in the extended-BNF dialect of CodeWorker, so has the
advantage of running under CodeWorker for scanning scripts, and has the
original feature to be auto-descriptive.
|
|
|
|
CGI scripts |
CodeWorker is able to run as a CGI program since version 2.10. One presents
some little use-cases for illustrating the advantage of using CodeWorker on the
Web server-side.
The scripts encountered below must be copied on the Web server-side, after
registration of CodeWorker as attached to the ".cwt" file extension.
|
|
Basic information |
A script for displaying all CGI environment variables and for showing the client
request.
|
|
Script |
Description |
|
basicInformation.cwt |
This script checks whether CodeWorker is running as a CGI program or as an
interpreter.
If running in CGI mode, all CGI environment variables are displayed, followed
by the attributes/values of the client request, filled into a form and sent via
a POST or GET method.
Note that the global array _REQUEST contains the list of all
attributes of the request, with their values.
Example: if the client writes http://myServer/basicInformation.cwt?country=Finland,
then:
- _REQUEST["country"] is worth "Finland"
- a global variable country is declared and is worth "Finland".
output files:
examples/basicInformation.html.
|
|
|
Simple hit counter |
A script for counting the number of hits by remote host and by date.
|
|
Script |
Description |
|
hitCounter.cwt |
It updates the number of hits done on project page. The history saves all remote hosts
that have already loaded the page, and keeps the number of hits by date for each
remote host.
To make it persistent, these data are saved in a file "hitCounter.txt", which is
parsed via the script "hitCounterParser.cwp". The file is updated by generating
it via the template-based script "hitCounterUpdate.cwt".
output files:
examples/hitCounter.txt, examples/hitCounter.html.
|
|
hitCounterParser.cwp |
Parses the description of all hits done.
Format:
hitCounter ::= [remote_host]*
remote_host ::= "host" hostNameAsString '{' [date_split]* '}'
date_split ::= DATE numberOfHits
The parse tree:
- hits: total number of hits
- hosts[]: list of all remote hosts
- hits: total number of hits for this remote host
- dates[]: hits by date for this remote host
- hits: total number of hits for this remote host at this date
- dates[]: list of all dates
- hits: total number of hits for this date
|
|
hitCounterUpdate.cwt |
Saves the parse tree conforming to the syntax presented in the BNF-parsing script
"hitCounterParser.cwp".
|
|
|
Remote graph generation |
The server generates the png class diagram of an object modelling.
|
|
Script |
Description |
|
classDiagram.cwt |
It parses an object design (the syntax conforms to CWML, an object modelling language
that CodeWorker proposes by default) and generates a class diagram as a png picture.
GraphViz is an open source graph drawing software, called here for building the class
diagram. It requires the description of the graph, generated in classDiagram.txt
by the script classDiagramGraphviz.cwt.
This example cannot work without GraphViz installed on the Web server.
Note that one saves the object design in a virtual file (function createVirtualTemporaryFile()).
It avoids saving the design of the client in a temporary physical file before parsing it.
quoted files:
examples/classDiagram.txt.
output files:
examples/classDiagramResult.html.
|
|
classDiagramGraphViz.cwt |
It generates an input file for asking GraphViz to draw the class diagram of an object
design. The parse tree of the object design must conform to the logic structure of
CWML, the default modelling language proposed by CodeWorker as illustration.
Please refer to the documentation of GraphViz to understand more about the syntax
of the graph description.
|
|
CWML.cwp |
This script parses an object modelling file that conform to CWML, a modelling
language proposed by CodeWorker as an illustration.
package_declaration ::= "package" package_path '{' package_body '}'
package_body ::= package_declaration | class_declaration | service_declaration
|
|
|