Dynamic PEG for interpreted languages.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

160 lignes
2.8 KiB

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node Node;
typedef struct Exploration Exploration;
enum opcode {
STRING,
AND
};
struct Exploration
{
int position;
char *text;
};
Exploration *mkExploration(char *text)
{
Exploration *exploration = calloc(1,sizeof(Exploration));
exploration->position= 0;
exploration->text= text;
return exploration;
}
char advance(Exploration *exploration)
{
return exploration->text[exploration->position++];
}
int endExploration(Exploration *exploration)
{
if (exploration->position >= strlen(exploration->text))
{
return 1;
} else
{
return 0;
}
}
void setPosition(Exploration *exploration, int position)
{
exploration->position= position;
}
struct Node
{
enum opcode type;
union {
char *stringValue;
Node *children[2];
};
};
Node *mkNode(enum opcode type)
{
Node *node= calloc(1, sizeof(Node));
node->type= type;
return node;
}
Node *mkString(char *value)
{
Node *node= mkNode(STRING);
node->stringValue= value;
return node;
}
Node *mkAnd(Node *node1, Node *node2)
{
Node *node= mkNode(AND);
node->children[0]= node1;
node->children[1]= node2;
return node;
}
int execute(Node *node, Exploration *in)
{
switch (node->type) {
case STRING: {
for (int i=0; i < strlen(node->stringValue);i++)
{
if (advance(in) != node->stringValue[i])
{
return 0;
}
}
if (endExploration(in)==1)
{
return 1;
} else
{
return -1;
}
}
case AND: {
if (execute(node->children[0], in) == 0) //si il y a eu une erreur
{
return 0;
} else //si ça s'est bien passé
{
return execute(node->children[1], in);
}
}
}
printf("this cannot happen\n");
abort();
}
int main(int argc, char **argv)
{
Exploration *in= mkExploration("aabbcc");
/*Node *program=
mkString("aabbcc");*/
Node *program=
mkAnd(mkString("aab"),
mkString("bcc"));
/*Node *program=
mkAnd(mkString("aa"),
mkAnd(mkString("bb"),
mkString("cc"));
Node *program=
mkAnd(mkStar(mkString("a")), // "a"*"b"*"c"*
mkAnd(mkStar(mkString("b")),
mkStar(mkString("c")));*/
if (execute(program, in)<=0)
{
printf("no match\n");
} else
{
printf("match\n");
}// 0 => no match, 1 => match
/*Input *in1= mkInput("hello");
Input *in2= mkInput("world");
Input *in3= mkInput("hello world");
Node *program=
mkOr(mkString("hello"), // "hello" | "world"
mkString("world"));
printf("%i\n", execute(program, in)); // 0 => no match, 1 => match*/
return 0;
}