|
|
Der erste Schritt beim Parsen einer HTML Datei ist es diese zu lexen. Das Lexer teilt
die Datei in Tokens auf. Bei HTML ist es einfach, es gibt nur 2 Tokens: ein Tag und kein Tag.
Aber der Lexer von
Leo<HTML>
is ein wenig komplexer. Der Kompiler versucht die
ursprüngliche Form der Datei beizubehalten.
Das bedeuted, dass dein Code seine Formatierung beibehält, sofern dies möglich ist.
Sieh dir einige vom Kompiler generierte Dateien an und du wirst sehen, was ich meine.
Um dies zu ermöglichen speichert der Lexer zusätzliche Informationen in seiner Ausgabedatei.
Originaler Code:
<p>
<leohtml> is a HTML precompiler for <b>static</b> home page generation.
It detects special HTML tags in your page and generates HTML code out of it.
</p>
|
Gelexter Code:
dev2:index.lhtml:9:0::
dev2:index.lhtml:10:0:p:<p>
dev2:index.lhtml:11:0::
dev2:index.lhtml:11:1:leohtml:<leohtml>
dev2:index.lhtml:11:10:: is a HTML precompiler for
dev2:index.lhtml:11:37:b:<b>
dev2:index.lhtml:11:40::static
dev2:index.lhtml:11:46:/b:</b>
dev2:index.lhtml:11:50:: home page generation.
dev2:index.lhtml:12:0:: It detects special HTML tags in your page and generates HTML code out of it.
dev2:index.lhtml:13:0:/p:</p>
dev2:index.lhtml:14:0::
|
Das erste Feld ist das Verzeichnis in dem die Datei gefunden wurde. Dieses Feld kann leer sein.
Das zweite Feld ist der Name der Datei die ursprünglich eingebunden wurde.
Das dritte Feld ist die Nummer der Zeile in der das Tag gefunden wurde.
Das vierte Feld ist die Nummer der Spalte in der das Tag gefunden wurde.
Das fünfte Feld ist der Name des Tags, wenn die aktuelle gelexte Zeile ein Tag beinhaltet.
ansonsten ist dieses Feld leer.
Und das letzte Feld ist das Tag, oder ein andere Zeichenkette, die gefunden wurde. Ist dieses
Feld leer, dann handelt es sich meißt um einen Zeilenumbruch.
Nun kannst du wiederum einen extra Parser schreiben, der jede dieser Zeilen parst,
oder du verwendest die Line Klasse, die dies für dich erledigt. Und eine
Line wird von der Tag Klasse akzeptiert. All diese nützlichen
Klassen wurde entworfen um zusammen zu arbeiten. Dein Leben wird leichter sein,
wenn die sie verwendest.
| |
|
Definition:
- Klasse: Lexer
-
- Konstruktor:
-
Lexer( File in, File out, current_dir =
// );
- Funktionen:
-
Bool is_valid();
String get_error();
Null lex();
|
Der Lexer erhält eine Eingabe-Datei und schreibt den Code in die Ausgabe-Datei.
Wenn du das momentane Verzeichnis weißt, dann kannst du dieses optional auch angeben.
Nach dem du die Lexer Klasse konstruiert hast überprüfe
mit der is_valid() Funktion, ob sie gültig ist. Ist sie nicht gültig,
dann erhälst du eine Fehlernachricht über die get_error() Funktion.
Der dritte Schritt ist es den Lexer zu starten. Dies geschieht mit der lex()
Funktion. Überprüfe auch dannach mit der is_valid() Funktion, ob kein Fehler
aufgetreten ist.
| |
|
Selbst wenn dies eine Referenz ist und ich ursprünglich keine
großen Beispiele hier hinzufügen wollte, denke ich doch das dies
hier an dieser Stelle besser ist wenn hier gezeigt wird wie die
verscheidenen Klassen zusammenarbeiten.
Diese Beispiel ist ein Tag Filter. Es löscht alle Tags aus einer
HTML Datei und gibt nur den Text aus.
Beispiel:
function html2text( infile_name ) {
// try open file
var infile = new File( infile_name, "r", true, true );
if( !infile.is_valid() ) {
message( "ERROR: cannot open file", infile.get_name() );
return;
}
// lex the file
// create a tmp file
var tmp = new File( get_tmp_file(), "rwt", false, false );
var lexer = new Lexer( infile, tmp );
if( ! lexer.is_valid() ) {
message( "ERROR: cannot lex file:", lexer.get_error() );
return;
}
lexer.lex();
if( ! lexer.is_valid() ) {
message( "ERROR: cannot lex file:", lexer.get_error() );
return;
}
tmp.clear();
tmp.seekg(0); // spool back to begin
while( ! tmp.eof() ) {
var line = new Line( tmp.getline() );
// ignore invalid lines
if( ! line.is_valid() )
continue;
if( line.tag_type != "" ) {
// here you can now inspekt the tag
// it is not necessary but a good
// example
var tag = new Tag( line );
if( tag.is_valid() ) {
var m = "Tag: " + tag.get_tag_type(); // the message string
for( var i = 0 ; i < tag.get_number_of_options() ; i++ ) {
m = m + " | Option: " + tag.get_option_name( i )
+ " Value: " + tag.get_option_value( i );
}
message( m );
}
} else {
// Line is not a tag, print the stuff out
print( line.tag );
}
}
}
|
| |
|
Diese Seite wurde von
King Leo
kreiert. Seitengenerator
Leo<HTML>
Version
0.99.0
.
|