diff options
author | arphaman <arphaman@gmail.com> | 2013-08-21 13:35:26 +0100 |
---|---|---|
committer | arphaman <arphaman@gmail.com> | 2013-08-21 13:35:26 +0100 |
commit | bd8bcb1fdd07e18515626f99e1803ea17d532133 (patch) | |
tree | 412ff45aa8eb9fec6f1fb2aaaeef733ffb003760 | |
parent | d347afbe0f819584ec68360c54e3b69a11b42e1b (diff) | |
download | flang-bd8bcb1fdd07e18515626f99e1803ea17d532133.tar.gz |
fixed number followed by defined operator bug
-rw-r--r-- | include/flang/Parse/Lexer.h | 3 | ||||
-rw-r--r-- | lib/Parse/Lexer.cpp | 23 | ||||
-rw-r--r-- | test/Lexer/numberConstants.f95 | 6 |
3 files changed, 29 insertions, 3 deletions
diff --git a/include/flang/Parse/Lexer.h b/include/flang/Parse/Lexer.h index e02b36d515..af0c01c2bb 100644 --- a/include/flang/Parse/Lexer.h +++ b/include/flang/Parse/Lexer.h @@ -157,6 +157,7 @@ class Lexer { char GetNextChar(); char PeekNextChar() const; + char PeekNextChar(int Offset) const; char PeekPrevChar() const; char GetCurrentChar() const; @@ -190,6 +191,8 @@ class Lexer { /// peekNextChar - Peek at the next character, but don't advance the buffer. char peekNextChar() const { return Text.PeekNextChar(); } + char peekNextChar(int Offset) const { return Text.PeekNextChar(Offset); } + /// peekPrevChar - Peek at the previous character. char peekPrevChar() const { return Text.PeekPrevChar(); } diff --git a/lib/Parse/Lexer.cpp b/lib/Parse/Lexer.cpp index 35767bf562..b702d62149 100644 --- a/lib/Parse/Lexer.cpp +++ b/lib/Parse/Lexer.cpp @@ -402,6 +402,21 @@ char Lexer::LineOfText::PeekNextChar() const { return Atom.data()[CurPtr + 1]; } +char Lexer::LineOfText::PeekNextChar(int Offset) const { + auto CurrentAtom = CurAtom; + auto Ptr = CurPtr; + while(Ptr + Offset >= Atoms[CurrentAtom].size() && Offset > 0) { + Offset -= (Atoms[CurrentAtom].size() - Ptr); + Ptr = 0; + ++CurrentAtom; + if(CurrentAtom >= Atoms.size()) + return '\0'; + } + StringRef Atom = Atoms[CurrentAtom]; + assert(!Atom.empty() && "Atom has no contents!"); + return Atom.data()[Ptr + Offset]; +} + char Lexer::LineOfText::PeekPrevChar() const { if (Atoms.empty()) return '\0'; StringRef Atom = Atoms[CurAtom]; @@ -1045,9 +1060,11 @@ void Lexer::LexNumericConstant(Token &Result) { PrevChar = '\0'; } else if(C == 'E' || C == 'e' || C == 'D' || C == 'd') { - getNextChar(); - IsReal = true; - IsExp = true; + if(!isLetter(peekNextChar(2))) { + getNextChar(); + IsReal = true; + IsExp = true; + } } else PrevChar = '\0'; } diff --git a/test/Lexer/numberConstants.f95 b/test/Lexer/numberConstants.f95 index af7774e48c..c899764d4d 100644 --- a/test/Lexer/numberConstants.f95 +++ b/test/Lexer/numberConstants.f95 @@ -20,6 +20,12 @@ PROGRAM constants if(1.LT.2) then end if + if(1.eq.2) then + end if + + if(1.ne.2) then + end if + X = 1e ! expected-error {{exponent has no digits}} Y = -2D- ! expected-error {{exponent has no digits}} END PROGRAM constants |