leo преди 3 години
родител
ревизия
0b58ea1a01
променени са 1 файла, в които са добавени 16 реда и са изтрити 4 реда
  1. +16
    -4
      lexer.c

+ 16
- 4
lexer.c Целия файл

@ -10,7 +10,8 @@ enum opcode {
STRING, STRING,
AND, AND,
STAR, STAR,
PLUS
PLUS,
QMARK
}; };
struct Exploration struct Exploration
{ {
@ -96,6 +97,12 @@ Node *mkPlus(Node *child)
return node; return node;
} }
Node *mkQmark(Node *child)
{
Node *node= mkNode(QMARK);
node->children[0]= child;
return node;
}
int execute(Node *node, Exploration *in) int execute(Node *node, Exploration *in)
{ {
@ -146,6 +153,11 @@ int execute(Node *node, Exploration *in)
} }
} }
case QMARK: {
// 0 ou 1
if(execute(node->children[0], in)==1) return execute(node->children[0], in);
return 1;
}
} }
printf("this cannot happen\n"); printf("this cannot happen\n");
abort(); abort();
@ -154,7 +166,7 @@ int execute(Node *node, Exploration *in)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
Exploration *in= mkExploration("aabbcc");
Exploration *in= mkExploration("acc");
/*Node *program= /*Node *program=
mkString("aabbcc"); mkString("aabbcc");
@ -175,8 +187,8 @@ int main(int argc, char **argv)
mkStar(mkString("c"))))); mkStar(mkString("c")))));
*/ */
Node *program= Node *program=
mkAnd(mkPlus(mkString("a")), // "a"*"b"*"c"*
mkAnd(mkPlus(mkString("b")),
mkAnd(mkQmark(mkString("a")), // "a"*"b"*"c"*
mkAnd(mkQmark(mkString("b")),
mkPlus(mkString("c")))); mkPlus(mkString("c"))));
if (execute(program, in)<=0) if (execute(program, in)<=0)

Зареждане…
Отказ
Запис