Enable locations.
This commit is contained in:
parent
e7367ef86e
commit
2f09401685
|
@ -17,7 +17,7 @@
|
||||||
#include "llvm/Target/TargetOptions.h"
|
#include "llvm/Target/TargetOptions.h"
|
||||||
#include "llvm/Target/TargetMachine.h"
|
#include "llvm/Target/TargetMachine.h"
|
||||||
|
|
||||||
void yy::parser::error(const std::string& msg) {
|
void yy::parser::error(const yy::location& loc, const std::string& msg) {
|
||||||
std::cout << "An error occured: " << msg << std::endl;
|
std::cout << "An error occured: " << msg << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
24
13/parser.y
24
13/parser.y
|
@ -39,6 +39,8 @@ extern yy::parser::symbol_type yylex();
|
||||||
%define api.value.type variant
|
%define api.value.type variant
|
||||||
%define api.token.constructor
|
%define api.token.constructor
|
||||||
|
|
||||||
|
%locations
|
||||||
|
|
||||||
%type <std::vector<std::string>> lowercaseParams
|
%type <std::vector<std::string>> lowercaseParams
|
||||||
%type <std::vector<branch_ptr>> branches
|
%type <std::vector<branch_ptr>> branches
|
||||||
%type <std::vector<constructor_ptr>> constructors
|
%type <std::vector<constructor_ptr>> constructors
|
||||||
|
@ -78,26 +80,26 @@ lowercaseParams
|
||||||
;
|
;
|
||||||
|
|
||||||
aAdd
|
aAdd
|
||||||
: aAdd PLUS aMul { $$ = ast_ptr(new ast_binop(PLUS, std::move($1), std::move($3))); }
|
: aAdd PLUS aMul { $$ = ast_ptr(new ast_binop(PLUS, std::move($1), std::move($3), @$)); }
|
||||||
| aAdd MINUS aMul { $$ = ast_ptr(new ast_binop(MINUS, std::move($1), std::move($3))); }
|
| aAdd MINUS aMul { $$ = ast_ptr(new ast_binop(MINUS, std::move($1), std::move($3), @$)); }
|
||||||
| aMul { $$ = std::move($1); }
|
| aMul { $$ = std::move($1); }
|
||||||
;
|
;
|
||||||
|
|
||||||
aMul
|
aMul
|
||||||
: aMul TIMES app { $$ = ast_ptr(new ast_binop(TIMES, std::move($1), std::move($3))); }
|
: aMul TIMES app { $$ = ast_ptr(new ast_binop(TIMES, std::move($1), std::move($3), @$)); }
|
||||||
| aMul DIVIDE app { $$ = ast_ptr(new ast_binop(DIVIDE, std::move($1), std::move($3))); }
|
| aMul DIVIDE app { $$ = ast_ptr(new ast_binop(DIVIDE, std::move($1), std::move($3), @$)); }
|
||||||
| app { $$ = std::move($1); }
|
| app { $$ = std::move($1); }
|
||||||
;
|
;
|
||||||
|
|
||||||
app
|
app
|
||||||
: app appBase { $$ = ast_ptr(new ast_app(std::move($1), std::move($2))); }
|
: app appBase { $$ = ast_ptr(new ast_app(std::move($1), std::move($2), @$)); }
|
||||||
| appBase { $$ = std::move($1); }
|
| appBase { $$ = std::move($1); }
|
||||||
;
|
;
|
||||||
|
|
||||||
appBase
|
appBase
|
||||||
: INT { $$ = ast_ptr(new ast_int($1)); }
|
: INT { $$ = ast_ptr(new ast_int($1, @$)); }
|
||||||
| LID { $$ = ast_ptr(new ast_lid(std::move($1))); }
|
| LID { $$ = ast_ptr(new ast_lid(std::move($1), @$)); }
|
||||||
| UID { $$ = ast_ptr(new ast_uid(std::move($1))); }
|
| UID { $$ = ast_ptr(new ast_uid(std::move($1), @$)); }
|
||||||
| OPAREN aAdd CPAREN { $$ = std::move($2); }
|
| OPAREN aAdd CPAREN { $$ = std::move($2); }
|
||||||
| case { $$ = std::move($1); }
|
| case { $$ = std::move($1); }
|
||||||
| let { $$ = std::move($1); }
|
| let { $$ = std::move($1); }
|
||||||
|
@ -106,17 +108,17 @@ appBase
|
||||||
|
|
||||||
let
|
let
|
||||||
: LET OCURLY definitions CCURLY IN OCURLY aAdd CCURLY
|
: LET OCURLY definitions CCURLY IN OCURLY aAdd CCURLY
|
||||||
{ $$ = ast_ptr(new ast_let(std::move($3), std::move($7))); }
|
{ $$ = ast_ptr(new ast_let(std::move($3), std::move($7), @$)); }
|
||||||
;
|
;
|
||||||
|
|
||||||
lambda
|
lambda
|
||||||
: BACKSLASH lowercaseParams ARROW OCURLY aAdd CCURLY
|
: BACKSLASH lowercaseParams ARROW OCURLY aAdd CCURLY
|
||||||
{ $$ = ast_ptr(new ast_lambda(std::move($2), std::move($5))); }
|
{ $$ = ast_ptr(new ast_lambda(std::move($2), std::move($5), @$)); }
|
||||||
;
|
;
|
||||||
|
|
||||||
case
|
case
|
||||||
: CASE aAdd OF OCURLY branches CCURLY
|
: CASE aAdd OF OCURLY branches CCURLY
|
||||||
{ $$ = ast_ptr(new ast_case(std::move($2), std::move($5))); }
|
{ $$ = ast_ptr(new ast_case(std::move($2), std::move($5), @$)); }
|
||||||
;
|
;
|
||||||
|
|
||||||
branches
|
branches
|
||||||
|
|
49
13/scanner.l
49
13/scanner.l
|
@ -6,33 +6,38 @@
|
||||||
#include "definition.hpp"
|
#include "definition.hpp"
|
||||||
#include "parser.hpp"
|
#include "parser.hpp"
|
||||||
|
|
||||||
|
yy::parser::location_type location;
|
||||||
|
|
||||||
#define YY_DECL yy::parser::symbol_type yylex()
|
#define YY_DECL yy::parser::symbol_type yylex()
|
||||||
|
#define YY_USER_ACTION location.step(); location.columns(yyleng);
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
[ \n]+ {}
|
\n { location.lines(); }
|
||||||
\\ { return yy::parser::make_BACKSLASH(); }
|
[ ]+ {}
|
||||||
\+ { return yy::parser::make_PLUS(); }
|
\\ { return yy::parser::make_BACKSLASH(location); }
|
||||||
\* { return yy::parser::make_TIMES(); }
|
\+ { return yy::parser::make_PLUS(location); }
|
||||||
- { return yy::parser::make_MINUS(); }
|
\* { return yy::parser::make_TIMES(location); }
|
||||||
\/ { return yy::parser::make_DIVIDE(); }
|
- { return yy::parser::make_MINUS(location); }
|
||||||
[0-9]+ { return yy::parser::make_INT(atoi(yytext)); }
|
\/ { return yy::parser::make_DIVIDE(location); }
|
||||||
defn { return yy::parser::make_DEFN(); }
|
[0-9]+ { return yy::parser::make_INT(atoi(yytext), location); }
|
||||||
data { return yy::parser::make_DATA(); }
|
defn { return yy::parser::make_DEFN(location); }
|
||||||
case { return yy::parser::make_CASE(); }
|
data { return yy::parser::make_DATA(location); }
|
||||||
of { return yy::parser::make_OF(); }
|
case { return yy::parser::make_CASE(location); }
|
||||||
let { return yy::parser::make_LET(); }
|
of { return yy::parser::make_OF(location); }
|
||||||
in { return yy::parser::make_IN(); }
|
let { return yy::parser::make_LET(location); }
|
||||||
\{ { return yy::parser::make_OCURLY(); }
|
in { return yy::parser::make_IN(location); }
|
||||||
\} { return yy::parser::make_CCURLY(); }
|
\{ { return yy::parser::make_OCURLY(location); }
|
||||||
\( { return yy::parser::make_OPAREN(); }
|
\} { return yy::parser::make_CCURLY(location); }
|
||||||
\) { return yy::parser::make_CPAREN(); }
|
\( { return yy::parser::make_OPAREN(location); }
|
||||||
, { return yy::parser::make_COMMA(); }
|
\) { return yy::parser::make_CPAREN(location); }
|
||||||
-> { return yy::parser::make_ARROW(); }
|
, { return yy::parser::make_COMMA(location); }
|
||||||
= { return yy::parser::make_EQUAL(); }
|
-> { return yy::parser::make_ARROW(location); }
|
||||||
[a-z][a-zA-Z]* { return yy::parser::make_LID(std::string(yytext)); }
|
= { return yy::parser::make_EQUAL(location); }
|
||||||
[A-Z][a-zA-Z]* { return yy::parser::make_UID(std::string(yytext)); }
|
[a-z][a-zA-Z]* { return yy::parser::make_LID(std::string(yytext), location); }
|
||||||
|
[A-Z][a-zA-Z]* { return yy::parser::make_UID(std::string(yytext), location); }
|
||||||
|
<<EOF>> { return yy::parser::make_YYEOF(location); }
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
Loading…
Reference in New Issue
Block a user