about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-11-07 17:26:12 -0800
committerbors <bors@rust-lang.org>2013-11-07 17:26:12 -0800
commitf00bb2ec0462cba7ad9be04db44a3b1255aaafc6 (patch)
treebde8b31ecfd8bfe9e0c2010ebdf63b4879c2bbda /src/libsyntax/parse
parenta0593e50456b53347101afe5343aac01c85da63a (diff)
parent6eba332d0e7d4915184c9952b73643b59db9c417 (diff)
downloadrust-f00bb2ec0462cba7ad9be04db44a3b1255aaafc6.tar.gz
rust-f00bb2ec0462cba7ad9be04db44a3b1255aaafc6.zip
auto merge of #10243 : mattcarberry/rust/master, r=brson
Associated with Issue #6563.

Useful for Apollo Guidance Computer simulation, Unix file system permissions, and maybe one or two other things.
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/lexer.rs13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/libsyntax/parse/lexer.rs b/src/libsyntax/parse/lexer.rs
index 49445312a12..06a2c557e42 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"),
           _ => ()