| | 346 | |
|---|
| | 347 | |
|---|
| | 348 | |
|---|
| | 349 | /************************************************ |
|---|
| | 350 | Uniform term to prevent needing to know the |
|---|
| | 351 | exact type at compile time. |
|---|
| | 352 | */ |
|---|
| | 353 | interface PInterfaceLeftFactor(T) { PObject InsertLeft(T,PObject); } |
|---|
| | 354 | |
|---|
| | 355 | /************************************************ |
|---|
| | 356 | PObject that uses T.Action!(str) to process a |
|---|
| | 357 | left side term with a Right side term |
|---|
| | 358 | */ |
|---|
| | 359 | class PObjectLeftFactorT(T, int i, char[] str) : PObjectVector!(i), PInterfaceLeftFactor!(T) |
|---|
| | 360 | { |
|---|
| | 361 | this(PObject[i] d){super(d);} |
|---|
| | 362 | |
|---|
| | 363 | PObject InsertLeft(T that, PObject L) |
|---|
| | 364 | { |
|---|
| | 365 | PObject[i+1] args; |
|---|
| | 366 | |
|---|
| | 367 | args[1..$] = Get; |
|---|
| | 368 | args[0] = L; |
|---|
| | 369 | |
|---|
| | 370 | return that.Action!(str)(args); |
|---|
| | 371 | } |
|---|
| | 372 | } |
|---|
| | 373 | |
|---|
| | 374 | |
|---|
| 355 | | } |
|---|
| | 431 | debug(dParse_runtime) void mark(); |
|---|
| | 432 | } |
|---|
| | 433 | |
|---|
| | 434 | |
|---|
| | 435 | /****************************************************************************** |
|---|
| | 436 | ******** genaric Template code |
|---|
| | 437 | ******************************************************************************/ |
|---|
| | 438 | |
|---|
| | 439 | |
|---|
| | 440 | /** generate a tuple of i U's |
|---|
| | 441 | */ |
|---|
| | 442 | template Tupleof(uint i, U) |
|---|
| | 443 | { |
|---|
| | 444 | static if(i == 0) |
|---|
| | 445 | alias T!() Tupleof; |
|---|
| | 446 | else |
|---|
| | 447 | static if(i == 1) |
|---|
| | 448 | alias T!(U) Tupleof; |
|---|
| | 449 | else |
|---|
| | 450 | alias T!(Tupleof!(i-1, U), U) Tupleof; |
|---|
| | 451 | } |
|---|
| | 452 | |
|---|
| | 453 | /** Tuple literal template |
|---|
| | 454 | */ |
|---|
| | 455 | template T(A...){alias A T;} |
|---|
| | 456 | |
|---|
| | 457 | |
|---|
| | 458 | /****************************************************************************** |
|---|
| | 459 | ******** CTFE functions |
|---|
| | 460 | ******************************************************************************/ |
|---|
| | 554 | /********************************* |
|---|
| | 555 | Extract # from "$(C,#,NAME)" |
|---|
| | 556 | */ |
|---|
| | 557 | int ExtractCount(char[] str) |
|---|
| | 558 | { |
|---|
| | 559 | int ret = int.min; |
|---|
| | 560 | |
|---|
| | 561 | if(str.length > 4 && '0' <= str[0] && str[0] <= '9') |
|---|
| | 562 | { |
|---|
| | 563 | ret = str[0] - '0'; |
|---|
| | 564 | for(int i = 1; i<str.length; i++) |
|---|
| | 565 | { |
|---|
| | 566 | if('0' <= str[i] && str[i] <= '9') |
|---|
| | 567 | { |
|---|
| | 568 | ret *= 10; |
|---|
| | 569 | ret += str[i] - '0'; |
|---|
| | 570 | } |
|---|
| | 571 | else |
|---|
| | 572 | break; |
|---|
| | 573 | } |
|---|
| | 574 | } |
|---|
| | 575 | |
|---|
| | 576 | return ret; |
|---|
| | 577 | } |
|---|
| | 578 | |
|---|
| | 579 | /********************************* |
|---|
| | 580 | Extract NAME from "$(C,#,NAME)" |
|---|
| | 581 | */ |
|---|
| | 582 | char[] ExtractAct(char[] str) |
|---|
| | 583 | { |
|---|
| | 584 | int c, i; |
|---|
| | 585 | for(i=0; i < str.length && c < 2; i++) |
|---|
| | 586 | c += (str[i] == ','); |
|---|
| | 587 | |
|---|
| | 588 | str = str[i..$]; |
|---|
| | 589 | i=0; |
|---|
| | 590 | while(i < str.length && str[i] != ')') i++; |
|---|
| | 591 | |
|---|
| | 592 | return str[0..i]; |
|---|
| | 593 | } |
|---|
| | 594 | |
|---|
| | 595 | /****************************************************************************** |
|---|
| | 596 | ******* Special Action Code |
|---|
| | 597 | ******************************************************************************/ |
|---|
| | 598 | |
|---|
| | 599 | /// Pack up stuff in a computed type of PObjectLeftFactorT Object |
|---|
| | 600 | PObject L_Action(T, char[] str ) (T, PObject[ExtractCount(str[4..$])] i) |
|---|
| | 601 | { |
|---|
| | 602 | static const int c = ExtractCount(str[4..$]); |
|---|
| | 603 | static const char[] n = ExtractAct(str); |
|---|
| | 604 | static if(false) pragma(msg, str~" == $(L,"~c.stringof~","~n~")"); |
|---|
| | 605 | |
|---|
| | 606 | return new PObjectLeftFactorT!(T, c, n)(i); |
|---|
| | 607 | } |
|---|
| | 608 | |
|---|
| | 609 | /// Left Process a Leftmost term and right side terms list. |
|---|
| | 610 | PObject T_Action(T,char[] str) (T that, PObject[1+ExtractCount(str[4..$])] i) |
|---|
| | 611 | { |
|---|
| | 612 | static const int num = ExtractCount(str[4..$]); |
|---|
| | 613 | static const char[] act = ExtractAct(str); |
|---|
| | 614 | static if(false) pragma(msg, str~" == $(T,"~num.stringof~","~act~")"); |
|---|
| | 615 | |
|---|
| | 616 | PObject[num] args = i[0..num]; |
|---|
| | 617 | auto ret = that.Action!(act)(args); |
|---|
| | 618 | |
|---|
| | 619 | auto listO = cast(PObjectList!(PObject)) i[num]; |
|---|
| | 620 | auto list = listO.get; |
|---|
| | 621 | |
|---|
| | 622 | foreach(obj; list) |
|---|
| | 623 | { |
|---|
| | 624 | auto Tobj = cast(PInterfaceLeftFactor!(T))obj; |
|---|
| | 625 | ret = Tobj.InsertLeft(that,ret); |
|---|
| | 626 | } |
|---|
| | 627 | return ret; |
|---|
| | 628 | } |
|---|
| | 629 | |
|---|
| | 630 | template SpecialAction(T,char[] str) |
|---|
| | 631 | { |
|---|
| | 632 | static if(str.length > 3 && str[0..2] == "$(") |
|---|
| | 633 | { |
|---|
| | 634 | static if(str[2] == 'T') |
|---|
| | 635 | alias T_Action!(T,str) SpecialAction; |
|---|
| | 636 | else static if(str[2] == 'L') |
|---|
| | 637 | alias L_Action!(T,str) SpecialAction; |
|---|
| | 638 | else |
|---|
| | 639 | static assert (false, "unknown special action: "~str); |
|---|
| | 640 | } |
|---|
| | 641 | else |
|---|
| | 642 | static assert (false, "unknown special action: "~str); |
|---|
| | 643 | } |
|---|
| | 644 | |
|---|
| | 645 | /****************************************************************************** |
|---|
| | 646 | ******* Parser |
|---|
| | 647 | ******************************************************************************/ |
|---|
| | 648 | |
|---|
| | 649 | |
|---|
| | 676 | } |
|---|
| | 677 | |
|---|
| | 678 | |
|---|
| | 679 | /************************************************ |
|---|
| | 680 | Parse an Sepcial action name name |
|---|
| | 681 | '$([^)]*)' | |
|---|
| | 682 | '$[A-Z][A-Za-z0-9_]*' | |
|---|
| | 683 | '$' |
|---|
| | 684 | */ |
|---|
| | 685 | template Parse_SpecialAct (char[] str) |
|---|
| | 686 | { |
|---|
| | 687 | private const char[] without = DropWhiteF(str); |
|---|
| | 688 | //pragma(msg,">>"__FILE__":"~__LINE__.stringof[0..$-1]~": '"~without~\'); |
|---|
| | 689 | |
|---|
| | 690 | static if(without.length == 0 || without[0] != '$') |
|---|
| | 691 | { |
|---|
| | 692 | pragma(msg,">>"__FILE__":"~__LINE__.stringof[0..$-1]~": unknown Special '"~without~\'); |
|---|
| | 693 | const bool Match = false; |
|---|
| | 694 | } |
|---|
| | 695 | else |
|---|
| | 696 | { |
|---|
| | 697 | static if( |
|---|
| | 698 | without.length == 1 || |
|---|
| | 699 | without[1] == ' ' || |
|---|
| | 700 | without[1] == '\t' || |
|---|
| | 701 | without[1] == '\n' || |
|---|
| | 702 | without[1] == '\r' |
|---|
| | 703 | ) |
|---|
| | 704 | { |
|---|
| | 705 | const bool Match = true; |
|---|
| | 706 | const char[] Text = without[0..1]; |
|---|
| | 707 | } |
|---|
| | 708 | else static if(without[1] == '(') |
|---|
| | 709 | { |
|---|
| | 710 | const bool Match = true; |
|---|
| | 711 | const char[] Text = FindChar!(')')(without); |
|---|
| | 712 | } |
|---|
| | 713 | else static if(without.length > 2 && 'A' <= without[1] && without[1] <= 'Z') |
|---|
| | 714 | { |
|---|
| | 715 | const bool Match = true; |
|---|
| | 716 | const char[] Text = without[0..2] ~ GetID(without[2..$]); |
|---|
| | 717 | } |
|---|
| | 718 | else |
|---|
| | 719 | { |
|---|
| | 720 | pragma(msg,">>"__FILE__":"~__LINE__.stringof[0..$-1]~": unknown Special '"~without~\'); |
|---|
| | 721 | const bool Match = false; |
|---|
| | 722 | const char[] Text = ""; |
|---|
| | 723 | } |
|---|
| | 724 | |
|---|
| | 725 | const char[] Remaining = without[Text.length .. $]; |
|---|
| | 726 | const char[] Used = str[0 .. $-Remaining.length]; |
|---|
| | 727 | } |
|---|
| | 728 | } |
|---|
| | 729 | struct UnittetParse_Parse_SpecialAct{ |
|---|
| | 730 | // Tests |
|---|
| | 731 | static assert(Parse_SpecialAct!("$Ltree ").Match); |
|---|
| | 732 | static assert(Parse_SpecialAct!("$(Ltree) ").Match); |
|---|
| | 733 | static assert(Parse_SpecialAct!("$ ").Match); |
|---|
| | 734 | |
|---|
| | 735 | //static assert(!Parse_SpecialAct!("$a ").Match); |
|---|
| | 736 | //static assert(!Parse_SpecialAct!("a ").Match); |
|---|
| 538 | | struct UnittestParse_Item{ |
|---|
| 539 | | // Tests |
|---|
| 540 | | alias Parse_Item!(" hello world") Parse_Item_test1; |
|---|
| 541 | | static assert(Parse_Item_test1.Match); |
|---|
| 542 | | static assert(Parse_Item_test1.Text == "hello"); |
|---|
| 543 | | static assert(Parse_Item_test1.Used == " hello", Parse_Item_test1.Used); |
|---|
| 544 | | static assert(Parse_Item_test1.Remaining == " world"); |
|---|
| 545 | | static assert(Parse_Item_test1.Type == ItemType.single); |
|---|
| 546 | | |
|---|
| 547 | | alias Parse_Item!(" hello +world") Parse_Item_test2; |
|---|
| 548 | | static assert(Parse_Item_test2.Match); |
|---|
| 549 | | static assert(Parse_Item_test2.Text == "hello"); |
|---|
| 550 | | static assert(Parse_Item_test2.Used == " hello +", Parse_Item_test1.Used); |
|---|
| 551 | | static assert(Parse_Item_test2.Remaining == "world"); |
|---|
| 552 | | static assert(Parse_Item_test2.Type == ItemType.plus); |
|---|
| 553 | | |
|---|
| 554 | | alias Parse_Item!(" hello* +world") Parse_Item_test3; |
|---|
| 555 | | static assert(Parse_Item_test3.Match); |
|---|
| 556 | | static assert(Parse_Item_test3.Text == "hello"); |
|---|
| 557 | | static assert(Parse_Item_test3.Used == " hello*", Parse_Item_test1.Used); |
|---|
| 558 | | static assert(Parse_Item_test3.Remaining == " +world"); |
|---|
| 559 | | static assert(Parse_Item_test3.Type == ItemType.star); |
|---|
| 560 | | |
|---|
| 561 | | alias Parse_Item!(" hello?*+world") Parse_Item_test4; |
|---|
| 562 | | static assert(Parse_Item_test4.Match); |
|---|
| 563 | | static assert(Parse_Item_test4.Text == "hello"); |
|---|
| 564 | | static assert(Parse_Item_test4.Used == " hello?", Parse_Item_test1.Used); |
|---|
| 565 | | static assert(Parse_Item_test4.Remaining == "*+world"); |
|---|
| 566 | | static assert(Parse_Item_test4.Type == ItemType.optional); |
|---|
| 567 | | |
|---|
| 568 | | alias Parse_Item!(" \t?*+world") Parse_Item_test5; |
|---|
| 569 | | static assert(!Parse_Item_test5.Match); |
|---|
| 570 | | |
|---|
| | 800 | struct UnittestParse_Item |
|---|
| | 801 | { |
|---|
| | 802 | // Tests |
|---|
| | 803 | alias Parse_Item!(" hello world") Parse_Item_test1; |
|---|
| | 804 | static assert(Parse_Item_test1.Match); |
|---|
| | 805 | static assert(Parse_Item_test1.Text == "hello"); |
|---|
| | 806 | static assert(Parse_Item_test1.Used == " hello", Parse_Item_test1.Used); |
|---|
| | 807 | static assert(Parse_Item_test1.Remaining == " world"); |
|---|
| | 808 | static assert(Parse_Item_test1.Type == ItemType.single); |
|---|
| | 809 | |
|---|
| | 810 | alias Parse_Item!(" hello +world") Parse_Item_test2; |
|---|
| | 811 | static assert(Parse_Item_test2.Match); |
|---|
| | 812 | static assert(Parse_Item_test2.Text == "hello"); |
|---|
| | 813 | static assert(Parse_Item_test2.Used == " hello +", Parse_Item_test1.Used); |
|---|
| | 814 | static assert(Parse_Item_test2.Remaining == "world"); |
|---|
| | 815 | static assert(Parse_Item_test2.Type == ItemType.plus); |
|---|
| | 816 | |
|---|
| | 817 | alias Parse_Item!(" hello* +world") Parse_Item_test3; |
|---|
| | 818 | static assert(Parse_Item_test3.Match); |
|---|
| | 819 | static assert(Parse_Item_test3.Text == "hello"); |
|---|
| | 820 | static assert(Parse_Item_test3.Used == " hello*", Parse_Item_test1.Used); |
|---|
| | 821 | static assert(Parse_Item_test3.Remaining == " +world"); |
|---|
| | 822 | static assert(Parse_Item_test3.Type == ItemType.star); |
|---|
| | 823 | |
|---|
| | 824 | alias Parse_Item!(" hello?*+world") Parse_Item_test4; |
|---|
| | 825 | static assert(Parse_Item_test4.Match); |
|---|
| | 826 | static assert(Parse_Item_test4.Text == "hello"); |
|---|
| | 827 | static assert(Parse_Item_test4.Used == " hello?", Parse_Item_test1.Used); |
|---|
| | 828 | static assert(Parse_Item_test4.Remaining == "*+world"); |
|---|
| | 829 | static assert(Parse_Item_test4.Type == ItemType.optional); |
|---|
| | 830 | |
|---|
| | 831 | alias Parse_Item!(" \t?*+world") Parse_Item_test5; |
|---|
| | 832 | static assert(!Parse_Item_test5.Match); |
|---|
| 600 | | struct UnittestParse_Sequence{ |
|---|
| 601 | | // Tests |
|---|
| 602 | | alias Parse_Sequence!("Hello world+this?is* good; by") Parse_Sequence_test1; |
|---|
| 603 | | static assert(Parse_Sequence_test1.Match); |
|---|
| 604 | | static assert(Parse_Sequence_test1.Used == "Hello world+this?is* good", Parse_Sequence_test1.Used); |
|---|
| 605 | | static assert(Parse_Sequence_test1.Remaining == "; by"); |
|---|
| 606 | | static assert(Parse_Sequence_test1.Clauses[0].Text == "Hello"); |
|---|
| 607 | | |
|---|
| 608 | | alias Parse_Sequence!("+this?is* good; by") Parse_Sequence_test2; |
|---|
| 609 | | static assert(!Parse_Sequence_test2.Match); |
|---|
| 610 | | } |
|---|
| | 862 | struct UnittestParse_Sequence |
|---|
| | 863 | { |
|---|
| | 864 | // Tests |
|---|
| | 865 | alias Parse_Sequence!("Hello world+this?is* good; by") Parse_Sequence_test1; |
|---|
| | 866 | static assert(Parse_Sequence_test1.Match); |
|---|
| | 867 | static assert(Parse_Sequence_test1.Used == "Hello world+this?is* good", Parse_Sequence_test1.Used); |
|---|
| | 868 | static assert(Parse_Sequence_test1.Remaining == "; by"); |
|---|
| | 869 | static assert(Parse_Sequence_test1.Clauses[0].Text == "Hello"); |
|---|
| | 870 | |
|---|
| | 871 | alias Parse_Sequence!("+this?is* good; by") Parse_Sequence_test2; |
|---|
| | 872 | static assert(!Parse_Sequence_test2.Match); |
|---|
| | 873 | } |
|---|
| | 874 | |
|---|
| | 875 | |
|---|
| 635 | | } |
|---|
| 636 | | struct UnittestParse_Case{ |
|---|
| 637 | | // Tests |
|---|
| 638 | | alias Parse_Case!("Act/foo?bar+baz*sig ") Parse_Case_test1; |
|---|
| 639 | | static assert(Parse_Case_test1.Match); |
|---|
| 640 | | static assert(Parse_Case_test1.Action == "Act"); |
|---|
| 641 | | static assert(Parse_Case_test1.Seq == "foo?bar+baz*sig"); |
|---|
| 642 | | static assert(Parse_Case_test1.Clauses[0].Text == "foo"); |
|---|
| 643 | | |
|---|
| 644 | | alias Parse_Case!("Act / foo? bar+ baz* sig|") Parse_Case_test2; |
|---|
| 645 | | static assert(Parse_Case_test2.Match); |
|---|
| 646 | | static assert(Parse_Case_test2.Action == "Act"); |
|---|
| 647 | | static assert(Parse_Case_test2.Seq == " foo? bar+ baz* sig"); |
|---|
| 648 | | static assert(Parse_Case_test2.Clauses[0].Text == "foo"); |
|---|
| 649 | | |
|---|
| 650 | | alias Parse_Case!("Act foo? / bar+ baz* sig|") Parse_Case_test3; |
|---|
| 651 | | static assert(!Parse_Case_test3.Match); |
|---|
| | 911 | |
|---|
| | 912 | } |
|---|
| | 913 | struct UnittestParse_Case |
|---|
| | 914 | { |
|---|
| | 915 | // Tests |
|---|
| | 916 | alias Parse_Case!("Act/foo?bar+baz*sig ") Parse_Case_test1; |
|---|
| | 917 | static assert(Parse_Case_test1.Match); |
|---|
| | 918 | static assert(Parse_Case_test1.Action == "Act"); |
|---|
| | 919 | static assert(Parse_Case_test1.Seq == "foo?bar+baz*sig"); |
|---|
| | 920 | static assert(Parse_Case_test1.Clauses[0].Text == "foo"); |
|---|
| | 921 | |
|---|
| | 922 | alias Parse_Case!("Act / foo? bar+ baz* sig|") Parse_Case_test2; |
|---|
| | 923 | static assert(Parse_Case_test2.Match); |
|---|
| | 924 | static assert(Parse_Case_test2.Action == "Act"); |
|---|
| | 925 | static assert(Parse_Case_test2.Seq == " foo? bar+ baz* sig"); |
|---|
| | 926 | static assert(Parse_Case_test2.Clauses[0].Text == "foo"); |
|---|
| | 927 | |
|---|
| | 928 | alias Parse_Case!("Act foo? / bar+ baz* sig|") Parse_Case_test3; |
|---|
| | 929 | static assert(!Parse_Case_test3.Match); |
|---|
| 709 | | struct UnittestParse_Cases{ |
|---|
| 710 | | // Tests |
|---|
| 711 | | alias Parse_Cases!("Act/foo| For/Bar ") Parse_Cases_test1; |
|---|
| 712 | | static assert(Parse_Cases_test1.Match); |
|---|
| 713 | | static assert(Parse_Cases_test1.Remaining == ""); |
|---|
| 714 | | static assert(Parse_Cases_test1.Used == "Act/foo| For/Bar "); |
|---|
| 715 | | static assert(Parse_Cases_test1.Disjuncts[0].Action == "Act"); |
|---|
| 716 | | static assert(Parse_Cases_test1.Disjuncts[1].Action == "For"); |
|---|
| 717 | | |
|---|
| 718 | | alias Parse_Cases!("Act/foo| For Bar ") Parse_Cases_test2; |
|---|
| 719 | | static assert(Parse_Cases_test2.Match); |
|---|
| 720 | | static assert(Parse_Cases_test2.Remaining == "| For Bar "); |
|---|
| 721 | | static assert(Parse_Cases_test2.Used == "Act/foo"); |
|---|
| 722 | | static assert(Parse_Cases_test2.Disjuncts[0].Action == "Act"); |
|---|
| | 987 | struct UnittestParse_Cases |
|---|
| | 988 | { |
|---|
| | 989 | // Tests |
|---|
| | 990 | alias Parse_Cases!("Act/foo| For/Bar ") Parse_Cases_test1; |
|---|
| | 991 | static assert(Parse_Cases_test1.Match); |
|---|
| | 992 | static assert(Parse_Cases_test1.Remaining == ""); |
|---|
| | 993 | static assert(Parse_Cases_test1.Used == "Act/foo| For/Bar "); |
|---|
| | 994 | static assert(Parse_Cases_test1.Disjuncts[0].Action == "Act"); |
|---|
| | 995 | static assert(Parse_Cases_test1.Disjuncts[1].Action == "For"); |
|---|
| | 996 | |
|---|
| | 997 | alias Parse_Cases!("Act/foo| For Bar ") Parse_Cases_test2; |
|---|
| | 998 | static assert(Parse_Cases_test2.Match); |
|---|
| | 999 | static assert(Parse_Cases_test2.Remaining == "| For Bar "); |
|---|
| | 1000 | static assert(Parse_Cases_test2.Used == "Act/foo"); |
|---|
| | 1001 | static assert(Parse_Cases_test2.Disjuncts[0].Action == "Act"); |
|---|
| 770 | | struct UnittestParse_Rule{ |
|---|
| 771 | | //tests |
|---|
| 772 | | alias Parse_Rule!("Foo:bar/baz | pig/owl*horse ; ") Parse_Rule_test1; |
|---|
| 773 | | static assert(Parse_Rule_test1.Match); |
|---|
| 774 | | static assert(Parse_Rule_test1.Used == "Foo:bar/baz | pig/owl*horse ;"); |
|---|
| 775 | | static assert(Parse_Rule_test1.Remaining == " "); |
|---|
| 776 | | static assert(Parse_Rule_test1.Name == "Foo"); |
|---|
| 777 | | static assert(Parse_Rule_test1.Disjuncts[0].Action == "bar"); |
|---|
| 778 | | static assert(Parse_Rule_test1.Disjuncts[0].Clauses[0].Text == "baz"); |
|---|
| 779 | | static assert(Parse_Rule_test1.Disjuncts[1].Action == "pig"); |
|---|
| | 1049 | struct UnittestParse_Rule |
|---|
| | 1050 | { |
|---|
| | 1051 | //tests |
|---|
| | 1052 | alias Parse_Rule!("Foo:bar/baz | pig/owl*horse ; ") Parse_Rule_test1; |
|---|
| | 1053 | static assert(Parse_Rule_test1.Match); |
|---|
| | 1054 | static assert(Parse_Rule_test1.Used == "Foo:bar/baz | pig/owl*horse ;"); |
|---|
| | 1055 | static assert(Parse_Rule_test1.Remaining == " "); |
|---|
| | 1056 | static assert(Parse_Rule_test1.Name == "Foo"); |
|---|
| | 1057 | static assert(Parse_Rule_test1.Disjuncts[0].Action == "bar"); |
|---|
| | 1058 | static assert(Parse_Rule_test1.Disjuncts[0].Clauses[0].Text == "baz"); |
|---|
| | 1059 | static assert(Parse_Rule_test1.Disjuncts[1].Action == "pig"); |
|---|
| 830 | | struct UnittestParse_Grammar{ |
|---|
| 831 | | alias Parse_Grammar!("Foo:bar/baz | pig/owl*horse ; ") Parse_Grammar_test1; |
|---|
| 832 | | |
|---|
| 833 | | static assert(Parse_Grammar_test1.Match); |
|---|
| 834 | | static assert(Parse_Grammar_test1.Reductions[0].Name == "Foo"); |
|---|
| 835 | | static assert(Parse_Grammar_test1.Reductions[0].Disjuncts[0].Action == "bar"); |
|---|
| 836 | | static assert(Parse_Grammar_test1.Reductions[0].Disjuncts[0].Clauses[0].Text == "baz"); |
|---|
| 837 | | static assert(Parse_Grammar_test1.Reductions[0].Disjuncts[1].Action == "pig"); |
|---|
| 838 | | static assert(Parse_Grammar_test1.Reductions[0].Disjuncts[1].Clauses[0].Text == "owl"); |
|---|
| | 1110 | struct UnittestParse_Grammar |
|---|
| | 1111 | { |
|---|
| | 1112 | alias Parse_Grammar!("Foo:bar/baz | pig/owl*horse ; ") Parse_Grammar_test1; |
|---|
| | 1113 | |
|---|
| | 1114 | static assert(Parse_Grammar_test1.Match); |
|---|
| | 1115 | static assert(Parse_Grammar_test1.Reductions[0].Name == "Foo"); |
|---|
| | 1116 | static assert(Parse_Grammar_test1.Reductions[0].Disjuncts[0].Action == "bar"); |
|---|
| | 1117 | static assert(Parse_Grammar_test1.Reductions[0].Disjuncts[0].Clauses[0].Text == "baz"); |
|---|
| | 1118 | static assert(Parse_Grammar_test1.Reductions[0].Disjuncts[1].Action == "pig"); |
|---|
| | 1119 | static assert(Parse_Grammar_test1.Reductions[0].Disjuncts[1].Clauses[0].Text == "owl"); |
|---|
| 903 | | bool worked = false; |
|---|
| 904 | | writef("Try\t(%d)%s...\n", ind, ruleIs); |
|---|
| 905 | | } |
|---|
| 906 | | debug(dParse_runtime) scope(success) writef("Done\t(%d)%s %s\n", ind, ruleIs, worked); |
|---|
| 907 | | debug(dParse_runtime) scope(failure) writef("FAILED\t(%d)%s %s\n", ind, ruleIs, worked); |
|---|
| 908 | | |
|---|
| 909 | | //debug(dparse_verbose) pragma(msg, "Seeking: "~ruleIs); |
|---|
| | 1186 | writef("Try\t(%d)%s...\n", ind, rule.Name); |
|---|
| | 1187 | } |
|---|
| | 1188 | debug(dParse_runtime) scope(success) writef("Done\t(%d)%s\n", ind, rule.Name); |
|---|
| | 1189 | debug(dParse_runtime) scope(failure) writef("FAILED\t(%d)%s\n", ind, rule.Name); |
|---|