about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMatt Carberry <carberry.matt@gmail.com>2013-11-02 21:26:29 -0700
committerMatt Carberry <carberry.matt@gmail.com>2013-11-02 21:26:29 -0700
commit519b86b8a810e12fe4247c56ffb894579c6b22e7 (patch)
tree837c99dc2a3ca5afffe7371fb0059c2aa445bdb3 /src
parente0c01ca15383513eb2981b6ee532c33ea546b4a8 (diff)
downloadrust-519b86b8a810e12fe4247c56ffb894579c6b22e7.tar.gz
rust-519b86b8a810e12fe4247c56ffb894579c6b22e7.zip
Added octal literal support.
Diffstat (limited to 'src')
-rw-r--r--src/etc/gedit/share/gtksourceview-3.0/language-specs/rust.lang5
-rw-r--r--src/etc/kate/rust.xml1
-rw-r--r--src/etc/vim/syntax/rust.vim6
-rw-r--r--src/libsyntax/parse/lexer.rs13
-rw-r--r--src/test/compile-fail/no-oct-float-literal.rs17
5 files changed, 41 insertions, 1 deletions
diff --git a/src/etc/gedit/share/gtksourceview-3.0/language-specs/rust.lang b/src/etc/gedit/share/gtksourceview-3.0/language-specs/rust.lang
index 1c1bb0a0012..b8841ebe568 100644
--- a/src/etc/gedit/share/gtksourceview-3.0/language-specs/rust.lang
+++ b/src/etc/gedit/share/gtksourceview-3.0/language-specs/rust.lang
@@ -224,6 +224,10 @@
       [0-9a-fA-F]
     </define-regex>
 
+    <define-regex id="oct_digit" extended="true">
+      [0-7]
+    </define-regex>
+
     <context id="number" style-ref="number">
       <match extended="true">
         ((?&lt;=\.\.)|(?&lt;![\w\.]))
@@ -231,6 +235,7 @@
         [1-9][0-9_]*\%{num_suffix}?|
         0[0-9_]*\%{num_suffix}?|
         0b[01_]+\%{int_suffix}?|
+        0o(\%{oct_digit}|_)+\%{int_suffix}?|
         0x(\%{hex_digit}|_)+\%{int_suffix}?
         )
         ((?![\w\.].)|(?=\.\.))
diff --git a/src/etc/kate/rust.xml b/src/etc/kate/rust.xml
index 17e3e06db35..5efd393fc35 100644
--- a/src/etc/kate/rust.xml
+++ b/src/etc/kate/rust.xml
@@ -199,6 +199,7 @@
 			<Detect2Chars char="/" char1="/" attribute="Comment" context="Commentar 1"/>
 			<Detect2Chars char="/" char1="*" attribute="Comment" context="Commentar 2" beginRegion="Comment"/>
 			<RegExpr String="0x[0-9a-fA-F_]+&rustIntSuf;" attribute="Number" context="#stay"/>
+			<RegExpr String="0o[0-7_]+&rustIntSuf;" attribute="Number" context="#stay"/>
 			<RegExpr String="0b[0-1_]+&rustIntSuf;" attribute="Number" context="#stay"/>
 			<RegExpr String="[0-9][0-9_]*\.[0-9_]*([eE][+-]?[0-9_]+)?(f32|f64|f)?" attribute="Number" context="#stay"/>
 			<RegExpr String="[0-9][0-9_]*&rustIntSuf;" attribute="Number" context="#stay"/>
diff --git a/src/etc/vim/syntax/rust.vim b/src/etc/vim/syntax/rust.vim
index a0a239284ce..abac8a32d78 100644
--- a/src/etc/vim/syntax/rust.vim
+++ b/src/etc/vim/syntax/rust.vim
@@ -160,7 +160,10 @@ syn match     rustNumber      display "\<[0-9][0-9_]*\(i\|i8\|i16\|i32\|i64\)\>"
 
 syn match     rustHexNumber   display "\<0x[a-fA-F0-9_]\+\>"
 syn match     rustHexNumber   display "\<0x[a-fA-F0-9_]\+\(u\|u8\|u16\|u32\|u64\)\>"
