/* =============================================================================
//
// This file is part of the qlow compiler.
//
// Copyright (C) 2014-2015 Nicolas Winkler
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
// ===========================================================================*/
%option reentrant bison-bridge bison-locations
%option prefix="qlow_parser_"
%option yylineno nounput noinput
%option stack
%option 8bit
%option header-file="lexer.h"
%option extra-type="std::string"
%{
#include "Parser.h"
#include "syntax.hpp"
#define register
#define SET_TOKEN(t) (yylval_param->token = t)
#define SET_STRING (yylval_param->string = new std::string(yytext, yyleng))
extern "C" int qlow_parser_wrap(yyscan_t s);
#ifdef _WIN32
#define YY_NO_UNISTD_H
#endif
#define YY_USER_ACTION \
do { \
yylloc_param->first_line = yylineno; \
yylloc_param->first_column = yycolumn; \
yycolumn += yyleng; \
yylloc_param->last_line = yylineno; \
yylloc_param->last_column = yycolumn; \
yylloc_param->filename = yyextra; \
} while(0);
%}
%x COMMENT
%x LINE_COMMENT
%x STRING
%s METHOD
UTF8CHAR [\x00-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xec][\x80-\xbf][\x80-\xbf]|\xed[\x80-\x9f][\x80-\xbf]|[\xee\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf3][\x80-\xbf][\x80-\xbf][\x80-\xbf]|\xf4[\x80-\x8f][\x80-\xbf][\x80-\xbf]
/*UTF8CHAR [a-zA-Z0-9_]
*/
%%
int commentDepth = 0;
"/*" commentDepth++;
"*/" if ((--commentDepth) <= 0) { yy_pop_state(yyscanner); };
\n yycolumn = 0;
. ; // inside comment, ignore everything
"\n" yycolumn = 0; yy_pop_state(yyscanner); //yy_push_state(INITIAL);
. ; // inside comment, ignore everything
"\"" yy_pop_state(yyscanner);
[^\"^\n]* printf("%s\n", std::string(yytext, yyleng).c_str());
\n yycolumn = 0; SET_STRING; return UNEXPECTED_SYMBOL;
"/*" yy_push_state(COMMENT, yyscanner); commentDepth = 1;
"//" yy_push_state(LINE_COMMENT, yyscanner);
"\"" yy_push_state(STRING, yyscanner);
[\t ] ; // Space or tab ignored
\n yycolumn = 0; return SET_TOKEN(NEW_LINE);
\n yycolumn = 0; //return SET_TOKEN(NEW_LINE);
"class" return SET_TOKEN(CLASS);
"struct" return SET_TOKEN(STRUCT);
"do" yy_push_state(METHOD, yyscanner); return SET_TOKEN(DO);
"end" yy_pop_state(yyscanner); return SET_TOKEN(END);
"end" return SET_TOKEN(END);
"if" return SET_TOKEN(IF);
"while" return SET_TOKEN(WHILE);
"else" return SET_TOKEN(ELSE);
"return" return SET_TOKEN(RETURN);
"new" return SET_TOKEN(NEW);
"extern" return SET_TOKEN(EXTERN);
":" return SET_TOKEN(COLON);
";" return SET_TOKEN(SEMICOLON);
"," return SET_TOKEN(COMMA);
"." return SET_TOKEN(DOT);
"&" return SET_TOKEN(AMPERSAND);
":=" SET_STRING; return ASSIGN;
"==" SET_STRING; return EQUALS;
"!=" SET_STRING; return NOT_EQUALS;
"and" SET_STRING; return AND;
"or" SET_STRING; return OR;
"xor" SET_STRING; return XOR;
"not" SET_STRING; return NOT;
"as" return SET_TOKEN(AS);
"+" SET_STRING; return PLUS;
"-" SET_STRING; return MINUS;
"*" SET_STRING; return ASTERISK;
"/" SET_STRING; return SLASH;
[\+\-\*\/=!<>]+ SET_STRING; return CUSTOM_OPERATOR;
"(" return SET_TOKEN(ROUND_LEFT);
")" return SET_TOKEN(ROUND_RIGHT);
"[" return SET_TOKEN(SQUARE_LEFT);
"]" return SET_TOKEN(SQUARE_RIGHT);
"false" return SET_TOKEN(FALSE);
"true" return SET_TOKEN(TRUE);
[0-9_]+ SET_STRING; return INT_LITERAL;
0x[0-9A-Fa-f]+ SET_STRING; return INT_LITERAL;
[a-zA-Z_][a-zA-Z0-9_]* SET_STRING; return IDENTIFIER;
. SET_STRING; return UNEXPECTED_SYMBOL; // printf("Unexpected symbol %s.\n", std::string(yytext, yyleng).c_str()); yyterminate();
%%
// [a-zA-Z_][a-zA-Z0-9_]* SET_STRING; return IDENTIFIER;
/*
QLOW_PARSER_LTYPE qlow_parser_lloc;
const char* qlow_parser_filename;
QLOW_PARSER_STYPE qlow_parser_lval;
int main() {
while (true) {
yylex();
auto& qpl = qlow_parser_lval;
if (qpl.token > 0 && qpl.token < 1000) {
printf("token %d\n", qpl.token);
}
else {
printf("string %s\n", qpl.string->c_str());
}
}
}
*/