Schrift
[thread]8831[/thread]

Lexer/Parser ohne Terminals?



<< >> 1 Eintrag, 1 Seite
Gast Gast
 2007-03-12 16:56
#74949 #74949
Moin,

ich brauche für ein neues CPAN Modul eine spezielle Art Parsergenerator. Normalerweise definiert man dafür ja eine Handvoll Tokens (=Terminals), aus denen ein Lexer einen Stream aus Tokenes erzeugt, die ein Parser als Input bekommt.

In meinem Fall ist es nun aber so, dass einige meiner "Tokens" nicht durch Regex beschreibbare Ausdrücke, sondern Subroutinen sind. Beispiel für Tokendefinition mit LLg (die aber natürlich syntaktisch falsch ist), die ich bräuchte:

Code: (dl )
1
2
3
4
5
@tokens = (
'ipv4' => &is_ipv4(),
'SEP' => '[\s\t]+',
'host' => '&is_resolvablehost()',
);


Das soll dann also eine IP gefolgt von einem auflösbaren Hostname getrennt durch Whitespace matchen. Wie gesagt: man kann das sicher mit Regex erfassen, ich MUSS es aber mit Subs machen.

Ein solcher Lexer müsste im Prinzip für jeden einzelnen Character die aktuelle Subroutine aufrufen, bis sie TRUE returned (oder halt net). Die Subroutine muss dann solange aufgerufen werden, bis ein "Separator-Terminal" auftritt, in meinem Fall oben ein Whitespace. Wenn sie dann nicht gematcht hat, muss der Lexer ein FAIL zurückgeben, wenn es matcht, muss er den Input bis dahin "aufessen" und dann entsprechend weitermachen.

Ich weiss, das klingt etwas skuril, jedenfalls habe ich leider bislang kein Perlmodul gefunden, dass sowas könnte, daher mein Posting hier und das selber zu programmieren möchte ich möglichst vermeiden, weil das bestimmt ein Knochenjob wäre - hat Jemand ne Idee?

Danke im Voraus.
<< >> 1 Eintrag, 1 Seite



View all threads created 2007-03-12 16:56.