diff options
-rw-r--r-- | bnf/Makefile | 5 | ||||
-rw-r--r-- | bnf/ast_types.hpp | 4 | ||||
-rw-r--r-- | bnf/lex.hpp | 1 | ||||
-rw-r--r-- | bnf/main.cpp | 1 | ||||
-rw-r--r-- | bnf/rust.lex | 8 | ||||
-rw-r--r-- | bnf/rust.y | 41 | ||||
-rw-r--r-- | bnf/rust_tts.y.h | 11 |
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); } @@ -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 _ |