summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bnf/Makefile5
-rw-r--r--bnf/ast_types.hpp4
-rw-r--r--bnf/lex.hpp1
-rw-r--r--bnf/main.cpp1
-rw-r--r--bnf/rust.lex8
-rw-r--r--bnf/rust.y41
-rw-r--r--bnf/rust_tts.y.h11
7 files changed, 51 insertions, 20 deletions
diff --git a/bnf/Makefile b/bnf/Makefile
index e85e5fa4..90f726dc 100644
--- a/bnf/Makefile
+++ b/bnf/Makefile
@@ -4,9 +4,8 @@
OBJS := main.o rust.tab.o rust.lex.o
-#TSTFILES := ../samples/1.rs
-TSTFILES := ../../rust_os/rustc_src/libcore/lib.rs
-#TSTFILES := $(addprefix ../../rust_os/libcore/, lib.rs str/mod.rs str/pattern.rs borrow.rs any.rs array.rs result.rs)
+TSTFILES := ../samples/1.rs
+TSTFILES += ../../rust_os/rustc_src/libcore/lib.rs
diff --git a/bnf/ast_types.hpp b/bnf/ast_types.hpp
index 09896642..cef70bc5 100644
--- a/bnf/ast_types.hpp
+++ b/bnf/ast_types.hpp
@@ -234,6 +234,10 @@ public:
{}
};
+class TypeAlias:
+ public Item
+{
+};
class Enum:
public Item
diff --git a/bnf/lex.hpp b/bnf/lex.hpp
index 30d8a2a9..b9865552 100644
--- a/bnf/lex.hpp
+++ b/bnf/lex.hpp
@@ -28,6 +28,7 @@ struct ParserContext
extern int yylineno;
extern int yylex(YYSTYPE* lvalp, ParserContext& context);
+
extern void yyerror(ParserContext& context, const char *s);
extern int yydebug;
diff --git a/bnf/main.cpp b/bnf/main.cpp
index e2c4b3b4..f88eb21f 100644
--- a/bnf/main.cpp
+++ b/bnf/main.cpp
@@ -89,6 +89,7 @@ int main(int argc, char *argv[]) {
}
ParserContext new_context(filename);
+ yylineno = 1;
int rv = yyparse(new_context);
fclose(yyin);
if( rv != 0 ) {
diff --git a/bnf/rust.lex b/bnf/rust.lex
index 6155b4c4..f3214d0b 100644
--- a/bnf/rust.lex
+++ b/bnf/rust.lex
@@ -36,7 +36,8 @@ ident_c [a-zA-Z_]
%%
"//"[^/].*\n { }
-"///".*\n { /* TODO: Handle /// by desugaring */ }
+"///".*\n { lvalp->DOC_COMMENT = new ::std::string(yytext+1, strlen(yytext)-2); return DOC_COMMENT; }
+"//!".*\n { lvalp->SUPER_DOC_COMMENT = new ::std::string(yytext+1, strlen(yytext)-2); return SUPER_DOC_COMMENT; }
"/*" { handle_block_comment(); /* TODO: Handle doc comments */ }
\n /* */
\r /* */
@@ -90,6 +91,7 @@ ident_c [a-zA-Z_]
"-=" { return MINUSEQUAL; }
"*=" { return STAREQUAL; }
"/=" { return SLASHEQUAL; }
+"%=" { return PERCENTEQUAL; }
"&&" { return DOUBLEAMP; }
"||" { return DOUBLEPIPE; }
@@ -105,6 +107,7 @@ ident_c [a-zA-Z_]
"$" { return *yytext; }
"&" { return *yytext; }
"|" { return *yytext; }
+"^" { return *yytext; }
"!" { return *yytext; }
"." { return *yytext; }
":" { return *yytext; }
@@ -117,6 +120,7 @@ ident_c [a-zA-Z_]
">" { return *yytext; }
"," { return *yytext; }
"/" { return *yytext; }
+"%" { return *yytext; }
"*" { return *yytext; }
"+" { return *yytext; }
"-" { return *yytext; }
@@ -136,7 +140,7 @@ ident_c [a-zA-Z_]
{ident_c}({ident_c}|[0-9])*"!" { lvalp->MACRO = new ::std::string(yytext, 0, strlen(yytext)-1); return MACRO; }
'{ident_c}{ident_c}* { lvalp->LIFETIME = new ::std::string(yytext, 1); return LIFETIME; }
-b?'(.|\\['rn])' { lvalp->CHARLIT = yytext[0]; return CHARLIT; }
+b?'(.|\\'|\\[^']+)' { lvalp->CHARLIT = yytext[0]; return CHARLIT; }
\"([^"])*\" { lvalp->STRING = new ::std::string( parse_escaped_string(yytext) ); return STRING; }
. { fprintf(stderr, "\x1b[31m" "ERROR: %s:%d: Invalid character '%c'\x1b[0m\n", context.filename.c_str(), yylineno, *yytext); exit(1); }
diff --git a/bnf/rust.y b/bnf/rust.y
index 2607947a..4ee1d427 100644
--- a/bnf/rust.y
+++ b/bnf/rust.y
@@ -26,7 +26,7 @@
%token DOUBLECOLON THINARROW FATARROW DOUBLEDOT TRIPLEDOT
%token DOUBLEEQUAL EXCLAMEQUAL DOUBLEPIPE DOUBLEAMP
%token GTEQUAL LTEQUAL
-%token PLUSEQUAL MINUSEQUAL STAREQUAL SLASHEQUAL
+%token PLUSEQUAL MINUSEQUAL STAREQUAL SLASHEQUAL PERCENTEQUAL
%token DOUBLELT DOUBLEGT
%token RWD_mod RWD_fn RWD_const RWD_static RWD_use RWD_struct RWD_enum RWD_trait RWD_impl RWD_type
%token RWD_as RWD_in RWD_mut RWD_ref RWD_pub RWD_where RWD_unsafe
@@ -50,6 +50,7 @@
%type <Item*> item vis_item unsafe_item unsafe_vis_item
%type <UseSet*> use_def
+%type <TypeAlias*> type_def
%type <Module*> module_def
%type <Global*> static_def const_def
%type <Struct*> struct_def
@@ -176,6 +177,7 @@ item
/* Items for which visibility is valid */
vis_item
: RWD_mod module_def { $$ = $2; }
+ | RWD_type type_def { $$ = $2; }
| RWD_use use_def { $$ = $2; }
| RWD_static static_def { $$ = $2; }
| RWD_const const_def { $$ = $2; }
@@ -200,7 +202,7 @@ extern_items
| extern_items extern_item { $$ = $1; $$->push_back( box_raw($2) ); }
;
extern_item
- : opt_pub RWD_fn fn_def_hdr ';' { $$ = $3; if($1) $$->set_pub(); }
+ : attrs opt_pub RWD_fn fn_def_hdr ';' { $$ = $4; if($2) $$->set_pub(); $$->add_attrs( consume($1) ); }
;
module_def
@@ -250,6 +252,10 @@ fn_qualifiers
| RWD_unsafe RWD_const
;
+/* --- Type --- */
+type_def
+ : IDENT generic_def '=' type ';' { $$ = new TypeAlias(); };
+
/* --- Use --- */
use_def
: RWD_self use_def_tail { $$ = new UseSet( Path(Path::TagSelf()), consume($2) ); }
@@ -312,6 +318,7 @@ enum_variant_list: enum_variant | enum_variant_list ',' enum_variant;
enum_variant: attrs enum_variant_;
enum_variant_
: IDENT
+ | IDENT '=' expr
| IDENT '(' type_list ')'
| IDENT '{' struct_def_items '}'
;
@@ -325,6 +332,7 @@ trait_items: | trait_items attrs trait_item;
trait_item
: RWD_type IDENT ';'
| RWD_type IDENT ':' trait_bound_list ';'
+ | RWD_type IDENT '=' type ';'
| opt_unsafe fn_qualifiers RWD_fn fn_def_hdr_PROTO ';'
| opt_unsafe fn_qualifiers RWD_fn fn_def_hdr_PROTO code
;
@@ -333,6 +341,7 @@ trait_item
impl_def: impl_def_line '{' impl_items '}' { $$ = new Impl(); };
impl_def_line
: generic_def trait_path RWD_for type where_clause { bnf_trace("trait impl"); }
+ | generic_def '!' trait_path RWD_for type where_clause { bnf_trace("negative trait impl"); }
| generic_def trait_path RWD_for DOUBLEDOT where_clause { bnf_trace("wildcard impl"); }
| generic_def type where_clause { bnf_trace("inherent impl"); }
;
@@ -348,7 +357,7 @@ impl_item
generic_def : /* mt */ | '<' generic_def_list '>' { bnf_trace("generic_def_list"); };
generic_def_list : generic_def_one | generic_def_list ',' generic_def_one | ;
generic_def_one
- : IDENT '=' type ':' bounds
+ : IDENT ':' bounds '=' type
| IDENT '=' type
| IDENT ':' bounds { bnf_trace("bounded ident"); }
| IDENT
@@ -427,11 +436,14 @@ type
;
type_ele
: type_path
+ | RWD_fn '(' type_list ')'
| '_'
- | '&' type_ele
- | '&' LIFETIME type_ele
- | '&' RWD_mut type_ele
- | '&' LIFETIME RWD_mut type_ele
+ | '&' opt_lifetime type_ele
+ | DOUBLEAMP opt_lifetime type_ele
+/* | '&' LIFETIME type_ele */
+ | '&' opt_lifetime RWD_mut type_ele
+ | DOUBLEAMP opt_lifetime RWD_mut type_ele
+/* | '&' LIFETIME RWD_mut type_ele */
| '*' RWD_const type_ele
| '*' RWD_mut type_ele
| '[' type ']'
@@ -521,6 +533,7 @@ block_lines: | block_lines block_line;
block_line
: RWD_let let_binding ';'
| MACRO IDENT tt_brace
+ | super_attr
| attrs item
| expr_blocks
| stmt
@@ -545,7 +558,7 @@ struct_literal_list
;
expr_blocks
- : RWD_match expr_NOSTRLIT '{' match_arms opt_comma '}' { }
+ : RWD_match expr_NOSTRLIT '{' match_arms '}' { }
| RWD_if if_block
| RWD_unsafe '{' block_contents '}' { }
/* | flow_control */
@@ -568,10 +581,14 @@ if_block_head
: expr_NOSTRLIT code {}
| RWD_let pattern '=' expr_NOSTRLIT code {}
;
-match_arms
- : match_arm ',' match_arms
- | match_arm_brace match_arms
- | match_arm
+match_arms: match_arms_list match_arm_last;
+match_arms_list
+ :
+ | match_arms_list match_arm ','
+ | match_arms_list match_arm_brace
+ ;
+match_arm_last
+ : match_arm
| match_arm ','
;
match_pattern
diff --git a/bnf/rust_tts.y.h b/bnf/rust_tts.y.h
index 4a590f2b..9a1d1d26 100644
--- a/bnf/rust_tts.y.h
+++ b/bnf/rust_tts.y.h
@@ -1,7 +1,10 @@
#define _C(v) v { $$ = v; }
#define _T(v) v { $$ = v; }
tt_tok
- : _T(IDENT) | _T(STRING) | _T(CHARLIT) | _T(LIFETIME) | _T(INTEGER) | _T(MACRO) | _T(FLOAT)
+ : _T(IDENT) | _T(STRING) | _T(LIFETIME) | _T(MACRO)
+ | _T(DOC_COMMENT) | _T(SUPER_DOC_COMMENT)
+ | _T(CHARLIT) | _T(INTEGER)
+ | _T(FLOAT)
| _C(',') | _C(';') | _C('_')
| _T(RWD_self) | _T(RWD_super) | _T(RWD_mut) | _T(RWD_ref) | _T(RWD_let) | _T(RWD_where) | _T(RWD_pub) | _T(RWD_in) | _T(RWD_as)
| _T(RWD_for ) | _T(RWD_while) | _T(RWD_loop) | _T(RWD_if) | _T(RWD_else) | _T(RWD_match)
@@ -9,17 +12,19 @@ tt_tok
| _T(RWD_impl) | _T(RWD_struct) | _T(RWD_enum) | _T(RWD_fn) | _T(RWD_type) | _T(RWD_static) | _T(RWD_const) | _T(RWD_trait) | _T(RWD_use)
| _T(RWD_extern) | _T(RWD_unsafe)
| _C('/') | _T(SLASHEQUAL)
+ | _C('%') | _T(PERCENTEQUAL)
| _C('*') | _T(STAREQUAL)
| _C('+') | _T(PLUSEQUAL)
- | _C('-') | _T(THINARROW)
+ | _C('-') | _T(MINUSEQUAL) | _T(THINARROW)
| _C('!') | _T(EXCLAMEQUAL)
| _C('&') | _T(DOUBLEAMP)
| _C(':') | _T(DOUBLECOLON)
| _C('|') | _T(DOUBLEPIPE)
+ | _C('^')
| _C('=') | _T(DOUBLEEQUAL) | _T(FATARROW)
| _C('<') | _T(DOUBLELT) | _T(LTEQUAL)
| _C('>') | _T(DOUBLEGT) | _T(GTEQUAL)
| _C('.') | _T(DOUBLEDOT) | _T(TRIPLEDOT)
- | _C('$') | _C('#') | _C('@')
+ | _C('$') | _C('#') | _C('@') | _C('?')
;
#undef _