소스 검색

Create lexer

main
Vank143 3 년 전
committed by GitHub
부모
커밋
f035f7d33c
No known key found for this signature in database GPG 키 ID: 4AEE18F83AFDEB23
1개의 변경된 파일160개의 추가작업 그리고 0개의 파일을 삭제
  1. +160
    -0
      lexer

+ 160
- 0
lexer 파일 보기

@ -0,0 +1,160 @@
#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;
}

불러오는 중...
취소
저장