Autor Beitrag
chaoslion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45


Delphi 2k6 Prof,C,C#,Delphi
BeitragVerfasst: Mo 29.01.07 13:17 
Hallo Leute,

ich versuch mich gerade im schreiben eines Scanners und Parsers. Ich geh wie folgt vor:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
type tokenType_t = ( T_WORD );
type token_t = record
 name: string;
 kind: tokenType_t;
 npos: integer;
end;

procedure config_t.scan(token: token_t);
var
  len: integer;
begin
  len := length(self.script);


  while( t.npos <= len )do
  begin


    //word?
    if( isAlpha(self.script[t.npos]) )then
    begin

      while( isAlpha(self.script[t.npos]) or isNum(self.script[t.npos]) or (self.script[t.npos] = '_') )do
      begin
        t.name := t.name + self.script[t.npos];
        inc(t.npos);
      end;

      t.kind := T_WORD;
    end;


isAlpha und isNum schaut ob das aktuelle char laut asciicode ein Buchstabe oder ne Nummber ist.

Jetzt geb ich also jedem Token gleich nen Typ(hier WORD) was ich später bei Parser nehmen kann.
Meine Fragen:

1) ist es so richtig, dass ich den string per t.name := t.name + self.script[t.npos] baue oder gibt es ne andere, bessere Mglkeit?
2) wie kann ich nen parser sinnvoll aufbauen, zb wenn ich ne zuweisung machen will:
var1 = 1234;
dann würd ich jetzt in der Tokenliste auf ein = prüfen und schauen ob das wort davor nen T_WORD ist und das wort danach nen T_WORD oder T_NUMBER und dann halt noch das semicolon. Aber das artet ja in riesige if verschachtellungen aus..
wie geht das einfcacher?

mfG lion
Corpsman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228

KUbuntu 10.4
Lazarus
BeitragVerfasst: Mo 29.01.07 14:59 
Also Normalerweise macht man das doch anhand der Grammatik aus.

Also man hat nen endlichen Endlichen Automaten der dir dann die TokenListe erstellt.

Dann gehst du Her und schreibst die deinen Rekursiven Parser über der Tokenliste. Das geht aber nur wenn du ne entsprechend Wohldefinierte Gramatik hast.

In der Regel für Jedes NichtTerminal ne Eigene Procedure. Dann ist der Parser ein Witz.

_________________
--
Just Try it.