pglexer erzeugt nun pgtoken. Schön, hm?
|
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 31 32 |
#include <phorward.h> int main() { pggrammar* g; pgparser* p; pgnonterminal* start; pgtoken* tok; pgterminal* test; pgterminal* test2; g = pg_grammar_create(); test = pg_terminal_create( g, "INTEGER", "[0-9]+" ); test2 = pg_terminal_create( g, "NAME", "[A-Za-z_!]+" ); start = pg_nonterminal_create( g, "start" ); pg_production_create( start, test, test2, (pgsymbol*)NULL ); pg_grammar_print( g ); p = pg_parser_create( g, PGPARADIGM_LALR1 ); p->lexer->flags = PG_LEXMOD_NONE; pg_lexer_set_source( p->lexer, PG_LEX_SRCTYPE_STRING, "Die Welt is voller Bier 1337 so_nimm_es_dir!" ); while( ( tok = pg_lexer_fetch( p->lexer ) ) ) pg_token_print( tok ); return 0; } |
Jedenfalls funktioniert das Ergebnis gut bisher. Es ist möglich, aus verschiedenen Datenquellen (“sources”) zu lesen, z.B. aus einem Dateistrom, String, wide-character String oder über eine Funktion, z.B. getchar(). pglexer übernimmt dabei automatisch das Buffering.
Aktueller Stand (so wie hier auf SourceForge).
Naja soooo viel hat sich im Grunde nicht getan in der libphorward.
Was aber nun schon mal geht ist:
- Grammatiken über API-Funktionen definieren
- Parse-Tabellen für LR(0), LR(1) und LALR(1) mit table compression werden erzeugt
- Lexer wie oben beschrieben
- Regex-Library sehr stark verbessert: benutzt jetzt kein llist mehr, nurnoch plist :-), und alle bisher aufgetretenen Bugs sind gefixt.
Todo:
- pgparser auf einen Stand bringen der erstmal nur UTF-8 unterstützt aber läuft mit dem Ziel, einen Parser direkt über die libphorward zu definieren
- Rückgabe des Parsetrees als pgast-Struktur, später TBNF-basierte Konstruktion eines AST (abstract syntax tree).
- Funktion in pggrammar implementieren, die eine Grammatik über sich selbst parst und zurückgibt (pg_grammar_parse()).
UniCC wird auch noch auf plist umgestellt bzw. auf die neue Funktion pregex_dfa_to_matrix() umgeschrieben. Zur Zeit lässt sich der UniCC nicht mit der aktuellen libphorward 0.18 linken, auch wenn er bereits schon auf einige 0.18-spezifische Neuerunge umgebaut worden ist.