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.

1035 lignes
27 KiB

/* A recursive-descent parser generated by peg 0.1.18 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define YYRULECOUNT 11
#line 1 "parse.leg"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "inputBuffer.c"
;
enum op { String, Query, Star, Plus, Or, And, Class, Dot, Exc } ;
typedef union Node Node;
struct String { enum op type; char *string; int len; };
struct Query { enum op type; Node *children[1]; };
struct Star { enum op type; Node *children[1]; };
struct Plus { enum op type; Node *children[1]; };
struct Or { enum op type; Node *children[2]; };
struct And { enum op type; Node *children[2]; };
struct Class { enum op type; char *stringValue; int len; };
struct Dot { enum op type;};
struct Exc { enum op type; Node *children[1]; };
union Node {
enum op type;
struct String String;
struct Query Query;
struct Star Star;
struct Plus Plus;
struct Or Or;
struct And And;
struct Class Class;
struct Dot Dot;
struct Exc Exc;
};
#define new(type) mkNode(sizeof(struct type),type)
Node *mkNode(size_t size,enum op type)
{
Node *node= calloc(1, size);
node->type= type;
return node;
}
Node *mkString(char *s)
{
Node *node= new(String);
node->String.string= strdup(s);
node->String.len=strlen(s);
return node;
}
Node *mkQuery(Node *n)
{
Node *node= new(Query);
node->Query.children[0]= n;
return node;
}
Node *mkOr(Node *node1, Node *node2)
{
Node *node= new(Or);
node->Or.children[0]= node1;
node->Or.children[1]= node2;
return node;
}
Node *mkAnd(Node *node1, Node *node2)
{
Node *node= new(And);
node->And.children[0]= node1;
node->And.children[1]= node2;
return node;
}
Node *mkStar(Node *n)
{
Node *node= new(Star);
node->Star.children[0]= n;
return node;
}
Node *mkClass(char* str)
{
Node *node= new(Class);
node->Class.stringValue= str;
node->Class.len=strlen(str);
return node;
}
Node *mkPlus(Node *n)
{
Node *node= new(Plus);
node->Plus.children[0]= n;
return node;
}
Node *mkDot()
{
Node *node= new(Dot);
return node;
}
Node *mkExc(Node *n)
{
Node *node= new(Exc);
node->Exc.children[0]= n;
return node;
}
void print(Node *node)
{
switch (node->type) {
case String:
printf("\"%s\"", node->String.string);
return;
case Query:
print(node->Query.children[0]);
printf("?");
return;
case Star:
print(node->Query.children[0]);
printf("*");
return;
case Plus:
print(node->Query.children[0]);
return;
case Or:
print(node->Or.children[0]);
printf("Or");
print(node->Or.children[1]);
return;
case And:
print(node->And.children[0]);
printf("And");
print(node->And.children[1]);
return;
case Class:
printf("Class");
printf("\"%s\"", node->Class.stringValue);
return;
case Dot:
printf("Dot");
return;
case Exc:
printf("!");
print(node->Exc.children[0]);
return;
}
abort();
}
void println(Node *node)
{
print(node);
printf("\n");
}
InputBuffer *inputBuffer=0;
#define YY_INPUT(buff,result,maxSize) \
{if (atEnd(inputBuffer)){ \
result=0; \
} \
else { \
*buff=currentChar(inputBuffer); \
advance(inputBuffer,1); \
result=1; \
}}
#define YYSTYPE Node *
YYSTYPE yylval = 0;
#ifndef YY_MALLOC
#define YY_MALLOC(C, N) malloc(N)
#endif
#ifndef YY_REALLOC
#define YY_REALLOC(C, P, N) realloc(P, N)
#endif
#ifndef YY_FREE
#define YY_FREE(C, P) free(P)
#endif
#ifndef YY_LOCAL
#define YY_LOCAL(T) static T
#endif
#ifndef YY_ACTION
#define YY_ACTION(T) static T
#endif
#ifndef YY_RULE
#define YY_RULE(T) static T
#endif
#ifndef YY_PARSE
#define YY_PARSE(T) T
#endif
#ifndef YYPARSE
#define YYPARSE yyparse
#endif
#ifndef YYPARSEFROM
#define YYPARSEFROM yyparsefrom
#endif
#ifndef YYRELEASE
#define YYRELEASE yyrelease
#endif
#ifndef YY_BEGIN
#define YY_BEGIN ( yy->__begin= yy->__pos, 1)
#endif
#ifndef YY_END
#define YY_END ( yy->__end= yy->__pos, 1)
#endif
#ifdef YY_DEBUG
# define yyprintf(args) fprintf args
#else
# define yyprintf(args)
#endif
#ifndef YYSTYPE
#define YYSTYPE int
#endif
#ifndef YY_STACK_SIZE
#define YY_STACK_SIZE 128
#endif
#ifndef YY_BUFFER_SIZE
#define YY_BUFFER_SIZE 1024
#endif
#ifndef YY_PART
typedef struct _yycontext yycontext;
typedef void (*yyaction)(yycontext *yy, char *yytext, int yyleng);
typedef struct _yythunk { int begin, end; yyaction action; struct _yythunk *next; } yythunk;
struct _yycontext {
char *__buf;
int __buflen;
int __pos;
int __limit;
char *__text;
int __textlen;
int __begin;
int __end;
int __textmax;
yythunk *__thunks;
int __thunkslen;
int __thunkpos;
YYSTYPE __;
YYSTYPE *__val;
YYSTYPE *__vals;
int __valslen;
#ifdef YY_CTX_MEMBERS
YY_CTX_MEMBERS
#endif
};
#ifdef YY_CTX_LOCAL
#define YY_CTX_PARAM_ yycontext *yyctx,
#define YY_CTX_PARAM yycontext *yyctx
#define YY_CTX_ARG_ yyctx,
#define YY_CTX_ARG yyctx
#ifndef YY_INPUT
#define YY_INPUT(yy, buf, result, max_size) \
{ \
int yyc= getchar(); \
result= (EOF == yyc) ? 0 : (*(buf)= yyc, 1); \
yyprintf((stderr, "<%c>", yyc)); \
}
#endif
#else
#define YY_CTX_PARAM_
#define YY_CTX_PARAM
#define YY_CTX_ARG_
#define YY_CTX_ARG
yycontext _yyctx= { 0, 0 };
yycontext *yyctx= &_yyctx;
#ifndef YY_INPUT
#define YY_INPUT(buf, result, max_size) \
{ \
int yyc= getchar(); \
result= (EOF == yyc) ? 0 : (*(buf)= yyc, 1); \
yyprintf((stderr, "<%c>", yyc)); \
}
#endif
#endif
YY_LOCAL(int) yyrefill(yycontext *yy)
{
int yyn;
while (yy->__buflen - yy->__pos < 512)
{
yy->__buflen *= 2;
yy->__buf= (char *)YY_REALLOC(yy, yy->__buf, yy->__buflen);
}
#ifdef YY_CTX_LOCAL
YY_INPUT(yy, (yy->__buf + yy->__pos), yyn, (yy->__buflen - yy->__pos));
#else
YY_INPUT((yy->__buf + yy->__pos), yyn, (yy->__buflen - yy->__pos));
#endif
if (!yyn) return 0;
yy->__limit += yyn;
return 1;
}
YY_LOCAL(int) yymatchDot(yycontext *yy)
{
if (yy->__pos >= yy->__limit && !yyrefill(yy)) return 0;
++yy->__pos;
return 1;
}
YY_LOCAL(int) yymatchChar(yycontext *yy, int c)
{
if (yy->__pos >= yy->__limit && !yyrefill(yy)) return 0;
if ((unsigned char)yy->__buf[yy->__pos] == c)
{
++yy->__pos;
yyprintf((stderr, " ok yymatchChar(yy, %c) @ %s\n", c, yy->__buf+yy->__pos));
return 1;
}
yyprintf((stderr, " fail yymatchChar(yy, %c) @ %s\n", c, yy->__buf+yy->__pos));
return 0;
}
YY_LOCAL(int) yymatchString(yycontext *yy, const char *s)
{
int yysav= yy->__pos;
while (*s)
{
if (yy->__pos >= yy->__limit && !yyrefill(yy)) return 0;
if (yy->__buf[yy->__pos] != *s)
{
yy->__pos= yysav;
return 0;
}
++s;
++yy->__pos;
}
return 1;
}
YY_LOCAL(int) yymatchClass(yycontext *yy, unsigned char *bits)
{
int c;
if (yy->__pos >= yy->__limit && !yyrefill(yy)) return 0;
c= (unsigned char)yy->__buf[yy->__pos];
if (bits[c >> 3] & (1 << (c & 7)))
{
++yy->__pos;
yyprintf((stderr, " ok yymatchClass @ %s\n", yy->__buf+yy->__pos));
return 1;
}
yyprintf((stderr, " fail yymatchClass @ %s\n", yy->__buf+yy->__pos));
return 0;
}
YY_LOCAL(void) yyDo(yycontext *yy, yyaction action, int begin, int end)
{
while (yy->__thunkpos >= yy->__thunkslen)
{
yy->__thunkslen *= 2;
yy->__thunks= (yythunk *)YY_REALLOC(yy, yy->__thunks, sizeof(yythunk) * yy->__thunkslen);
}
yy->__thunks[yy->__thunkpos].begin= begin;
yy->__thunks[yy->__thunkpos].end= end;
yy->__thunks[yy->__thunkpos].action= action;
++yy->__thunkpos;
}
YY_LOCAL(int) yyText(yycontext *yy, int begin, int end)
{
int yyleng= end - begin;
if (yyleng <= 0)
yyleng= 0;
else
{
while (yy->__textlen < (yyleng + 1))
{
yy->__textlen *= 2;
yy->__text= (char *)YY_REALLOC(yy, yy->__text, yy->__textlen);
}
memcpy(yy->__text, yy->__buf + begin, yyleng);
}
yy->__text[yyleng]= '\0';
return yyleng;
}
YY_LOCAL(void) yyDone(yycontext *yy)
{
int pos;
for (pos= 0; pos < yy->__thunkpos; ++pos)
{
yythunk *thunk= &yy->__thunks[pos];
int yyleng= thunk->end ? yyText(yy, thunk->begin, thunk->end) : thunk->begin;
yyprintf((stderr, "DO [%d] %p %s\n", pos, thunk->action, yy->__text));
thunk->action(yy, yy->__text, yyleng);
}
yy->__thunkpos= 0;
}
YY_LOCAL(void) yyCommit(yycontext *yy)
{
if ((yy->__limit -= yy->__pos))
{
memmove(yy->__buf, yy->__buf + yy->__pos, yy->__limit);
}
yy->__begin -= yy->__pos;
yy->__end -= yy->__pos;
yy->__pos= yy->__thunkpos= 0;
}
YY_LOCAL(int) yyAccept(yycontext *yy, int tp0)
{
if (tp0)
{
fprintf(stderr, "accept denied at %d\n", tp0);
return 0;
}
else
{
yyDone(yy);
yyCommit(yy);
}
return 1;
}
YY_LOCAL(void) yyPush(yycontext *yy, char *text, int count)
{
yy->__val += count;
while (yy->__valslen <= yy->__val - yy->__vals)
{
long offset= yy->__val - yy->__vals;
yy->__valslen *= 2;
yy->__vals= (YYSTYPE *)YY_REALLOC(yy, yy->__vals, sizeof(YYSTYPE) * yy->__valslen);
yy->__val= yy->__vals + offset;
}
}
YY_LOCAL(void) yyPop(yycontext *yy, char *text, int count) { yy->__val -= count; }
YY_LOCAL(void) yySet(yycontext *yy, char *text, int count) { yy->__val[count]= yy->__; }
#endif /* YY_PART */
#define YYACCEPT yyAccept(yy, yythunkpos0)
YY_RULE(int) yy_space(yycontext *yy); /* 11 */
YY_RULE(int) yy_dot(yycontext *yy); /* 10 */
YY_RULE(int) yy_class(yycontext *yy); /* 9 */
YY_RULE(int) yy_string(yycontext *yy); /* 8 */
YY_RULE(int) yy_atom(yycontext *yy); /* 7 */
YY_RULE(int) yy_postfix(yycontext *yy); /* 6 */
YY_RULE(int) yy_prefix(yycontext *yy); /* 5 */
YY_RULE(int) yy_and(yycontext *yy); /* 4 */
YY_RULE(int) yy_or(yycontext *yy); /* 3 */
YY_RULE(int) yy__(yycontext *yy); /* 2 */
YY_RULE(int) yy_start(yycontext *yy); /* 1 */
YY_ACTION(void) yy_1_dot(yycontext *yy, char *yytext, int yyleng)
{
#define __ yy->__
#define yypos yy->__pos
#define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_dot\n"));
{
#line 198
__=mkDot();
}
#undef yythunkpos
#undef yypos
#undef yy
}
YY_ACTION(void) yy_1_class(yycontext *yy, char *yytext, int yyleng)
{
#define __ yy->__
#define yypos yy->__pos
#define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_class\n"));
{
#line 196
__=mkClass(yytext) ;
}
#undef yythunkpos
#undef yypos
#undef yy
}
YY_ACTION(void) yy_1_string(yycontext *yy, char *yytext, int yyleng)
{
#define __ yy->__
#define yypos yy->__pos
#define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_string\n"));
{
#line 194
__ = mkString(yytext) ;
}
#undef yythunkpos
#undef yypos
#undef yy
}
YY_ACTION(void) yy_4_postfix(yycontext *yy, char *yytext, int yyleng)
{
#define s yy->__val[-1]
#define __ yy->__
#define yypos yy->__pos
#define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_4_postfix\n"));
{
#line 190
__ = s;
}
#undef yythunkpos
#undef yypos
#undef yy
#undef s
}
YY_ACTION(void) yy_3_postfix(yycontext *yy, char *yytext, int yyleng)
{
#define s yy->__val[-1]
#define __ yy->__
#define yypos yy->__pos
#define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_3_postfix\n"));
{
#line 189
s = mkPlus(s) ;
}
#undef yythunkpos
#undef yypos
#undef yy
#undef s
}
YY_ACTION(void) yy_2_postfix(yycontext *yy, char *yytext, int yyleng)
{
#define s yy->__val[-1]
#define __ yy->__
#define yypos yy->__pos
#define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_2_postfix\n"));
{
#line 188
s = mkStar(s) ;
}
#undef yythunkpos
#undef yypos
#undef yy
#undef s
}
YY_ACTION(void) yy_1_postfix(yycontext *yy, char *yytext, int yyleng)
{
#define s yy->__val[-1]
#define __ yy->__
#define yypos yy->__pos
#define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_postfix\n"));
{
#line 187
s = mkQuery(s) ;
}
#undef yythunkpos
#undef yypos
#undef yy
#undef s
}
YY_ACTION(void) yy_2_prefix(yycontext *yy, char *yytext, int yyleng)
{
#define p yy->__val[-1]
#define __ yy->__
#define yypos yy->__pos
#define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_2_prefix\n"));
{
#line 185
__ = p;
}
#undef yythunkpos
#undef yypos
#undef yy
#undef p
}
YY_ACTION(void) yy_1_prefix(yycontext *yy, char *yytext, int yyleng)
{
#define p yy->__val[-1]
#define __ yy->__
#define yypos yy->__pos
#define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_prefix\n"));
{
#line 184
__ = mkExc(p);
}
#undef yythunkpos
#undef yypos
#undef yy
#undef p
}
YY_ACTION(void) yy_2_and(yycontext *yy, char *yytext, int yyleng)
{
#define a yy->__val[-1]
#define p yy->__val[-2]
#define __ yy->__
#define yypos yy->__pos
#define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_2_and\n"));
{
#line 182
__ = p ;
}
#undef yythunkpos
#undef yypos
#undef yy
#undef a
#undef p
}
YY_ACTION(void) yy_1_and(yycontext *yy, char *yytext, int yyleng)
{
#define a yy->__val[-1]
#define p yy->__val[-2]
#define __ yy->__
#define yypos yy->__pos
#define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_and\n"));
{
#line 181
__ = mkAnd(p, a); ;
}
#undef yythunkpos
#undef yypos
#undef yy
#undef a
#undef p
}
YY_ACTION(void) yy_2_or(yycontext *yy, char *yytext, int yyleng)
{
#define o yy->__val[-1]
#define a yy->__val[-2]
#define __ yy->__
#define yypos yy->__pos
#define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_2_or\n"));
{
#line 179
__ = a ;
}
#undef yythunkpos
#undef yypos
#undef yy
#undef o
#undef a
}
YY_ACTION(void) yy_1_or(yycontext *yy, char *yytext, int yyleng)
{
#define o yy->__val[-1]
#define a yy->__val[-2]
#define __ yy->__
#define yypos yy->__pos
#define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_or\n"));
{
#line 178
__ = mkOr(o, a) ;
}
#undef yythunkpos
#undef yypos
#undef yy
#undef o
#undef a
}
YY_ACTION(void) yy_1_start(yycontext *yy, char *yytext, int yyleng)
{
#define o yy->__val[-1]
#define __ yy->__
#define yypos yy->__pos
#define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_start\n"));
{
#line 176
yylval = o ;
}
#undef yythunkpos
#undef yypos
#undef yy
#undef o
}
YY_RULE(int) yy_space(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "space"));
{ int yypos2= yy->__pos, yythunkpos2= yy->__thunkpos; if (!yymatchClass(yy, (unsigned char *)"\000\002\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l3; goto l2;
l3:; yy->__pos= yypos2; yy->__thunkpos= yythunkpos2; if (!yymatchChar(yy, '\n')) goto l4;
l5:;
{ int yypos6= yy->__pos, yythunkpos6= yy->__thunkpos; if (!yymatchChar(yy, '\r')) goto l6; goto l5;
l6:; yy->__pos= yypos6; yy->__thunkpos= yythunkpos6;
} goto l2;
l4:; yy->__pos= yypos2; yy->__thunkpos= yythunkpos2; if (!yymatchChar(yy, '\r')) goto l1;
l7:;
{ int yypos8= yy->__pos, yythunkpos8= yy->__thunkpos; if (!yymatchChar(yy, '\n')) goto l8; goto l7;
l8:; yy->__pos= yypos8; yy->__thunkpos= yythunkpos8;
}
}
l2:;
yyprintf((stderr, " ok %s @ %s\n", "space", yy->__buf+yy->__pos));
return 1;
l1:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "space", yy->__buf+yy->__pos));
return 0;
}
YY_RULE(int) yy_dot(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "dot")); if (!yy__(yy)) goto l9; if (!yymatchChar(yy, '.')) goto l9; if (!yy__(yy)) goto l9; yyDo(yy, yy_1_dot, yy->__begin, yy->__end); if (!yy__(yy)) goto l9;
yyprintf((stderr, " ok %s @ %s\n", "dot", yy->__buf+yy->__pos));
return 1;
l9:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "dot", yy->__buf+yy->__pos));
return 0;
}
YY_RULE(int) yy_class(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "class")); if (!yymatchChar(yy, '[')) goto l10; if (!yy__(yy)) goto l10; yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text
#define yyleng yy->__textlen
if (!(YY_BEGIN)) goto l10;
#undef yytext
#undef yyleng
}
l11:;
{ int yypos12= yy->__pos, yythunkpos12= yy->__thunkpos;
{ int yypos13= yy->__pos, yythunkpos13= yy->__thunkpos; if (!yymatchChar(yy, ']')) goto l13; goto l12;
l13:; yy->__pos= yypos13; yy->__thunkpos= yythunkpos13;
} if (!yy_string(yy)) goto l12; goto l11;
l12:; yy->__pos= yypos12; yy->__thunkpos= yythunkpos12;
} yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text
#define yyleng yy->__textlen
if (!(YY_END)) goto l10;
#undef yytext
#undef yyleng
} if (!yymatchChar(yy, ']')) goto l10; yyDo(yy, yy_1_class, yy->__begin, yy->__end); if (!yy__(yy)) goto l10;
yyprintf((stderr, " ok %s @ %s\n", "class", yy->__buf+yy->__pos));
return 1;
l10:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "class", yy->__buf+yy->__pos));
return 0;
}
YY_RULE(int) yy_string(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "string")); if (!yymatchChar(yy, '"')) goto l14; yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text
#define yyleng yy->__textlen
if (!(YY_BEGIN)) goto l14;
#undef yytext
#undef yyleng
}
l15:;
{ int yypos16= yy->__pos, yythunkpos16= yy->__thunkpos; if (!yymatchClass(yy, (unsigned char *)"\377\377\377\377\373\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377")) goto l16; goto l15;
l16:; yy->__pos= yypos16; yy->__thunkpos= yythunkpos16;
} yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text
#define yyleng yy->__textlen
if (!(YY_END)) goto l14;
#undef yytext
#undef yyleng
} if (!yymatchChar(yy, '"')) goto l14; yyDo(yy, yy_1_string, yy->__begin, yy->__end); if (!yy__(yy)) goto l14;
yyprintf((stderr, " ok %s @ %s\n", "string", yy->__buf+yy->__pos));
return 1;
l14:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "string", yy->__buf+yy->__pos));
return 0;
}
YY_RULE(int) yy_atom(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "atom"));
{ int yypos18= yy->__pos, yythunkpos18= yy->__thunkpos; if (!yy_string(yy)) goto l19; goto l18;
l19:; yy->__pos= yypos18; yy->__thunkpos= yythunkpos18; if (!yy_class(yy)) goto l20; goto l18;
l20:; yy->__pos= yypos18; yy->__thunkpos= yythunkpos18; if (!yy_dot(yy)) goto l17;
}
l18:;
yyprintf((stderr, " ok %s @ %s\n", "atom", yy->__buf+yy->__pos));
return 1;
l17:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "atom", yy->__buf+yy->__pos));
return 0;
}
YY_RULE(int) yy_postfix(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; yyDo(yy, yyPush, 1, 0);
yyprintf((stderr, "%s\n", "postfix")); if (!yy_atom(yy)) goto l21; yyDo(yy, yySet, -1, 0);
{ int yypos22= yy->__pos, yythunkpos22= yy->__thunkpos;
{ int yypos24= yy->__pos, yythunkpos24= yy->__thunkpos; if (!yymatchChar(yy, '?')) goto l25; if (!yy__(yy)) goto l25; yyDo(yy, yy_1_postfix, yy->__begin, yy->__end); goto l24;
l25:; yy->__pos= yypos24; yy->__thunkpos= yythunkpos24; if (!yymatchChar(yy, '*')) goto l26; if (!yy__(yy)) goto l26; yyDo(yy, yy_2_postfix, yy->__begin, yy->__end); goto l24;
l26:; yy->__pos= yypos24; yy->__thunkpos= yythunkpos24; if (!yymatchChar(yy, '+')) goto l22; if (!yy__(yy)) goto l22; yyDo(yy, yy_3_postfix, yy->__begin, yy->__end);
}
l24:; goto l23;
l22:; yy->__pos= yypos22; yy->__thunkpos= yythunkpos22;
}
l23:; yyDo(yy, yy_4_postfix, yy->__begin, yy->__end);
yyprintf((stderr, " ok %s @ %s\n", "postfix", yy->__buf+yy->__pos)); yyDo(yy, yyPop, 1, 0);
return 1;
l21:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "postfix", yy->__buf+yy->__pos));
return 0;
}
YY_RULE(int) yy_prefix(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; yyDo(yy, yyPush, 1, 0);
yyprintf((stderr, "%s\n", "prefix"));
{ int yypos28= yy->__pos, yythunkpos28= yy->__thunkpos; if (!yymatchChar(yy, '!')) goto l29; if (!yy__(yy)) goto l29; if (!yy_postfix(yy)) goto l29; yyDo(yy, yySet, -1, 0); yyDo(yy, yy_1_prefix, yy->__begin, yy->__end); goto l28;
l29:; yy->__pos= yypos28; yy->__thunkpos= yythunkpos28; if (!yy_postfix(yy)) goto l27; yyDo(yy, yySet, -1, 0); yyDo(yy, yy_2_prefix, yy->__begin, yy->__end);
}
l28:;
yyprintf((stderr, " ok %s @ %s\n", "prefix", yy->__buf+yy->__pos)); yyDo(yy, yyPop, 1, 0);
return 1;
l27:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "prefix", yy->__buf+yy->__pos));
return 0;
}
YY_RULE(int) yy_and(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; yyDo(yy, yyPush, 2, 0);
yyprintf((stderr, "%s\n", "and"));
{ int yypos31= yy->__pos, yythunkpos31= yy->__thunkpos; if (!yy_prefix(yy)) goto l32; yyDo(yy, yySet, -2, 0); if (!yy_and(yy)) goto l32; yyDo(yy, yySet, -1, 0); yyDo(yy, yy_1_and, yy->__begin, yy->__end); goto l31;
l32:; yy->__pos= yypos31; yy->__thunkpos= yythunkpos31; if (!yy_prefix(yy)) goto l30; yyDo(yy, yySet, -2, 0); yyDo(yy, yy_2_and, yy->__begin, yy->__end);
}
l31:;
yyprintf((stderr, " ok %s @ %s\n", "and", yy->__buf+yy->__pos)); yyDo(yy, yyPop, 2, 0);
return 1;
l30:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "and", yy->__buf+yy->__pos));
return 0;
}
YY_RULE(int) yy_or(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; yyDo(yy, yyPush, 2, 0);
yyprintf((stderr, "%s\n", "or"));
{ int yypos34= yy->__pos, yythunkpos34= yy->__thunkpos; if (!yy_and(yy)) goto l35; yyDo(yy, yySet, -2, 0); if (!yy__(yy)) goto l35; if (!yymatchChar(yy, '|')) goto l35; if (!yy__(yy)) goto l35; if (!yy_or(yy)) goto l35; yyDo(yy, yySet, -1, 0); yyDo(yy, yy_1_or, yy->__begin, yy->__end); goto l34;
l35:; yy->__pos= yypos34; yy->__thunkpos= yythunkpos34; if (!yy_and(yy)) goto l33; yyDo(yy, yySet, -2, 0); yyDo(yy, yy_2_or, yy->__begin, yy->__end);
}
l34:;
yyprintf((stderr, " ok %s @ %s\n", "or", yy->__buf+yy->__pos)); yyDo(yy, yyPop, 2, 0);
return 1;
l33:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "or", yy->__buf+yy->__pos));
return 0;
}
YY_RULE(int) yy__(yycontext *yy)
{
yyprintf((stderr, "%s\n", "_"));
l37:;
{ int yypos38= yy->__pos, yythunkpos38= yy->__thunkpos; if (!yy_space(yy)) goto l38; goto l37;
l38:; yy->__pos= yypos38; yy->__thunkpos= yythunkpos38;
}
yyprintf((stderr, " ok %s @ %s\n", "_", yy->__buf+yy->__pos));
return 1;
}
YY_RULE(int) yy_start(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; yyDo(yy, yyPush, 1, 0);
yyprintf((stderr, "%s\n", "start")); if (!yy__(yy)) goto l39; if (!yy_or(yy)) goto l39; yyDo(yy, yySet, -1, 0); yyDo(yy, yy_1_start, yy->__begin, yy->__end);
yyprintf((stderr, " ok %s @ %s\n", "start", yy->__buf+yy->__pos)); yyDo(yy, yyPop, 1, 0);
return 1;
l39:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "start", yy->__buf+yy->__pos));
return 0;
}
#ifndef YY_PART
typedef int (*yyrule)(yycontext *yy);
YY_PARSE(int) YYPARSEFROM(YY_CTX_PARAM_ yyrule yystart)
{
int yyok;
if (!yyctx->__buflen)
{
yyctx->__buflen= YY_BUFFER_SIZE;
yyctx->__buf= (char *)YY_MALLOC(yyctx, yyctx->__buflen);
yyctx->__textlen= YY_BUFFER_SIZE;
yyctx->__text= (char *)YY_MALLOC(yyctx, yyctx->__textlen);
yyctx->__thunkslen= YY_STACK_SIZE;
yyctx->__thunks= (yythunk *)YY_MALLOC(yyctx, sizeof(yythunk) * yyctx->__thunkslen);
yyctx->__valslen= YY_STACK_SIZE;
yyctx->__vals= (YYSTYPE *)YY_MALLOC(yyctx, sizeof(YYSTYPE) * yyctx->__valslen);
yyctx->__begin= yyctx->__end= yyctx->__pos= yyctx->__limit= yyctx->__thunkpos= 0;
}
yyctx->__begin= yyctx->__end= yyctx->__pos;
yyctx->__thunkpos= 0;
yyctx->__val= yyctx->__vals;
yyok= yystart(yyctx);
if (yyok) yyDone(yyctx);
yyCommit(yyctx);
return yyok;
}
YY_PARSE(int) YYPARSE(YY_CTX_PARAM)
{
return YYPARSEFROM(YY_CTX_ARG_ yy_start);
}
YY_PARSE(yycontext *) YYRELEASE(yycontext *yyctx)
{
if (yyctx->__buflen)
{
yyctx->__buflen= 0;
YY_FREE(yyctx, yyctx->__buf);
YY_FREE(yyctx, yyctx->__text);
YY_FREE(yyctx, yyctx->__thunks);
YY_FREE(yyctx, yyctx->__vals);
}
return yyctx;
}
#endif
#line 205 "parse.leg"
Node *_checktype(Node *object, enum op type)
{
if (object->type == type) return object;
fprintf(stderr, "\naccesing type %i as if it were a %i\n", object->type, type);
exit(1);
return 0;
}
#define get(object, type, member) (_checktype(object, type)->type.member)
int execute(Node *node, InputBuffer *in)
{
switch (node->type) {
case String: {
if (strncmp(currentText(in), get(node,String,string), get(node,String,len))) {
return 0;
}
advance(in, get(node,String,len));
return 1;
}
case And: {
int pos= getPosition(in);
if (!execute(get(node,And,children[0]), in)) //si il y a eu une erreur
{
return 0;
} //si ça s'est bien passé
if (!execute(get(node,And,children[1]), in)) {
setPosition(in, pos);
return 0;
}
return 1;
}
case Or: {
if (execute(get(node,Or,children[0]), in)) {
return 1;
}
return execute(get(node,Or,children[1]), in);
}
case Star: {
while (execute(get(node,Star,children[0]), in));
return 1;
}
case Plus: {
if (!execute(get(node,Plus,children[0]), in)) {
return 0;
}
while (execute(get(node,Plus,children[0]), in));
return 1;
}
case Class: {
if (!currentChar(in)) {
return 0;
}
if (strchr(get(node,Class,stringValue), currentChar(in))) {
advance(in, 1);
return 1;
}
return 0;
}
case Query: {
execute(get(node,Query,children[0]), in);
return 1;
}
case Exc: {
int pos= getPosition(in);
if (!execute(get(node,Exc,children[0]), in)) {
return 1;
}
setPosition(in, pos);
return 0;
}
case Dot: {
if (atEnd(in)) {
return 0;
}
advance(in, 1);
return 1;
}
}
printf("this cannot happen\n");
abort();
}
int main(int argc, char **argv)
{
if(argc<2) return 0;
inputBuffer = mkInputBuffer(argv[1]);
if (!yyparse()) {
printf("Error\n");
return 1;
}
println(yylval);
char *line=0;
size_t line_max=0;
ssize_t line_len=0;
while((line_len=getline(&line,&line_max,stdin))>=0){
if(line_len>0 && line[line_len-1]=='\n'){
line[line_len-1]=0;
}
initInputBuffer(inputBuffer,line);
if (!execute(yylval, inputBuffer) || !atEnd(inputBuffer)){
printf("no match, current position : %i\n", getPosition(inputBuffer));
}
else{
printf("match, current position : %i\n", getPosition(inputBuffer));
}// 0 => no match, 1 => match
}
return 0;
(void)yySet;
(void)yyPop;
(void)yyPush;
(void)yyAccept;
(void)yymatchDot;
(void)yymatchString;
(void)yymatchChar;
}