FrozenGene/LLVMPascalCompiler — pull request #4 by jianxinzhou (2014-10-02 08:07:05+00:00)
Title: fix XDigit

蓝色巨巨我又来啦。

我在你的测试文件中添加了以下两行：
12..45
$zhello

原程序的输出为：
Token Error:scanner_test.pas:65:3:Fraction number can not have dot after dot
scanner_test.pas:65:1: real: 12..45 -1
scanner_test.pas:66:1: identifier: $ -1
scanner_test.pas:66:2: identifier: zhello -1

我认为此处是有问题的。首先 12..45 与 $z 的类型应该是UNKNOWN，并且我查阅了你所给的 pascal 标准（6.1.3），$ 并不属于 identifier 。

我觉得 bug 主要是因为这句代码：currentChar_ == '$' && std::isxdigit(peekChar())，因为只有确实是16进制数时才会进入NUMBER状态，那么在 handleXDigit() 中的错误处理其实根本就是无效的。（如果$后面跟的字符非法，实际上在 getNextToken 函数中就进入 OPERATION 状态了）。

因此有了我以下的修改，针对之前添加的测试用例，程序运行后输出为：
Token Error:scanner_test.pas:65:3:Fraction number can not have dot after dot
scanner_test.pas:65:1: unknown: 12..45 -1
Token Error:scanner_test.pas:66:2:Hexadecimal number format error.
scanner_test.pas:66:1: unknown: z -1
scanner_test.pas:66:3: identifier: hello -1

ps:
340行：makeToken(TokenType::UNKNOWN, TokenValue::UNRESERVED, loc_, 0.0, buffer_);
第四个参数我写0.0是任取的，因为尽然都已经出错了，应该就不用关心其具体的值了吧

pps：
418行 std::transform(buffer_.begin(), buffer_.end(), buffer_.begin(), tolower);
我把 tolower 前的 std 去掉是因为 g++ 编译器只有去掉 std 才能通过编译（可能是g++的bug吧，我也不是很清楚）