-syn match     rustHexNumber   display "\<0x[a-fA-F0-9_]\+\(i8\|i16\|i32\|i64\)\>"
+syn match     rustHexNumber   display "\<0x[0-9_]\+\(i8\|i16\|i32\|i64\)\>"
+syn match     rustOctNumber   display "\<0o[0-7_]\+\>"
+syn match     rustOctNumber   display "\<0o[0-7_]\+\(u\|u8\|u16\|u32\|u64\)\>"
+syn match     rustOctNumber   display "\<0o[0-7_]\+\(i8\|i16\|i32\|i64\)\>"
 syn match     rustBinNumber   display "\<0b[01_]\+\>"
 syn match     rustBinNumber   display "\<0b[01_]\+\(u\|u8\|u16\|u32\|u64\)\>"
 syn match     rustBinNumber   display "\<0b[01_]\+\(i8\|i16\|i32\|i64\)\>"
@@ -198,6 +201,7 @@ syn region rustFoldBraces start="{" end="}" transparent fold
 
 " Default highlighting {{{1
 hi def link rustHexNumber       rustNumber
+hi def link rustOctNumber       rustNumber
 hi def link rustBinNumber       rustNumber
 hi def link rustIdentifierPrime rustIdentifier
 hi def link rustTrait           rustType
diff --git a/src/libsyntax/parse/lexer.rs b/src/libsyntax/parse/lexer.rs
index 7ac999c46a4..f75b17adeed 100644
--- a/src/libsyntax/parse/lexer.rs
+++ b/src/libsyntax/parse/lexer.rs
@@ -276,6 +276,11 @@ fn hex_digit_val(c: char) -> int {
     fail!();
 }
 
+fn oct_digit_val(c: char) -> int {
+    if in_range(c, '0', '7') { return (c as int) - ('0' as int); }
+    fail!();
+}
+
 fn bin_digit_value(c: char) -> int { if c == '0' { return 0; } return 1; }
 
 pub fn is_whitespace(c: char) -> bool {
@@ -293,6 +298,8 @@ fn is_hex_digit(c: char) -> bool {
             in_range(c, 'A', 'F');
 }
 
+fn is_oct_digit(c: char) -> bool { return in_range(c, '0', '7'); }
+
 fn is_bin_digit(c: char) -> bool { return c == '0' || c == '1'; }
 
 // EFFECT: eats whitespace and comments.
@@ -464,6 +471,10 @@ fn scan_number(c: char, rdr: @mut StringReader) -> token::Token {
         bump(rdr);
         bump(rdr);
         base = 16u;
+    } else if c == '0' && n == 'o' {
+        bump(rdr);
+        bump(rdr);
+        base = 8u;
     } else if c == '0' && n == 'b' {
         bump(rdr);
         bump(rdr);
@@ -529,6 +540,8 @@ fn scan_number(c: char, rdr: @mut StringReader) -> token::Token {
         match base {
           16u => fatal_span(rdr, start_bpos, rdr.last_pos,
                             ~"hexadecimal float literal is not supported"),
+          8u => fatal_span(rdr, start_bpos, rdr.last_pos,
+                           ~"octal float literal is not supported"),
           2u => fatal_span(rdr, start_bpos, rdr.last_pos,
                            ~"binary float literal is not supported"),
           _ => ()
diff --git a/src/test/compile-fail/no-oct-float-literal.rs b/src/test/compile-fail/no-oct-float-literal.rs
new file mode 100644
index 00000000000..511116b1c55
--- /dev/null
+++ b/src/test/compile-fail/no-oct-float-literal.rs
@@ -0,0 +1,17 @@
+// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// error-pattern:octal float literal is not supported
+
+fn main() {
+    0o123f64;
+    0o123.456;
+    0o123p4f;
+}