This is a rust project now, let's end the segregation
This commit is contained in:
parent
0fddcbd645
commit
201d7d2594
5
.gitignore
vendored
5
.gitignore
vendored
@ -1,4 +1 @@
|
|||||||
deelang
|
target/*
|
||||||
*.o
|
|
||||||
parser.h
|
|
||||||
lexer.h
|
|
0
rust/Cargo.lock → Cargo.lock
generated
0
rust/Cargo.lock → Cargo.lock
generated
1
rust/.gitignore
vendored
1
rust/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
target/*
|
|
20
src/Makefile
20
src/Makefile
@ -1,20 +0,0 @@
|
|||||||
.PHONY: all clean
|
|
||||||
all: deelang
|
|
||||||
CC = g++
|
|
||||||
CPPFLAGS = -g
|
|
||||||
|
|
||||||
lexer.o lexer.h: parser.h lexer.l
|
|
||||||
flex -o lexer.cpp --header-file=lexer.h lexer.l
|
|
||||||
$(CC) -c lexer.cpp
|
|
||||||
rm lexer.cpp
|
|
||||||
|
|
||||||
parser.h parser.o: parser.y
|
|
||||||
bison -o parser.cpp --header=parser.h parser.y
|
|
||||||
$(CC) -c parser.cpp
|
|
||||||
rm parser.cpp
|
|
||||||
|
|
||||||
deelang: deelang.cpp lexer.o parser.o syntax.o
|
|
||||||
$(CC) $(CPPFLAGS) -o $@ $^
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf *.o parser.h lexer.h deelang
|
|
@ -1,11 +0,0 @@
|
|||||||
#include "syntax.h"
|
|
||||||
#include "lexer.h"
|
|
||||||
#include "parser.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
yyparse();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
54
src/lexer.l
54
src/lexer.l
@ -1,54 +0,0 @@
|
|||||||
%{
|
|
||||||
#include <stack>
|
|
||||||
#include <string>
|
|
||||||
#include "syntax.h"
|
|
||||||
#include "parser.h"
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
stack<int> s;
|
|
||||||
|
|
||||||
#define YY_USER_INIT s.push(0); BEGIN(freshline);
|
|
||||||
|
|
||||||
%}
|
|
||||||
|
|
||||||
%option noyywrap
|
|
||||||
|
|
||||||
%x freshline
|
|
||||||
|
|
||||||
digit [0-9]
|
|
||||||
letter [A-Za-z]
|
|
||||||
|
|
||||||
%%
|
|
||||||
<freshline>""/[^\t ] {
|
|
||||||
if (s.top() == 0) {
|
|
||||||
BEGIN(0);
|
|
||||||
} else {
|
|
||||||
s.pop(); yyless(0); return DEDENT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
<freshline>[ \t]+ {
|
|
||||||
if (s.top() == yyleng) {
|
|
||||||
BEGIN(0); // Same indentation, continue
|
|
||||||
} else if (s.top() > yyleng) {
|
|
||||||
s.pop(); yyless(0); return DEDENT;
|
|
||||||
// Same rule again until the stack is even
|
|
||||||
} else {
|
|
||||||
s.push(yyleng); BEGIN(0); return INDENT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#[^\n]* // Eat comments
|
|
||||||
\"[^"]*\" yylval.sym = new string(yytext); return STRING;
|
|
||||||
if return IF;
|
|
||||||
else return ELSE;
|
|
||||||
elif return ELIF;
|
|
||||||
{digit}+|{digit}*\.{digit}+ yylval.num = atof(yytext); return NUM;
|
|
||||||
{letter}({letter}|{digit}|[?.-])* yylval.sym = new string(yytext); return ID;
|
|
||||||
"<-" return GETS;
|
|
||||||
"->" return MAPS;
|
|
||||||
".." return CAT;
|
|
||||||
[(){}.,*/+-] return yytext[0];
|
|
||||||
[\t ] // Eat whitespace not first on a line
|
|
||||||
"/"\n // Eat newlines ending in /
|
|
||||||
[\n;] BEGIN(freshline); return STOP;
|
|
||||||
. fprintf(stderr, "Scanning error!\nOffender: %s\n", yytext); exit(1);
|
|
||||||
%%
|
|
78
src/parser.y
78
src/parser.y
@ -1,78 +0,0 @@
|
|||||||
%{
|
|
||||||
|
|
||||||
#include <cstdio>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "syntax.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
int yylex();
|
|
||||||
void yyerror(const char* p) { fprintf(stderr, p); }
|
|
||||||
|
|
||||||
%}
|
|
||||||
|
|
||||||
%define parse.trace
|
|
||||||
|
|
||||||
%union {
|
|
||||||
float num;
|
|
||||||
std::string *sym;
|
|
||||||
Node *expr;
|
|
||||||
NodeList *exprlist;
|
|
||||||
}
|
|
||||||
|
|
||||||
%token <sym> ID
|
|
||||||
%token <num> NUM
|
|
||||||
%token <sym> STRING
|
|
||||||
|
|
||||||
%token STOP
|
|
||||||
%token INDENT DEDENT
|
|
||||||
%token IF ELIF ELSE
|
|
||||||
|
|
||||||
%right GETS
|
|
||||||
%left CAT
|
|
||||||
%left '+' '-'
|
|
||||||
%left '/' '*'
|
|
||||||
%left MAPS
|
|
||||||
|
|
||||||
%nterm <expr> expr
|
|
||||||
%nterm <exprlist> exprlist
|
|
||||||
|
|
||||||
%%
|
|
||||||
program: statements | statements statement;
|
|
||||||
statements: statements statement STOP
|
|
||||||
| statements STOP
|
|
||||||
| // null production ;
|
|
||||||
statement: assignment | funcall | conditional;
|
|
||||||
assignment: ID GETS expr;
|
|
||||||
assignments: assignments assignment STOP | // null production;
|
|
||||||
expr: funcdef
|
|
||||||
| funcall
|
|
||||||
| objdef
|
|
||||||
| expr CAT expr { $$ = new OpNode(CAT, $1, $3); }
|
|
||||||
| expr '+' expr { $$ = new OpNode('+', $1, $3); }
|
|
||||||
| expr '-' expr { $$ = new OpNode('-', $1, $3); }
|
|
||||||
| expr '*' expr { $$ = new OpNode('*', $1, $3); }
|
|
||||||
| expr '/' expr { $$ = new OpNode('/', $1, $3); }
|
|
||||||
| '(' expr ')' {$$ = $2;}
|
|
||||||
| ID {$$ = new IdNode($1);}
|
|
||||||
| NUM {$$ = new NumNode($1);}
|
|
||||||
| STRING {$$ = new StringNode($1);};
|
|
||||||
|
|
||||||
funcdef: param MAPS expr | param MAPS block;
|
|
||||||
param: ID | '_' | // null production;
|
|
||||||
|
|
||||||
funcall: ID '(' exprlist ')' { print_expression_list($3); }
|
|
||||||
exprlist: exprlist ',' expr { $1 -> push_back($3); $$ = $1; }
|
|
||||||
| expr { $$ = new NodeList(); $$ -> push_back($1); }
|
|
||||||
| { $$ = new NodeList(); } // null production;
|
|
||||||
|
|
||||||
conditional: IF expr block elifs
|
|
||||||
| IF expr block elifs ELSE block;
|
|
||||||
elifs: ELIF expr block elifs| // null production;
|
|
||||||
|
|
||||||
objdef: '{' block_assignments '}' | '{' '}'
|
|
||||||
|
|
||||||
block: STOP INDENT statement statements DEDENT
|
|
||||||
block_assignments: STOP INDENT assignments DEDENT
|
|
||||||
%%
|
|
@ -1,49 +0,0 @@
|
|||||||
#include <iostream>
|
|
||||||
#include <cstring>
|
|
||||||
#include <cstdlib>
|
|
||||||
|
|
||||||
#include "syntax.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
IdNode::IdNode(string *id) {
|
|
||||||
this->id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
void IdNode::display() {
|
|
||||||
cout << *id;
|
|
||||||
}
|
|
||||||
|
|
||||||
NumNode::NumNode(float num) {
|
|
||||||
this->num = num;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NumNode::display() {
|
|
||||||
cout << num;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringNode::StringNode(string* stringVal) {
|
|
||||||
this->stringVal = stringVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
void StringNode::display() {
|
|
||||||
cout << *stringVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
OpNode::OpNode(int op, Node *first, Node *second) {
|
|
||||||
this->op = op;
|
|
||||||
this->first = first;
|
|
||||||
this->second = second;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OpNode::display() {
|
|
||||||
first->display();
|
|
||||||
cout << " " << (char)op << " ";
|
|
||||||
second->display();
|
|
||||||
}
|
|
||||||
|
|
||||||
void print_expression_list(NodeList *list) {
|
|
||||||
for (Node *expr : *list) {
|
|
||||||
expr->display();
|
|
||||||
}
|
|
||||||
}
|
|
50
src/syntax.h
50
src/syntax.h
@ -1,50 +0,0 @@
|
|||||||
#ifndef SYNTAX_H
|
|
||||||
#define SYNTAX_H
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
class Node {
|
|
||||||
public:
|
|
||||||
virtual void display() = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
class IdNode : public Node {
|
|
||||||
private:
|
|
||||||
std::string *id;
|
|
||||||
public:
|
|
||||||
IdNode(std::string*);
|
|
||||||
virtual void display();
|
|
||||||
};
|
|
||||||
|
|
||||||
class NumNode : public Node {
|
|
||||||
private:
|
|
||||||
float num;
|
|
||||||
public:
|
|
||||||
NumNode(float);
|
|
||||||
virtual void display();
|
|
||||||
};
|
|
||||||
|
|
||||||
class StringNode : public Node {
|
|
||||||
private:
|
|
||||||
std::string* stringVal;
|
|
||||||
public:
|
|
||||||
StringNode(std::string*);
|
|
||||||
virtual void display();
|
|
||||||
};
|
|
||||||
|
|
||||||
class OpNode : public Node {
|
|
||||||
private:
|
|
||||||
int op;
|
|
||||||
Node *first;
|
|
||||||
Node *second;
|
|
||||||
public:
|
|
||||||
OpNode(int, Node*, Node*);
|
|
||||||
virtual void display();
|
|
||||||
};
|
|
||||||
|
|
||||||
class NodeList : public std::vector<Node*>{};
|
|
||||||
|
|
||||||
void print_expression_list(NodeList *);
|
|
||||||
|
|
||||||
#endif /* SYNTAX_H */
|
|
Loading…
Reference in New Issue
Block a user