Forum: Compiler & IDEs Einfacher php-artiger Parser ?


von Stefan (Gast)


Lesenswert?

Tach miteinander,

ich möchte mir für einen µC-Webserver (läuft bereits) einen einfachen 
Parser programmieren, der nach Tags in einer Templatedatei sucht und 
diese entsprechend interpretiert.
Hier mal einfach eine Template-Beispiel, was der Parser dann können 
sollte (Pseudocode)
1
<? //Leitet einen zu interpretierenden Code ein
2
ECHO "Kanal 1:"; //Textausgabe zum Browser
3
ECHO GETINPUT(1); //Schreibt den Wert von Input 1 zum Browser
4
5
IF (GETADC(5) > 100) SETOUTPUT(2); //Schaltet Ausgang 2 ein, wenn ADC 5 > 100
6
7
IF (GETPARAM("TEST") == "EIN") CLEAROUTPUT(1); //Schaltet Ausgang 1 aus, wenn in der URL der Parameter "TEST" = "EIN"
8
?> //Ende des zu interpretierenden Codes

Kann mir jemand "konzeptionelle Hilfestellung" geben, wie man sowas (in 
C++) realisieren kann ?

Schöne Grüße
Stefan

von Karl H. (kbuchegg)


Lesenswert?

Stefan wrote:

> Kann mir jemand "konzeptionelle Hilfestellung" geben, wie man sowas (in
> C++) realisieren kann ?

Compilerbautechniken anwenden.

Im einfachsten Fall benutzt man Werkzeuge wie Lex/Yacc
oder andere CompilerCompiler um sich den Parser erzeugen
zu lassen.

von Bri (Gast)


Lesenswert?

Speziell für C++ gibt es das hier:

http://boost.org/libs/spirit/index.html

Hab ich schon benutzt. Funktioniert super.

Aber Vorsicht, das ist nichts für Weicheier, die vor template meta 
programming zurückschrecken. ;-)

von Stevinger (Gast)


Lesenswert?

Moin!

Habe mal auf beide Sachen ("Lex/Yacc" und "Spirit") angesehen. Also mit 
Lex/Yacc kann ich leider überhaupt kein Land gewinnen, da steh' ich 
völlig im Wald und weiß nicht wo oben und unten ist. Mit Spirit habe ich 
ein wenig (mit dev-cpp unter win) experimentiert, und konnte wohl ein 
paar "rules" erstellen, die erfolg reich geparst wurden. Beim Einbinden 
von Funktionsobjekten happerts aber dann wieder, das geht ja in Richtung 
"Psychopaten-C++" ;-)

>Aber Vorsicht, das ist nichts für Weicheier, die vor template meta
>programming zurückschrecken. ;-)

Davor schrecke ich nicht zurück, weil ich nicht weiß was "template meta 
programming" ist :-[ (aber ich weiß inzwischen dass man davon Kopfweh 
bekommt)
Dann stellt sich schließlich noch die Frage wie groß meine Applikation 
mit so einem Monsterkoboldalien wird, es soll auf einem Beck-IPC SC12 
laufen. So vom Gefühl her ist der Apparat eher für die Abteilung PC 
gedacht ?

Stevinger

von Karl H. (kbuchegg)


Lesenswert?

Persönlich steh ich auf COCO
http://www.ssw.uni-linz.ac.at/Coco/

Im Gegensatz zu Lex/Yacc erzeugt COCO einen rekursiven
Abstieg (eine Parsertechnik) und ich finde die einfacher
zu debuggen als die Tabellen, die Yacc erzeugt.

Aber natürlich kann man einen rekursiven Abstieg auch
mit der Hand noch gut ausprogrammieren.

von Εrnst B. (ernst)


Lesenswert?

Noch so als Tip:

Dein µC wird warscheinlich nicht genug Speicher haben um das alles 
selbst zu machen. (Scanner, Parse-Tables, Parse-Baum im RAM halten, 
Ausführen des Parse-Baums, etc)

Ich würde (bzw werde, sobald den Mega16 in meinem Webserver duch nen 
32er ausgetauscht habe) das so machen:
Auf dem PC mit einem Mini-compiler (mit lex/flex/yacc/bison, antLR, ...) 
schreiben, der die HTML-Seite (mit den Script-Elementen) in einen 
Byte-Code umsetzt, der dann auf der µC seite in einer kleinen 
Stack-Maschine (Forth-like) ausgeführt wird.

Da gehen dann auch Funktionsdeklarationen, Rekursion, Schleifen, lokale 
Variablen etc. mit geringem Speicher/Flash verbrauch am µC.

/Ernst

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ich habe mal flex + byacc so umgebaut, dass all ihre Tabellen im
Flash-ROM eines AVR ablegen.  Ein simpler Scanner/Parser damit
erzeugt ein ,,Grundrauschen'' von so um die 20 KiB an Code (und
nicht mehr allzu viel an RAM).  Mit einem einigermaßen aufgebohrten
BASIC-Interpreter, den ich dann zum Spaß mal damit geschrieben habe,
waren es so ca. 30 KiB an ROM (da war dann schon Gleitkommaarithmetik
mit dabei).

Also wenn man eine eher komplexe Grammatik umsetzen will und einen
nicht ganz kleinen Controller dafür zur Verfügung hat, ist das schon
im machbaren Bereich.

Coco müsste man sich mal angucken.  Rekursiven Abstieg habe ich noch
irgendwo im Ohr aus Zeiten, da ich mich mal ein wenig mit den
Grundlagen des Compilerbaus befasst habe.  Nicht jede Grammatik taugt
dafür, meiner Erinnerung nach kann man damit z. B. kein C
implementieren aber Pascal.

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Lesenswert?

hier findest du etwas über einen
>php parser generator
http://greg.chiaraquartet.net/archives/137-a-parser-generator-for-PHP-finally.html

grüüüüße

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.