Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Parsers  (gelezen 1464 keer)

Hans Kamp

  • Gast
Parsers
« Gepost op: 2008/12/13, 22:11:50 »
Parsers zijn programma's die een tekstfile inlezen, of die een invoer via het toetsenbord inlezen. Deze tekst moet voldoen aan een door de programmeur gedefinieerde grammatica. Compilers en interpreters zijn voorbeelden van parsers. Een C-compiler controleert de brontekst volgens de grammatica van C. Klopt de grammatica van een gegeven tekst, dan wordt het vertaald naar object-code, of het wordt tegelijkertijd vertaald. Dat wordt gelinkt met libraries en vervolgens krijgt men een programma dat werkt. Klopt het niet, dan resulteert dat in een foutmelding.

Een eenvoudige rekensommetje zoals 1 + 2 * 5 / 3 heeft ook een zekere grammatica. Strikt genomen is het een soort taal die wiskundigen begrijpen.

Maar hoe is die taal gedefinieerd? Het bovenstaande is een expressie. Een expressie bestaat uit een of meerdere termen gescheiden door minnen en plussen. Een term bestaat uit een of meerdere factoren, gescheiden door maaltekens (een *) en deeltekens (een /). Je kunt er een soort schematische definitie van maken:

expressie ::= term | expressie '+' term | expressie '-' term;

term ::= factor | term '*' factor | term '/' factor;

factor ::= getal | '(' expressie ')';

getal ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;

Nu blijken er twee programma's te zijn die hiervoor gebruikt worden: yacc en lex.

Wie programmeert weleens dit soort dingen?

Offline profoX

  • Lid
    • wesley
    • Lionslink
  • Steunpunt: Nee
Re: Parsers
« Reactie #1 Gepost op: 2008/12/13, 22:17:37 »
De enige plek waar ik die zogenaamde BNF-grammatica ben tegengekomen is in mijn cursus van programmeren, om de syntax weer te geven (hoewel dat meestal met syntactische diagrammen gebaseerd op de BNF-grammatica wordt uitgebeeld ipv met BNF-grammatica) maar ben er niet verder mee bezig geweest :)
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline Dave

  • Lid
  • Steunpunt: Nee
Re: Parsers
« Reactie #2 Gepost op: 2008/12/13, 22:41:49 »
ik denk hee een packet parser voor  deze forum software maar gaat over heel wat anders dus  =D

Hans Kamp

  • Gast
Re: Parsers
« Reactie #3 Gepost op: 2008/12/13, 23:07:16 »
Ik heb direct wat in elkaar geknutseld:

example4.l
%{
#include <stdio.h>
#include "y.tab.h"
%}
%%
[0-9]+ return NUMBER;
heat return TOKHEAT;
on|off return STATE;
target return TOKTARGET;
temperature return TOKTEMPERATURE;
\n ;
[ \t]+ ;
%%

example4.y
%{
#include <stdio.h>
#include <string.h>

void yyerror(const char *str)
{
fprintf(stderr, "error: %s\n", str);
}

int yywrap()
{
return 1;
}

main()
{
yyparse();
}

%}

%token NUMBER TOKHEAT STATE TOKTARGET TOKTEMPERATURE

%%
commands: /*empty*/
| command commands
;

command:
heat_switch
|
target_set
;

heat_switch:
TOKHEAT STATE
{
printf("\tHeat turned on or off\n");
}
;

target_set:
TOKTARGET TOKTEMPERATURE NUMBER
{
printf("\tTemperature set\n");
}
;

Uit te voeren commando's:
lex example4.l
yacc -d example4.y
cc lex.yy.c y.tab.c -o example4
./example4

Hans Kamp

  • Gast
Re: Parsers
« Reactie #4 Gepost op: 2008/12/14, 13:39:04 »
ik denk hee een packet parser voor  deze forum software maar gaat over heel wat anders dus  =D

Wat voor idee had je bij een packet parser?

Offline profoX

  • Lid
    • wesley
    • Lionslink
  • Steunpunt: Nee
Re: Parsers
« Reactie #5 Gepost op: 2008/12/17, 15:16:32 »
hehe, toevallig, ik zie net in mijn cursus computer/communicatiesystemen een uitleg over lex bij het hoofdstuk over vertalers (compilers, interpreters) =D en blijkbaar moeten we in het 3e trimester zelf nog een hypothetische assembler interpreter schrijven en gebruikmaken van lex :)

edit: yacc komt er ook in voor :)
« Laatst bewerkt op: 2008/12/17, 15:55:39 door profoX »
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline AptlyNamed

  • Lid
  • Steunpunt: Nee
Re: Parsers
« Reactie #6 Gepost op: 2008/12/17, 19:28:15 »
Het wordt nog wel eens gebruikt in de vorm van het 'interpreter' design pattern.
« Laatst bewerkt op: 2008/12/17, 19:31:36 door AptlyNamed »