Leo<HTML>

Lexer Klasse

JS - Referenz
JS Syntax
Ausgabe
Leohtml Klasse
File Klasse
Get_tmp_file Funktion
Line Klasse
Tag Klasse
Lexer Klasse
    Konzept
    Interface
    Beispiel
Rebuilt_file Funktion
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 .