193 lines
2.9 KiB
Plaintext
193 lines
2.9 KiB
Plaintext
%{
|
|
#include "Scanner.hpp"
|
|
#include "Parser.hpp"
|
|
|
|
#include <string>
|
|
#include <cstdlib>
|
|
|
|
static void meta(const char *);
|
|
|
|
using namespace monicelli;
|
|
typedef Parser::token token;
|
|
|
|
#define YY_USER_ACTION location->begin.columns(yyleng);
|
|
%}
|
|
|
|
%option ecs stack warn c++
|
|
%option nodefault noyywrap nounput yylineno
|
|
%option yyclass="Scanner"
|
|
|
|
DIGIT [0-9]
|
|
HEXDIGIT [0-9a-zA-Z]
|
|
CHAR [a-zA-Z_]
|
|
|
|
%x shift
|
|
|
|
%%
|
|
|
|
"#"[^\n]* {
|
|
meta(yytext + 1);
|
|
}
|
|
|
|
"bituma"[^\n]* {}
|
|
|
|
"Lei ha clacsonato" {
|
|
return token::MAIN;
|
|
}
|
|
"vaffanzum" {
|
|
return token::RETURN;
|
|
}
|
|
"Necchi" {
|
|
lval->typeval = Type::INT;
|
|
return token::TYPENAME;
|
|
}
|
|
"Mascetti" {
|
|
lval->typeval = Type::CHAR;
|
|
return token::TYPENAME;
|
|
}
|
|
"Perozzi" {
|
|
lval->typeval = Type::FLOAT;
|
|
return token::TYPENAME;
|
|
}
|
|
"Melandri" {
|
|
lval->typeval = Type::BOOL;
|
|
return token::TYPENAME;
|
|
}
|
|
"Sassaroli" {
|
|
lval->typeval = Type::DOUBLE;
|
|
return token::TYPENAME;
|
|
}
|
|
"conte" {
|
|
return token::STAR;
|
|
}
|
|
"voglio" {
|
|
return token::VARDECL;
|
|
}
|
|
"come "("se ")?"fosse" {
|
|
return token::ASSIGN;
|
|
}
|
|
("il"|"lo"|"la"|"l'"|"i"|"gli"|"le"|"un"|"un'"|"una"|"dei") {
|
|
return token::ARTICLE;
|
|
}
|
|
"più" {
|
|
return token::OP_PLUS;
|
|
}
|
|
"meno" {
|
|
return token::OP_MINUS;
|
|
}
|
|
"per" {
|
|
return token::OP_TIMES;
|
|
}
|
|
"diviso" {
|
|
return token::OP_DIV;
|
|
}
|
|
"con scappellamento a" {
|
|
BEGIN(shift);
|
|
}
|
|
<shift>"per" {
|
|
BEGIN(INITIAL);
|
|
}
|
|
<shift>"sinistra" {
|
|
return token::OP_SHL;
|
|
}
|
|
<shift>"destra" {
|
|
return token::OP_SHR;
|
|
}
|
|
"minore "("di"|"del") {
|
|
return token::OP_LT;
|
|
}
|
|
"maggiore "("di"|"del") {
|
|
return token::OP_GT;
|
|
}
|
|
"minore o uguale "("a"|"di") {
|
|
return token::OP_LTE;
|
|
}
|
|
"maggiore o uguale "("a"|"di") {
|
|
return token::OP_GTE;
|
|
}
|
|
"a posterdati" {
|
|
return token::PRINT;
|
|
}
|
|
"mi porga" {
|
|
return token::INPUT;
|
|
}
|
|
"ho visto" {
|
|
return token::ASSERT;
|
|
}
|
|
"!" {
|
|
return token::BANG;
|
|
}
|
|
"stuzzica" {
|
|
return token::LOOP_BEGIN;
|
|
}
|
|
"e brematura anche, se" {
|
|
return token::LOOP_CONDITION;
|
|
}
|
|
"che cos'è" {
|
|
return token::BRANCH_CONDITION;
|
|
}
|
|
"?" {
|
|
return token::BRANCH_BEGIN;
|
|
}
|
|
"o tarapia tapioco" {
|
|
return token::BRANCH_ELSE;
|
|
}
|
|
"e velocità di esecuzione" {
|
|
return token::BRANCH_END;
|
|
}
|
|
":" {
|
|
return token::COLON;
|
|
}
|
|
"blinda la supercazzola" {
|
|
return token::FUNDECL;
|
|
}
|
|
"con" {
|
|
return token::PARAMS;
|
|
}
|
|
"," {
|
|
return token::COMMA;
|
|
}
|
|
"brematurata la supercazzola" {
|
|
return token::FUNCALL;
|
|
}
|
|
"o scherziamo"("?")? {
|
|
return token::FUN_END;
|
|
}
|
|
"avvertite don ulrico" {
|
|
return token::ABORT;
|
|
}
|
|
"o magari" {
|
|
return token::CASE_END;
|
|
}
|
|
|
|
<INITIAL,shift>"\n" {
|
|
location->begin.lines();
|
|
}
|
|
|
|
<INITIAL,shift>[ \t\f\v\r] {
|
|
}
|
|
|
|
{CHAR}({DIGIT}|{CHAR})* {
|
|
lval->strval = new std::string(yytext);
|
|
return token::ID;
|
|
}
|
|
|
|
{DIGIT}+ {
|
|
lval->intval = strtol(yytext, NULL, 10);
|
|
return token::NUMBER;
|
|
}
|
|
|
|
<INITIAL,shift>. {
|
|
return -1;
|
|
}
|
|
|
|
%%
|
|
|
|
void meta(const char *text) {
|
|
while (*text != '\0' && *text == ' ') {
|
|
text += 1;
|
|
}
|
|
std::cerr << "META: " << text << std::endl;
|
|
}
|
|
|