summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorSimonas Kazlauskas <git@kazlauskas.me>2015-10-27 22:05:23 +0200
committerSimonas Kazlauskas <git@kazlauskas.me>2015-10-27 23:06:37 +0200
commit99f9bb16ab83519d67deaf4ca8a78feeba67fb53 (patch)
tree398f1f119503f98e6d69a0a4f72793c0125465d6 /src
parentc1a238c4f53145a2fe3820d869cbdaa26a128307 (diff)
downloadrust-99f9bb16ab83519d67deaf4ca8a78feeba67fb53.tar.gz
rust-99f9bb16ab83519d67deaf4ca8a78feeba67fb53.zip
Adjust src/grammar for the introduced <- op
Diffstat (limited to 'src')
-rw-r--r--src/grammar/RustLexer.g44
-rw-r--r--src/grammar/lexer.l1
-rw-r--r--src/grammar/parser-lalr.y9
-rw-r--r--src/grammar/verify.rs4
4 files changed, 14 insertions, 4 deletions
diff --git a/src/grammar/RustLexer.g4 b/src/grammar/RustLexer.g4
index 5c13295451c..a63fc59e50b 100644
--- a/src/grammar/RustLexer.g4
+++ b/src/grammar/RustLexer.g4
@@ -10,7 +10,7 @@ lexer grammar RustLexer;
 tokens {
     EQ, LT, LE, EQEQ, NE, GE, GT, ANDAND, OROR, NOT, TILDE, PLUS,
     MINUS, STAR, SLASH, PERCENT, CARET, AND, OR, SHL, SHR, BINOP,
-    BINOPEQ, AT, DOT, DOTDOT, DOTDOTDOT, COMMA, SEMI, COLON,
+    BINOPEQ, LARROW, AT, DOT, DOTDOT, DOTDOTDOT, COMMA, SEMI, COLON,
     MOD_SEP, RARROW, FAT_ARROW, LPAREN, RPAREN, LBRACKET, RBRACKET,
     LBRACE, RBRACE, POUND, DOLLAR, UNDERSCORE, LIT_CHAR, LIT_BYTE,
     LIT_INTEGER, LIT_FLOAT, LIT_STR, LIT_STR_RAW, LIT_BYTE_STR,
@@ -44,6 +44,7 @@ AND     : '&' ;
 OR      : '|' ;
 SHL     : '<<' ;
 SHR     : '>>' ;
+LARROW  : '<-' ;
 
 BINOP
     : PLUS
@@ -56,6 +57,7 @@ BINOP
     | OR
     | SHL
     | SHR
+    | LARROW
     ;
 
 BINOPEQ : BINOP EQ ;
diff --git a/src/grammar/lexer.l b/src/grammar/lexer.l
index dd7b1c74de7..77737c99496 100644
--- a/src/grammar/lexer.l
+++ b/src/grammar/lexer.l
@@ -317,6 +317,7 @@ r/#             {
 <str>\\[^n\nrt\\\x27\x220]  { return -1; }
 <str>(.|\n)                 { yymore(); }
 
+\<-  { return LARROW; }
 -\>  { return RARROW; }
 -    { return '-'; }
 -=   { return MINUSEQ; }
diff --git a/src/grammar/parser-lalr.y b/src/grammar/parser-lalr.y
index 75d9d28242f..b310b2b3351 100644
--- a/src/grammar/parser-lalr.y
+++ b/src/grammar/parser-lalr.y
@@ -45,6 +45,7 @@ extern char *yytext;
 %token DOTDOTDOT
 %token MOD_SEP
 %token RARROW
+%token LARROW
 %token FAT_ARROW
 %token LIT_BYTE
 %token LIT_CHAR
@@ -167,7 +168,8 @@ extern char *yytext;
 // prefix_exprs
 %precedence RETURN
 
-%left '=' SHLEQ SHREQ MINUSEQ ANDEQ OREQ PLUSEQ STAREQ SLASHEQ CARETEQ PERCENTEQ
+%right '=' SHLEQ SHREQ MINUSEQ ANDEQ OREQ PLUSEQ STAREQ SLASHEQ CARETEQ PERCENTEQ
+%right LARROW
 %left OROR
 %left ANDAND
 %left EQEQ NE
@@ -1316,6 +1318,7 @@ nonblock_expr
 | RETURN expr                                                   { $$ = mk_node("ExprRet", 1, $2); }
 | BREAK                                                         { $$ = mk_node("ExprBreak", 0); }
 | BREAK lifetime                                                { $$ = mk_node("ExprBreak", 1, $2); }
+| nonblock_expr LARROW expr                                     { $$ = mk_node("ExprInPlace", 2, $1, $3); }
 | nonblock_expr '=' expr                                        { $$ = mk_node("ExprAssign", 2, $1, $3); }
 | nonblock_expr SHLEQ expr                                      { $$ = mk_node("ExprAssignShl", 2, $1, $3); }
 | nonblock_expr SHREQ expr                                      { $$ = mk_node("ExprAssignShr", 2, $1, $3); }
@@ -1375,6 +1378,7 @@ expr
 | RETURN expr                                         { $$ = mk_node("ExprRet", 1, $2); }
 | BREAK                                               { $$ = mk_node("ExprBreak", 0); }
 | BREAK ident                                         { $$ = mk_node("ExprBreak", 1, $2); }
+| expr LARROW expr                                    { $$ = mk_node("ExprInPlace", 2, $1, $3); }
 | expr '=' expr                                       { $$ = mk_node("ExprAssign", 2, $1, $3); }
 | expr SHLEQ expr                                     { $$ = mk_node("ExprAssignShl", 2, $1, $3); }
 | expr SHREQ expr                                     { $$ = mk_node("ExprAssignShr", 2, $1, $3); }
@@ -1435,6 +1439,7 @@ nonparen_expr
 | RETURN expr                                         { $$ = mk_node("ExprRet", 1, $2); }
 | BREAK                                               { $$ = mk_node("ExprBreak", 0); }
 | BREAK ident                                         { $$ = mk_node("ExprBreak", 1, $2); }
+| nonparen_expr LARROW nonparen_expr                  { $$ = mk_node("ExprInPlace", 2, $1, $3); }
 | nonparen_expr '=' nonparen_expr                     { $$ = mk_node("ExprAssign", 2, $1, $3); }
 | nonparen_expr SHLEQ nonparen_expr                   { $$ = mk_node("ExprAssignShl", 2, $1, $3); }
 | nonparen_expr SHREQ nonparen_expr                   { $$ = mk_node("ExprAssignShr", 2, $1, $3); }
@@ -1495,6 +1500,7 @@ expr_nostruct
 | RETURN expr                                         { $$ = mk_node("ExprRet", 1, $2); }
 | BREAK                                               { $$ = mk_node("ExprBreak", 0); }
 | BREAK ident                                         { $$ = mk_node("ExprBreak", 1, $2); }
+| expr_nostruct LARROW expr_nostruct                  { $$ = mk_node("ExprInPlace", 2, $1, $3); }
 | expr_nostruct '=' expr_nostruct                     { $$ = mk_node("ExprAssign", 2, $1, $3); }
 | expr_nostruct SHLEQ expr_nostruct                   { $$ = mk_node("ExprAssignShl", 2, $1, $3); }
 | expr_nostruct SHREQ expr_nostruct                   { $$ = mk_node("ExprAssignShr", 2, $1, $3); }
@@ -1794,6 +1800,7 @@ unpaired_token
 | GE                         { $$ = mk_atom(yytext); }
 | ANDAND                     { $$ = mk_atom(yytext); }
 | OROR                       { $$ = mk_atom(yytext); }
+| LARROW                     { $$ = mk_atom(yytext); }
 | SHLEQ                      { $$ = mk_atom(yytext); }
 | SHREQ                      { $$ = mk_atom(yytext); }
 | MINUSEQ                    { $$ = mk_atom(yytext); }
diff --git a/src/grammar/verify.rs b/src/grammar/verify.rs
index b7714a7e3c5..fe9c5aaee4c 100644
--- a/src/grammar/verify.rs
+++ b/src/grammar/verify.rs
@@ -35,7 +35,7 @@ use syntax::parse::lexer::TokenAndSpan;
 
 fn parse_token_list(file: &str) -> HashMap<String, token::Token> {
     fn id() -> token::Token {
-        token::Ident(ast::Ident::with_empty_ctxt(Name(0))), token::Plain)
+        token::Ident(ast::Ident::with_empty_ctxt(Name(0)), token::Plain)
     }
 
     let mut res = HashMap::new();
@@ -208,7 +208,7 @@ fn parse_antlr_token(s: &str, tokens: &HashMap<String, token::Token>, surrogate_
         token::Literal(token::ByteStr(..), n)    => token::Literal(token::ByteStr(nm), n),
         token::Literal(token::ByteStrRaw(..), n) => token::Literal(token::ByteStrRaw(fix(content),
                                                                                 count(content)), n),
-        token::Ident(..)           => token::Ident(ast::Ident::with_empty_ctxt(nm)),
+        token::Ident(..)           => token::Ident(ast::Ident::with_empty_ctxt(nm),
                                                    token::ModName),
         token::Lifetime(..)        => token::Lifetime(ast::Ident::with_empty_ctxt(nm)),
         ref t => t.clone()