mirror of
https://github.com/yhirose/cpp-peglib.git
synced 2025-07-01 22:52:07 +00:00
Fixed number parsing problem.
This commit is contained in:
parent
d35c460cc1
commit
738fe53e39
45
peglib.h
45
peglib.h
@ -1757,12 +1757,9 @@ private:
|
|||||||
std::pair<char, int> parse_hex_number(const char* s, size_t n, size_t i) {
|
std::pair<char, int> parse_hex_number(const char* s, size_t n, size_t i) {
|
||||||
char ret = 0;
|
char ret = 0;
|
||||||
int val;
|
int val;
|
||||||
if (i < n && is_hex(s[i], val)) {
|
while (i < n && is_hex(s[i], val)) {
|
||||||
ret = n;
|
ret = ret * 16 + val;
|
||||||
if (i + 1 < n && is_hex(s[i + 1], val)) {
|
i++;
|
||||||
ret = ret * 16 + val;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return std::make_pair(ret, i);
|
return std::make_pair(ret, i);
|
||||||
}
|
}
|
||||||
@ -1770,16 +1767,9 @@ private:
|
|||||||
std::pair<char, int> parse_octal_number(const char* s, size_t n, size_t i) {
|
std::pair<char, int> parse_octal_number(const char* s, size_t n, size_t i) {
|
||||||
char ret = 0;
|
char ret = 0;
|
||||||
int val;
|
int val;
|
||||||
if (i < n && is_digit(s[i], val)) {
|
while (i < n && is_digit(s[i], val)) {
|
||||||
ret = n;
|
ret = ret * 8 + val;
|
||||||
if (i + 1 < n && is_digit(s[i + 1], val)) {
|
i++;
|
||||||
ret = ret * 8 + val;
|
|
||||||
i++;
|
|
||||||
if (i + 1 < n && is_digit(s[i + 1], val)) {
|
|
||||||
ret = ret * 8 + val;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return std::make_pair(ret, i);
|
return std::make_pair(ret, i);
|
||||||
}
|
}
|
||||||
@ -1788,31 +1778,34 @@ private:
|
|||||||
std::string r;
|
std::string r;
|
||||||
r.reserve(n);
|
r.reserve(n);
|
||||||
|
|
||||||
for (auto i = 0u; i < n; i++) {
|
auto i = 0u;
|
||||||
|
while (i < n) {
|
||||||
auto ch = s[i];
|
auto ch = s[i];
|
||||||
if (ch == '\\') {
|
if (ch == '\\') {
|
||||||
i++;
|
i++;
|
||||||
switch (s[i]) {
|
switch (s[i]) {
|
||||||
case 'n': r += '\n'; break;
|
case 'n': r += '\n'; i++; break;
|
||||||
case 'r': r += '\r'; break;
|
case 'r': r += '\r'; i++; break;
|
||||||
case 't': r += '\t'; break;
|
case 't': r += '\t'; i++; break;
|
||||||
case '\'': r += '\''; break;
|
case '\'': r += '\''; i++; break;
|
||||||
case '"': r += '"'; break;
|
case '"': r += '"'; i++; break;
|
||||||
case '[': r += '['; break;
|
case '[': r += '['; i++; break;
|
||||||
case ']': r += ']'; break;
|
case ']': r += ']'; i++; break;
|
||||||
case '\\': r += '\\'; break;
|
case '\\': r += '\\'; i++; break;
|
||||||
case 'x': {
|
case 'x': {
|
||||||
std::tie(ch, i) = parse_hex_number(s, n, i + 1);
|
std::tie(ch, i) = parse_hex_number(s, n, i + 1);
|
||||||
r += ch;
|
r += ch;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
std::tie(ch, i) = parse_octal_number(s, n, i + 1);
|
std::tie(ch, i) = parse_octal_number(s, n, i);
|
||||||
|
r += ch;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
r += ch;
|
r += ch;
|
||||||
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
|
@ -235,7 +235,7 @@ TEST_CASE("Backtracking test", "[general]")
|
|||||||
TEST_CASE("Octal/Hex value test", "[general]")
|
TEST_CASE("Octal/Hex value test", "[general]")
|
||||||
{
|
{
|
||||||
peglib::peg parser(
|
peglib::peg parser(
|
||||||
" ROOT <- '\132\x7a' "
|
R"( ROOT <- '\132\x7a' )"
|
||||||
);
|
);
|
||||||
|
|
||||||
auto ret = parser.parse("Zz");
|
auto ret = parser.parse("Zz");
|
||||||
|
Loading…
Reference in New Issue
Block a user