This is a rust project now, let's end the segregation
This commit is contained in:
		
							
								
								
									
										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 */
 | 
					 | 
				
			||||||
		Reference in New Issue
	
	Block a user