Files
scully/src/test.cpp

92 lines
2.1 KiB
C++
Raw Normal View History

/* The scully programming language.
*
* Copyright (c) Peter Dahlberg, Markus Hauschild and Florian Sattler, 2013.
* Licensed under the GNU GPL v2.
*/
2013-05-31 23:51:44 +02:00
#include "Token.h"
2013-05-31 21:35:44 +02:00
// this file is auto generated from grammar/grammar.y
2013-05-31 22:20:31 +02:00
#include "grammar.h"
2013-05-31 21:35:44 +02:00
#include "lexertl/generator.hpp"
#include "lexertl/lookup.hpp"
#include "lexertl/rules.hpp"
#include "lexertl/state_machine.hpp"
int main() {
2013-05-31 22:20:31 +02:00
lexertl::rules rules;
lexertl::state_machine state_machine;
//keywords
rules.add("bool", T_BOOL);
rules.add("for", T_FOR);
rules.add("if", T_IF);
rules.add("int", T_INT);
rules.add("return", T_RETURN);
rules.add("void", T_VOID);
rules.add("rfor", T_RFOR);
rules.add("rif", T_RIF);
// special characters
rules.add("\"(\"", T_LPAREN);
rules.add("\")\"", T_RPAREN);
rules.add("mulder", T_BEGIN);
rules.add("scully", T_END);
rules.add(",", T_COMMA);
rules.add(";", T_SEMICOLON);
// operators
rules.add("=", T_ASSIGN);
rules.add("==", T_EQUALS);
rules.add("<", T_LESS);
rules.add("\"+\"", T_PLUS);
rules.add("\"-\"", T_MINUS);
rules.add("\"*\"", T_TIMES);
rules.add("\"/\"", T_DIV);
// constants
rules.add("true", T_TRUE);
rules.add("false", T_FALSE);
rules.add("\\d+", T_CINT);
// identifier
rules.add("[a-zA-Z_][a-zA-Z_0-9]*", T_IDENTIFIER);
// whitespace
rules.add("\\s+", T_WHITESPACE);
lexertl::generator::build(rules, state_machine);
state_machine.minimise();
2013-06-01 00:43:30 +02:00
std::cout << "The scully programming language v0.1" << std::endl;
2013-05-31 22:20:31 +02:00
2013-05-31 23:51:44 +02:00
void* parser = scullyParserAlloc(malloc);
2013-05-31 22:20:31 +02:00
while (true) {
std::cout << "> ";
std::string input;
std::getline(std::cin, input);
if (std::cin.eof()) {
std::cout << std::endl << "Bye." << std::endl;
return 0;
}
auto iter = input.begin();
auto end = input.end();
lexertl::smatch results(iter, end);
do {
lexertl::lookup (state_machine, results);
std::string s(results.start, results.end);
if (results.id != T_WHITESPACE) {
std::cout << "Id: " << results.id << ", Token: " << s << std::endl;
2013-05-31 23:51:44 +02:00
scullyParser(parser, results.id, new Token(s));
2013-05-31 22:20:31 +02:00
}
} while (results.id != 0);
}
2013-05-31 23:51:44 +02:00
scullyParserFree(parser, free);
2013-05-31 22:20:31 +02:00
return 0;
}