diff options
Diffstat (limited to '')
| -rw-r--r-- | src/yuescript/yue_parser.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/yuescript/yue_parser.cpp b/src/yuescript/yue_parser.cpp index b1f29a9..c8b974f 100644 --- a/src/yuescript/yue_parser.cpp +++ b/src/yuescript/yue_parser.cpp | |||
| @@ -532,17 +532,21 @@ YueParser::YueParser() { | |||
| 532 | return true; | 532 | return true; |
| 533 | }) >> (pl::user(Space >> export_default >> Exp, [](const item_t& item) { | 533 | }) >> (pl::user(Space >> export_default >> Exp, [](const item_t& item) { |
| 534 | State* st = reinterpret_cast<State*>(item.user_data); | 534 | State* st = reinterpret_cast<State*>(item.user_data); |
| 535 | bool isValid = !st->exportDefault && st->exportCount == 1; | 535 | if (st->exportDefault) { |
| 536 | throw ParserError("export default has already been declared", *item.begin, *item.end); | ||
| 537 | } | ||
| 538 | if (st->exportCount > 1) { | ||
| 539 | throw ParserError("there are items already been exported", *item.begin, *item.end); | ||
| 540 | } | ||
| 536 | st->exportDefault = true; | 541 | st->exportDefault = true; |
| 537 | return isValid; | 542 | return true; |
| 538 | }) | 543 | }) |
| 539 | | (not_(Space >> export_default) >> pl::user(true_(), [](const item_t& item) { | 544 | | (not_(Space >> export_default) >> pl::user(true_(), [](const item_t& item) { |
| 540 | State* st = reinterpret_cast<State*>(item.user_data); | 545 | State* st = reinterpret_cast<State*>(item.user_data); |
| 541 | if (st->exportDefault && st->exportCount > 1) { | 546 | if (st->exportDefault && st->exportCount > 1) { |
| 542 | return false; | 547 | throw ParserError("can not export more items when export default has been declared", *item.begin, *item.end); |
| 543 | } else { | ||
| 544 | return true; | ||
| 545 | } | 548 | } |
| 549 | return true; | ||
| 546 | }) >> ExpList >> -Assign) | 550 | }) >> ExpList >> -Assign) |
| 547 | | Space >> pl::user(Macro, [](const item_t& item) { | 551 | | Space >> pl::user(Macro, [](const item_t& item) { |
| 548 | State* st = reinterpret_cast<State*>(item.user_data); | 552 | State* st = reinterpret_cast<State*>(item.user_data); |
| @@ -631,7 +635,7 @@ YueParser::YueParser() { | |||
| 631 | ) | arg_table_block; | 635 | ) | arg_table_block; |
| 632 | 636 | ||
| 633 | leading_spaces_error = pl::user(+space_one >> expr('(') >> Exp >> +(sym(',') >> Exp) >> sym(')'), [](const item_t& item) { | 637 | leading_spaces_error = pl::user(+space_one >> expr('(') >> Exp >> +(sym(',') >> Exp) >> sym(')'), [](const item_t& item) { |
| 634 | throw ParserError("write invoke arguments in parentheses without leading spaces or leading spaces without parentheses", *item.begin, *item.end); | 638 | throw ParserError("write invoke arguments in parentheses without leading spaces or just leading spaces without parentheses", *item.begin, *item.end); |
| 635 | return false; | 639 | return false; |
| 636 | }); | 640 | }); |
| 637 | 641 | ||
| @@ -707,7 +711,7 @@ ParseInfo YueParser::parse(std::string_view codes, rule& r) { | |||
| 707 | res.codes = std::make_unique<input>(); | 711 | res.codes = std::make_unique<input>(); |
| 708 | *(res.codes) = _converter.from_bytes(&codes.front(), &codes.back() + 1); | 712 | *(res.codes) = _converter.from_bytes(&codes.front(), &codes.back() + 1); |
| 709 | } catch (const std::range_error&) { | 713 | } catch (const std::range_error&) { |
| 710 | res.error = "Invalid text encoding."sv; | 714 | res.error = "invalid text encoding"sv; |
| 711 | return res; | 715 | return res; |
| 712 | } | 716 | } |
| 713 | error_list errors; | 717 | error_list errors; |
