diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..a9aba9f
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,5 @@
+{
+ "cSpell.words": [
+ "vuvoth"
+ ]
+}
\ No newline at end of file
diff --git a/crates/parser/src/utils.rs b/crates/parser/src/utils.rs
new file mode 100644
index 0000000..e69de29
diff --git a/crates/syntax/src/lib.rs b/crates/syntax/src/lib.rs
index 7f4b53c..e746fe1 100644
--- a/crates/syntax/src/lib.rs
+++ b/crates/syntax/src/lib.rs
@@ -1,5 +1,5 @@
pub mod abstract_syntax_tree;
pub mod syntax;
pub mod syntax_node;
-
-mod test_programs;
+mod utils;
+mod view_syntax;
diff --git a/crates/syntax/src/snapshots/syntax__syntax__grammar_tests____src__test_files__happy__block.circom.snap b/crates/syntax/src/snapshots/syntax__syntax__grammar_tests____src__test_files__happy__block.circom.snap
new file mode 100644
index 0000000..beaf281
--- /dev/null
+++ b/crates/syntax/src/snapshots/syntax__syntax__grammar_tests____src__test_files__happy__block.circom.snap
@@ -0,0 +1,670 @@
+---
+source: crates/syntax/src/syntax.rs
+expression: "crate::view_syntax::view_ast(&syntax)"
+---
+ Block 0..1021
+| LCurly 0..1
+| | LCurly 0..1 "{"
+| EndLine 1..2
+| | EndLine 1..2
+| | | EndLine 1..2 "\n"
+| WhiteSpace 2..3
+| | WhiteSpace 2..3
+| | | WhiteSpace 2..3 " "
+| CommentLine 3..28
+| | CommentLine 3..28
+| | | CommentLine 3..28 "//Declaration of signals."
+| EndLine 28..29
+| | EndLine 28..29
+| | | EndLine 28..29 "\n"
+| WhiteSpace 29..41
+| | WhiteSpace 29..41
+| | | WhiteSpace 29..41 " "
+| StatementList 41..1020
+| | InputSignalDecl 41..56
+| | | SignalHeader 41..54
+| | | | SignalKw 41..47
+| | | | | SignalKw 41..47 "signal"
+| | | | WhiteSpace 47..48
+| | | | | WhiteSpace 47..48
+| | | | | | WhiteSpace 47..48 " "
+| | | | InputKw 48..53
+| | | | | InputKw 48..53 "input"
+| | | | WhiteSpace 53..54
+| | | | | WhiteSpace 53..54
+| | | | | | WhiteSpace 53..54 " "
+| | | Identifier 54..56
+| | | | Identifier 54..56 "in"
+| | Error 56..89
+| | | Error 56..89
+| | | | Error 56..89 "expect Semicolon but got LBracket"
+| | Statement 89..125
+| | | Error 89..90
+| | | | Expression 89..90
+| | | | | Error 89..90
+| | | | | | LBracket 89..90
+| | | | | | | LBracket 89..90 "["
+| | | Error 90..125
+| | | | Error 90..125
+| | | | | Error 90..125 "expect Semicolon but got Identifier"
+| | Statement 125..159
+| | | Error 125..126
+| | | | Expression 125..126
+| | | | | ComponentIdentifier 125..126
+| | | | | | Identifier 125..126
+| | | | | | | Identifier 125..126 "N"
+| | | Error 126..159
+| | | | Error 126..159
+| | | | | Error 126..159 "expect Semicolon but got RBracket"
+| | Statement 159..161
+| | | Error 159..160
+| | | | Expression 159..160
+| | | | | Error 159..160
+| | | | | | RBracket 159..160
+| | | | | | | RBracket 159..160 "]"
+| | | Semicolon 160..161
+| | | | Semicolon 160..161 ";"
+| | EndLine 161..162
+| | | EndLine 161..162
+| | | | EndLine 161..162 "\n"
+| | WhiteSpace 162..174
+| | | WhiteSpace 162..174
+| | | | WhiteSpace 162..174 " "
+| | OutputSignalDecl 174..191
+| | | SignalHeader 174..188
+| | | | SignalKw 174..180
+| | | | | SignalKw 174..180 "signal"
+| | | | WhiteSpace 180..181
+| | | | | WhiteSpace 180..181
+| | | | | | WhiteSpace 180..181 " "
+| | | | OutputKw 181..187
+| | | | | OutputKw 181..187 "output"
+| | | | WhiteSpace 187..188
+| | | | | WhiteSpace 187..188
+| | | | | | WhiteSpace 187..188 " "
+| | | Identifier 188..191
+| | | | Identifier 188..191 "out"
+| | Semicolon 191..192
+| | | Semicolon 191..192 ";"
+| | EndLine 192..193
+| | | EndLine 192..193
+| | | | EndLine 192..193 "\n"
+| | WhiteSpace 193..205
+| | | WhiteSpace 193..205
+| | | | WhiteSpace 193..205 " "
+| | ComponentDecl 205..343
+| | | ComponentKw 205..214
+| | | | ComponentKw 205..214 "component"
+| | | WhiteSpace 214..215
+| | | | WhiteSpace 214..215
+| | | | | WhiteSpace 214..215 " "
+| | | ComponentIdentifier 215..219
+| | | | Identifier 215..219
+| | | | | Identifier 215..219 "comp"
+| | | Error 219..249
+| | | | Error 219..249
+| | | | | Error 219..249 "expect Assign but got LBracket"
+| | | TemplateName 249..283
+| | | | Error 249..283
+| | | | | Error 249..283
+| | | | | | Error 249..283 "expect Identifier but got LBracket"
+| | | Error 283..313
+| | | | Error 283..313
+| | | | | Error 283..313 "expect LParen but got LBracket"
+| | | Error 313..343
+| | | | Error 313..343
+| | | | | Error 313..343 "expect RParen but got LBracket"
+| | Error 343..376
+| | | Error 343..376
+| | | | Error 343..376 "expect Semicolon but got LBracket"
+| | Statement 376..412
+| | | Error 376..377
+| | | | Expression 376..377
+| | | | | Error 376..377
+| | | | | | LBracket 376..377
+| | | | | | | LBracket 376..377 "["
+| | | Error 377..412
+| | | | Error 377..412
+| | | | | Error 377..412 "expect Semicolon but got Identifier"
+| | Statement 412..441
+| | | Error 412..413
+| | | | Expression 412..413
+| | | | | ComponentIdentifier 412..413
+| | | | | | Identifier 412..413
+| | | | | | | Identifier 412..413 "N"
+| | | Error 413..441
+| | | | Error 413..441
+| | | | | Error 413..441 "expect Semicolon but got Sub"
+| | Statement 441..476
+| | | Error 441..443
+| | | | Expression 441..443
+| | | | | Sub 441..443
+| | | | | | Sub 441..442
+| | | | | | | Sub 441..442 "-"
+| | | | | | Number 442..443
+| | | | | | | Number 442..443
+| | | | | | | | Number 442..443 "1"
+| | | Error 443..476
+| | | | Error 443..476
+| | | | | Error 443..476 "expect Semicolon but got RBracket"
+| | Statement 476..478
+| | | Error 476..477
+| | | | Expression 476..477
+| | | | | Error 476..477
+| | | | | | RBracket 476..477
+| | | | | | | RBracket 476..477 "]"
+| | | Semicolon 477..478
+| | | | Semicolon 477..478 ";"
+| | EndLine 478..479
+| | | EndLine 478..479
+| | | | EndLine 478..479 "\n"
+| | EndLine 479..480
+| | | EndLine 479..480
+| | | | EndLine 479..480 "\n"
+| | WhiteSpace 480..492
+| | | WhiteSpace 480..492
+| | | | WhiteSpace 480..492 " "
+| | CommentLine 492..505
+| | | CommentLine 492..505
+| | | | CommentLine 492..505 "//Statements."
+| | EndLine 505..506
+| | | EndLine 505..506
+| | | | EndLine 505..506 "\n"
+| | WhiteSpace 506..518
+| | | WhiteSpace 506..518
+| | | | WhiteSpace 506..518 " "
+| | Statement 518..606
+| | | ForLoop 518..606
+| | | | ForKw 518..521
+| | | | | ForKw 518..521 "for"
+| | | | LParen 521..522
+| | | | | LParen 521..522 "("
+| | | | VarDecl 522..531
+| | | | | VarKw 522..525
+| | | | | | VarKw 522..525 "var"
+| | | | | WhiteSpace 525..526
+| | | | | | WhiteSpace 525..526
+| | | | | | | WhiteSpace 525..526 " "
+| | | | | Identifier 526..527
+| | | | | | Identifier 526..527 "i"
+| | | | | WhiteSpace 527..528
+| | | | | | WhiteSpace 527..528
+| | | | | | | WhiteSpace 527..528 " "
+| | | | | Assign 528..529
+| | | | | | Assign 528..529 "="
+| | | | | WhiteSpace 529..530
+| | | | | | WhiteSpace 529..530
+| | | | | | | WhiteSpace 529..530 " "
+| | | | | Expression 530..531
+| | | | | | Number 530..531
+| | | | | | | Number 530..531
+| | | | | | | | Number 530..531 "0"
+| | | | Semicolon 531..532
+| | | | | Semicolon 531..532 ";"
+| | | | WhiteSpace 532..533
+| | | | | WhiteSpace 532..533
+| | | | | | WhiteSpace 532..533 " "
+| | | | Expression 533..540
+| | | | | LessThan 533..540
+| | | | | | Identifier 533..534
+| | | | | | | Identifier 533..534
+| | | | | | | | Identifier 533..534 "i"
+| | | | | | WhiteSpace 534..535
+| | | | | | | WhiteSpace 534..535
+| | | | | | | | WhiteSpace 534..535 " "
+| | | | | | LessThan 535..536
+| | | | | | | LessThan 535..536 "<"
+| | | | | | WhiteSpace 536..537
+| | | | | | | WhiteSpace 536..537
+| | | | | | | | WhiteSpace 536..537 " "
+| | | | | | Sub 537..540
+| | | | | | | Identifier 537..538
+| | | | | | | | Identifier 537..538
+| | | | | | | | | Identifier 537..538 "N"
+| | | | | | | Sub 538..539
+| | | | | | | | Sub 538..539 "-"
+| | | | | | | Number 539..540
+| | | | | | | | Number 539..540
+| | | | | | | | | Number 539..540 "1"
+| | | | Semicolon 540..541
+| | | | | Semicolon 540..541 ";"
+| | | | WhiteSpace 541..542
+| | | | | WhiteSpace 541..542
+| | | | | | WhiteSpace 541..542 " "
+| | | | Error 542..543
+| | | | | Expression 542..543
+| | | | | | ComponentIdentifier 542..543
+| | | | | | | Identifier 542..543
+| | | | | | | | Identifier 542..543 "i"
+| | | | Error 543..572
+| | | | | Error 543..572
+| | | | | | Error 543..572 "expect RParen but got UnitInc"
+| | | | Error 572..575
+| | | | | Expression 572..575
+| | | | | | UnitInc 572..575
+| | | | | | | UnitInc 572..574
+| | | | | | | | UnitInc 572..574 "++"
+| | | | | | | Error 574..575
+| | | | | | | | RParen 574..575
+| | | | | | | | | RParen 574..575 ")"
+| | | | Error 575..606
+| | | | | Error 575..606
+| | | | | | Error 575..606 "expect Semicolon but got LCurly"
+| | Statement 606..694
+| | | Block 606..694
+| | | | LCurly 606..607
+| | | | | LCurly 606..607 "{"
+| | | | EndLine 607..608
+| | | | | EndLine 607..608
+| | | | | | EndLine 607..608 "\n"
+| | | | WhiteSpace 608..624
+| | | | | WhiteSpace 608..624
+| | | | | | WhiteSpace 608..624 " "
+| | | | StatementList 624..693
+| | | | | Statement 624..680
+| | | | | | AssignStatement 624..679
+| | | | | | | Expression 624..632
+| | | | | | | | ComponentIdentifier 624..628
+| | | | | | | | | Identifier 624..628
+| | | | | | | | | | Identifier 624..628 "comp"
+| | | | | | | | LBracket 628..629
+| | | | | | | | | LBracket 628..629 "["
+| | | | | | | | Expression 629..630
+| | | | | | | | | Identifier 629..630
+| | | | | | | | | | Identifier 629..630
+| | | | | | | | | | | Identifier 629..630 "i"
+| | | | | | | | RBracket 630..631
+| | | | | | | | | RBracket 630..631 "]"
+| | | | | | | | WhiteSpace 631..632
+| | | | | | | | | WhiteSpace 631..632
+| | | | | | | | | | WhiteSpace 631..632 " "
+| | | | | | | Assign 632..633
+| | | | | | | | Assign 632..633 "="
+| | | | | | | WhiteSpace 633..634
+| | | | | | | | WhiteSpace 633..634
+| | | | | | | | | WhiteSpace 633..634 " "
+| | | | | | | Expression 634..679
+| | | | | | | | Call 634..679
+| | | | | | | | | Identifier 634..645
+| | | | | | | | | | Identifier 634..645
+| | | | | | | | | | | Identifier 634..645 "Multiplier2"
+| | | | | | | | | Tuple 645..679
+| | | | | | | | | | LParen 645..646
+| | | | | | | | | | | LParen 645..646 "("
+| | | | | | | | | | Error 646..678
+| | | | | | | | | | | Error 646..678
+| | | | | | | | | | | | Error 646..678 "expect Identifier but got RParen"
+| | | | | | | | | | RParen 678..679
+| | | | | | | | | | | RParen 678..679 ")"
+| | | | | | Semicolon 679..680
+| | | | | | | Semicolon 679..680 ";"
+| | | | | EndLine 680..681
+| | | | | | EndLine 680..681
+| | | | | | | EndLine 680..681 "\n"
+| | | | | WhiteSpace 681..693
+| | | | | | WhiteSpace 681..693
+| | | | | | | WhiteSpace 681..693 " "
+| | | | RCurly 693..694
+| | | | | RCurly 693..694 "}"
+| | EndLine 694..695
+| | | EndLine 694..695
+| | | | EndLine 694..695 "\n"
+| | WhiteSpace 695..707
+| | | WhiteSpace 695..707
+| | | | WhiteSpace 695..707 " "
+| | Statement 707..729
+| | | AssignStatement 707..728
+| | | | ComponentCall 707..718
+| | | | | ComponentIdentifier 707..711
+| | | | | | Identifier 707..711
+| | | | | | | Identifier 707..711 "comp"
+| | | | | LBracket 711..712
+| | | | | | LBracket 711..712 "["
+| | | | | Expression 712..713
+| | | | | | Number 712..713
+| | | | | | | Number 712..713
+| | | | | | | | Number 712..713 "0"
+| | | | | RBracket 713..714
+| | | | | | RBracket 713..714 "]"
+| | | | | Dot 714..715
+| | | | | | Dot 714..715 "."
+| | | | | Identifier 715..718
+| | | | | | Identifier 715..718 "in1"
+| | | | WhiteSpace 718..719
+| | | | | WhiteSpace 718..719
+| | | | | | WhiteSpace 718..719 " "
+| | | | RAssignConstraintSignal 719..722
+| | | | | RAssignConstraintSignal 719..722 "<=="
+| | | | WhiteSpace 722..723
+| | | | | WhiteSpace 722..723
+| | | | | | WhiteSpace 722..723 " "
+| | | | Expression 723..728
+| | | | | ArrayQuery 723..728
+| | | | | | Identifier 723..725
+| | | | | | | Identifier 723..725
+| | | | | | | | Identifier 723..725 "in"
+| | | | | | LBracket 725..726
+| | | | | | | LBracket 725..726 "["
+| | | | | | Number 726..727
+| | | | | | | Number 726..727
+| | | | | | | | Number 726..727 "0"
+| | | | | | RBracket 727..728
+| | | | | | | RBracket 727..728 "]"
+| | | Semicolon 728..729
+| | | | Semicolon 728..729 ";"
+| | EndLine 729..730
+| | | EndLine 729..730
+| | | | EndLine 729..730 "\n"
+| | WhiteSpace 730..742
+| | | WhiteSpace 730..742
+| | | | WhiteSpace 730..742 " "
+| | Statement 742..764
+| | | AssignStatement 742..763
+| | | | ComponentCall 742..753
+| | | | | ComponentIdentifier 742..746
+| | | | | | Identifier 742..746
+| | | | | | | Identifier 742..746 "comp"
+| | | | | LBracket 746..747
+| | | | | | LBracket 746..747 "["
+| | | | | Expression 747..748
+| | | | | | Number 747..748
+| | | | | | | Number 747..748
+| | | | | | | | Number 747..748 "0"
+| | | | | RBracket 748..749
+| | | | | | RBracket 748..749 "]"
+| | | | | Dot 749..750
+| | | | | | Dot 749..750 "."
+| | | | | Identifier 750..753
+| | | | | | Identifier 750..753 "in2"
+| | | | WhiteSpace 753..754
+| | | | | WhiteSpace 753..754
+| | | | | | WhiteSpace 753..754 " "
+| | | | RAssignConstraintSignal 754..757
+| | | | | RAssignConstraintSignal 754..757 "<=="
+| | | | WhiteSpace 757..758
+| | | | | WhiteSpace 757..758
+| | | | | | WhiteSpace 757..758 " "
+| | | | Expression 758..763
+| | | | | ArrayQuery 758..763
+| | | | | | Identifier 758..760
+| | | | | | | Identifier 758..760
+| | | | | | | | Identifier 758..760 "in"
+| | | | | | LBracket 760..761
+| | | | | | | LBracket 760..761 "["
+| | | | | | Number 761..762
+| | | | | | | Number 761..762
+| | | | | | | | Number 761..762 "1"
+| | | | | | RBracket 762..763
+| | | | | | | RBracket 762..763 "]"
+| | | Semicolon 763..764
+| | | | Semicolon 763..764 ";"
+| | EndLine 764..765
+| | | EndLine 764..765
+| | | | EndLine 764..765 "\n"
+| | WhiteSpace 765..777
+| | | WhiteSpace 765..777
+| | | | WhiteSpace 765..777 " "
+| | Statement 777..865
+| | | ForLoop 777..865
+| | | | ForKw 777..780
+| | | | | ForKw 777..780 "for"
+| | | | LParen 780..781
+| | | | | LParen 780..781 "("
+| | | | VarDecl 781..790
+| | | | | VarKw 781..784
+| | | | | | VarKw 781..784 "var"
+| | | | | WhiteSpace 784..785
+| | | | | | WhiteSpace 784..785
+| | | | | | | WhiteSpace 784..785 " "
+| | | | | Identifier 785..786
+| | | | | | Identifier 785..786 "i"
+| | | | | WhiteSpace 786..787
+| | | | | | WhiteSpace 786..787
+| | | | | | | WhiteSpace 786..787 " "
+| | | | | Assign 787..788
+| | | | | | Assign 787..788 "="
+| | | | | WhiteSpace 788..789
+| | | | | | WhiteSpace 788..789
+| | | | | | | WhiteSpace 788..789 " "
+| | | | | Expression 789..790
+| | | | | | Number 789..790
+| | | | | | | Number 789..790
+| | | | | | | | Number 789..790 "0"
+| | | | Semicolon 790..791
+| | | | | Semicolon 790..791 ";"
+| | | | WhiteSpace 791..792
+| | | | | WhiteSpace 791..792
+| | | | | | WhiteSpace 791..792 " "
+| | | | Expression 792..799
+| | | | | LessThan 792..799
+| | | | | | Identifier 792..793
+| | | | | | | Identifier 792..793
+| | | | | | | | Identifier 792..793 "i"
+| | | | | | WhiteSpace 793..794
+| | | | | | | WhiteSpace 793..794
+| | | | | | | | WhiteSpace 793..794 " "
+| | | | | | LessThan 794..795
+| | | | | | | LessThan 794..795 "<"
+| | | | | | WhiteSpace 795..796
+| | | | | | | WhiteSpace 795..796
+| | | | | | | | WhiteSpace 795..796 " "
+| | | | | | Sub 796..799
+| | | | | | | Identifier 796..797
+| | | | | | | | Identifier 796..797
+| | | | | | | | | Identifier 796..797 "N"
+| | | | | | | Sub 797..798
+| | | | | | | | Sub 797..798 "-"
+| | | | | | | Number 798..799
+| | | | | | | | Number 798..799
+| | | | | | | | | Number 798..799 "2"
+| | | | Semicolon 799..800
+| | | | | Semicolon 799..800 ";"
+| | | | WhiteSpace 800..801
+| | | | | WhiteSpace 800..801
+| | | | | | WhiteSpace 800..801 " "
+| | | | Error 801..802
+| | | | | Expression 801..802
+| | | | | | ComponentIdentifier 801..802
+| | | | | | | Identifier 801..802
+| | | | | | | | Identifier 801..802 "i"
+| | | | Error 802..831
+| | | | | Error 802..831
+| | | | | | Error 802..831 "expect RParen but got UnitInc"
+| | | | Error 831..834
+| | | | | Expression 831..834
+| | | | | | UnitInc 831..834
+| | | | | | | UnitInc 831..833
+| | | | | | | | UnitInc 831..833 "++"
+| | | | | | | Error 833..834
+| | | | | | | | RParen 833..834
+| | | | | | | | | RParen 833..834 ")"
+| | | | Error 834..865
+| | | | | Error 834..865
+| | | | | | Error 834..865 "expect Semicolon but got LCurly"
+| | Statement 865..971
+| | | Block 865..971
+| | | | LCurly 865..866
+| | | | | LCurly 865..866 "{"
+| | | | EndLine 866..867
+| | | | | EndLine 866..867
+| | | | | | EndLine 866..867 "\n"
+| | | | WhiteSpace 867..883
+| | | | | WhiteSpace 867..883
+| | | | | | WhiteSpace 867..883 " "
+| | | | StatementList 883..970
+| | | | | Statement 883..913
+| | | | | | AssignStatement 883..912
+| | | | | | | ComponentCall 883..896
+| | | | | | | | ComponentIdentifier 883..887
+| | | | | | | | | Identifier 883..887
+| | | | | | | | | | Identifier 883..887 "comp"
+| | | | | | | | LBracket 887..888
+| | | | | | | | | LBracket 887..888 "["
+| | | | | | | | Expression 888..891
+| | | | | | | | | Add 888..891
+| | | | | | | | | | Identifier 888..889
+| | | | | | | | | | | Identifier 888..889
+| | | | | | | | | | | | Identifier 888..889 "i"
+| | | | | | | | | | Add 889..890
+| | | | | | | | | | | Add 889..890 "+"
+| | | | | | | | | | Number 890..891
+| | | | | | | | | | | Number 890..891
+| | | | | | | | | | | | Number 890..891 "1"
+| | | | | | | | RBracket 891..892
+| | | | | | | | | RBracket 891..892 "]"
+| | | | | | | | Dot 892..893
+| | | | | | | | | Dot 892..893 "."
+| | | | | | | | Identifier 893..896
+| | | | | | | | | Identifier 893..896 "in1"
+| | | | | | | WhiteSpace 896..897
+| | | | | | | | WhiteSpace 896..897
+| | | | | | | | | WhiteSpace 896..897 " "
+| | | | | | | RAssignConstraintSignal 897..900
+| | | | | | | | RAssignConstraintSignal 897..900 "<=="
+| | | | | | | WhiteSpace 900..901
+| | | | | | | | WhiteSpace 900..901
+| | | | | | | | | WhiteSpace 900..901 " "
+| | | | | | | Expression 901..912
+| | | | | | | | ComponentCall 901..912
+| | | | | | | | | ArrayQuery 901..908
+| | | | | | | | | | Identifier 901..905
+| | | | | | | | | | | Identifier 901..905
+| | | | | | | | | | | | Identifier 901..905 "comp"
+| | | | | | | | | | LBracket 905..906
+| | | | | | | | | | | LBracket 905..906 "["
+| | | | | | | | | | Identifier 906..907
+| | | | | | | | | | | Identifier 906..907
+| | | | | | | | | | | | Identifier 906..907 "i"
+| | | | | | | | | | RBracket 907..908
+| | | | | | | | | | | RBracket 907..908 "]"
+| | | | | | | | | Dot 908..909
+| | | | | | | | | | Dot 908..909 "."
+| | | | | | | | | Identifier 909..912
+| | | | | | | | | | Identifier 909..912 "out"
+| | | | | | Semicolon 912..913
+| | | | | | | Semicolon 912..913 ";"
+| | | | | EndLine 913..914
+| | | | | | EndLine 913..914
+| | | | | | | EndLine 913..914 "\n"
+| | | | | WhiteSpace 914..930
+| | | | | | WhiteSpace 914..930
+| | | | | | | WhiteSpace 914..930 " "
+| | | | | Statement 930..956
+| | | | | | AssignStatement 930..955
+| | | | | | | ComponentCall 930..943
+| | | | | | | | ComponentIdentifier 930..934
+| | | | | | | | | Identifier 930..934
+| | | | | | | | | | Identifier 930..934 "comp"
+| | | | | | | | LBracket 934..935
+| | | | | | | | | LBracket 934..935 "["
+| | | | | | | | Expression 935..938
+| | | | | | | | | Add 935..938
+| | | | | | | | | | Identifier 935..936
+| | | | | | | | | | | Identifier 935..936
+| | | | | | | | | | | | Identifier 935..936 "i"
+| | | | | | | | | | Add 936..937
+| | | | | | | | | | | Add 936..937 "+"
+| | | | | | | | | | Number 937..938
+| | | | | | | | | | | Number 937..938
+| | | | | | | | | | | | Number 937..938 "1"
+| | | | | | | | RBracket 938..939
+| | | | | | | | | RBracket 938..939 "]"
+| | | | | | | | Dot 939..940
+| | | | | | | | | Dot 939..940 "."
+| | | | | | | | Identifier 940..943
+| | | | | | | | | Identifier 940..943 "in2"
+| | | | | | | WhiteSpace 943..944
+| | | | | | | | WhiteSpace 943..944
+| | | | | | | | | WhiteSpace 943..944 " "
+| | | | | | | RAssignConstraintSignal 944..947
+| | | | | | | | RAssignConstraintSignal 944..947 "<=="
+| | | | | | | WhiteSpace 947..948
+| | | | | | | | WhiteSpace 947..948
+| | | | | | | | | WhiteSpace 947..948 " "
+| | | | | | | Expression 948..955
+| | | | | | | | ArrayQuery 948..955
+| | | | | | | | | Identifier 948..950
+| | | | | | | | | | Identifier 948..950
+| | | | | | | | | | | Identifier 948..950 "in"
+| | | | | | | | | LBracket 950..951
+| | | | | | | | | | LBracket 950..951 "["
+| | | | | | | | | Add 951..954
+| | | | | | | | | | Identifier 951..952
+| | | | | | | | | | | Identifier 951..952
+| | | | | | | | | | | | Identifier 951..952 "i"
+| | | | | | | | | | Add 952..953
+| | | | | | | | | | | Add 952..953 "+"
+| | | | | | | | | | Number 953..954
+| | | | | | | | | | | Number 953..954
+| | | | | | | | | | | | Number 953..954 "2"
+| | | | | | | | | RBracket 954..955
+| | | | | | | | | | RBracket 954..955 "]"
+| | | | | | Semicolon 955..956
+| | | | | | | Semicolon 955..956 ";"
+| | | | | EndLine 956..957
+| | | | | | EndLine 956..957
+| | | | | | | EndLine 956..957 "\n"
+| | | | | EndLine 957..958
+| | | | | | EndLine 957..958
+| | | | | | | EndLine 957..958 "\n"
+| | | | | WhiteSpace 958..970
+| | | | | | WhiteSpace 958..970
+| | | | | | | WhiteSpace 958..970 " "
+| | | | RCurly 970..971
+| | | | | RCurly 970..971 "}"
+| | EndLine 971..972
+| | | EndLine 971..972
+| | | | EndLine 971..972 "\n"
+| | WhiteSpace 972..984
+| | | WhiteSpace 972..984
+| | | | WhiteSpace 972..984 " "
+| | Statement 984..1006
+| | | AssignStatement 984..1005
+| | | | Expression 984..988
+| | | | | ComponentIdentifier 984..987
+| | | | | | Identifier 984..987
+| | | | | | | Identifier 984..987 "out"
+| | | | | WhiteSpace 987..988
+| | | | | | WhiteSpace 987..988
+| | | | | | | WhiteSpace 987..988 " "
+| | | | RAssignConstraintSignal 988..991
+| | | | | RAssignConstraintSignal 988..991 "<=="
+| | | | WhiteSpace 991..992
+| | | | | WhiteSpace 991..992
+| | | | | | WhiteSpace 991..992 " "
+| | | | Expression 992..1005
+| | | | | ComponentCall 992..1005
+| | | | | | ArrayQuery 992..1001
+| | | | | | | Identifier 992..996
+| | | | | | | | Identifier 992..996
+| | | | | | | | | Identifier 992..996 "comp"
+| | | | | | | LBracket 996..997
+| | | | | | | | LBracket 996..997 "["
+| | | | | | | Sub 997..1000
+| | | | | | | | Identifier 997..998
+| | | | | | | | | Identifier 997..998
+| | | | | | | | | | Identifier 997..998 "N"
+| | | | | | | | Sub 998..999
+| | | | | | | | | Sub 998..999 "-"
+| | | | | | | | Number 999..1000
+| | | | | | | | | Number 999..1000
+| | | | | | | | | | Number 999..1000 "2"
+| | | | | | | RBracket 1000..1001
+| | | | | | | | RBracket 1000..1001 "]"
+| | | | | | Dot 1001..1002
+| | | | | | | Dot 1001..1002 "."
+| | | | | | Identifier 1002..1005
+| | | | | | | Identifier 1002..1005 "out"
+| | | Semicolon 1005..1006
+| | | | Semicolon 1005..1006 ";"
+| | WhiteSpace 1006..1007
+| | | WhiteSpace 1006..1007
+| | | | WhiteSpace 1006..1007 " "
+| | EndLine 1007..1008
+| | | EndLine 1007..1008
+| | | | EndLine 1007..1008 "\n"
+| | WhiteSpace 1008..1020
+| | | WhiteSpace 1008..1020
+| | | | WhiteSpace 1008..1020 " "
+| RCurly 1020..1021
+| | RCurly 1020..1021 "}"
diff --git a/crates/syntax/src/snapshots/syntax__syntax__grammar_tests____src__test_files__happy__pragma.circom.snap b/crates/syntax/src/snapshots/syntax__syntax__grammar_tests____src__test_files__happy__pragma.circom.snap
new file mode 100644
index 0000000..f84ef6f
--- /dev/null
+++ b/crates/syntax/src/snapshots/syntax__syntax__grammar_tests____src__test_files__happy__pragma.circom.snap
@@ -0,0 +1,19 @@
+---
+source: crates/syntax/src/syntax.rs
+expression: "crate::view_syntax::view_ast(&syntax)"
+---
+ Pragma 0..20
+| Pragma 0..6
+| | Pragma 0..6 "pragma"
+| WhiteSpace 6..7
+| | WhiteSpace 6..7
+| | | WhiteSpace 6..7 " "
+| Circom 7..13
+| | Circom 7..13 "circom"
+| WhiteSpace 13..14
+| | WhiteSpace 13..14
+| | | WhiteSpace 13..14 " "
+| Version 14..19
+| | Version 14..19 "2.0.0"
+| Semicolon 19..20
+| | Semicolon 19..20 ";"
diff --git a/crates/syntax/src/snapshots/syntax__syntax__grammar_tests____src__test_files__happy__template.circom.snap b/crates/syntax/src/snapshots/syntax__syntax__grammar_tests____src__test_files__happy__template.circom.snap
new file mode 100644
index 0000000..6d1a073
--- /dev/null
+++ b/crates/syntax/src/snapshots/syntax__syntax__grammar_tests____src__test_files__happy__template.circom.snap
@@ -0,0 +1,358 @@
+---
+source: crates/syntax/src/syntax.rs
+expression: "crate::view_syntax::view_ast(&syntax)"
+---
+ TemplateDef 0..784
+| TemplateKw 0..8
+| | TemplateKw 0..8 "template"
+| WhiteSpace 8..9
+| | WhiteSpace 8..9
+| | | WhiteSpace 8..9 " "
+| TemplateName 9..20
+| | Identifier 9..20
+| | | Identifier 9..20 "MultiplierN"
+| WhiteSpace 20..21
+| | WhiteSpace 20..21
+| | | WhiteSpace 20..21 " "
+| LParen 21..22
+| | LParen 21..22 "("
+| ParameterList 22..30
+| | Identifier 22..23
+| | | Identifier 22..23 "N"
+| | Comma 23..24
+| | | Comma 23..24 ","
+| | WhiteSpace 24..25
+| | | WhiteSpace 24..25
+| | | | WhiteSpace 24..25 " "
+| | Identifier 25..26
+| | | Identifier 25..26 "P"
+| | Comma 26..27
+| | | Comma 26..27 ","
+| | WhiteSpace 27..28
+| | | WhiteSpace 27..28
+| | | | WhiteSpace 27..28 " "
+| | Identifier 28..30
+| | | Identifier 28..30 "QQ"
+| RParen 30..31
+| | RParen 30..31 ")"
+| WhiteSpace 31..32
+| | WhiteSpace 31..32
+| | | WhiteSpace 31..32 " "
+| Block 32..784
+| | LCurly 32..33
+| | | LCurly 32..33 "{"
+| | EndLine 33..34
+| | | EndLine 33..34
+| | | | EndLine 33..34 "\n"
+| | WhiteSpace 34..46
+| | | WhiteSpace 34..46
+| | | | WhiteSpace 34..46 " "
+| | CommentLine 46..86
+| | | CommentLine 46..86
+| | | | CommentLine 46..86 "//Declaration of signals and components."
+| | EndLine 86..87
+| | | EndLine 86..87
+| | | | EndLine 86..87 "\n"
+| | WhiteSpace 87..99
+| | | WhiteSpace 87..99
+| | | | WhiteSpace 87..99 " "
+| | StatementList 99..783
+| | | InputSignalDecl 99..114
+| | | | SignalHeader 99..112
+| | | | | SignalKw 99..105
+| | | | | | SignalKw 99..105 "signal"
+| | | | | WhiteSpace 105..106
+| | | | | | WhiteSpace 105..106
+| | | | | | | WhiteSpace 105..106 " "
+| | | | | InputKw 106..111
+| | | | | | InputKw 106..111 "input"
+| | | | | WhiteSpace 111..112
+| | | | | | WhiteSpace 111..112
+| | | | | | | WhiteSpace 111..112 " "
+| | | | Identifier 112..114
+| | | | | Identifier 112..114 "in"
+| | | Error 114..147
+| | | | Error 114..147
+| | | | | Error 114..147 "expect Semicolon but got LBracket"
+| | | Statement 147..183
+| | | | Error 147..148
+| | | | | Expression 147..148
+| | | | | | Error 147..148
+| | | | | | | LBracket 147..148
+| | | | | | | | LBracket 147..148 "["
+| | | | Error 148..183
+| | | | | Error 148..183
+| | | | | | Error 148..183 "expect Semicolon but got Identifier"
+| | | Statement 183..217
+| | | | Error 183..184
+| | | | | Expression 183..184
+| | | | | | ComponentIdentifier 183..184
+| | | | | | | Identifier 183..184
+| | | | | | | | Identifier 183..184 "N"
+| | | | Error 184..217
+| | | | | Error 184..217
+| | | | | | Error 184..217 "expect Semicolon but got RBracket"
+| | | Statement 217..219
+| | | | Error 217..218
+| | | | | Expression 217..218
+| | | | | | Error 217..218
+| | | | | | | RBracket 217..218
+| | | | | | | | RBracket 217..218 "]"
+| | | | Semicolon 218..219
+| | | | | Semicolon 218..219 ";"
+| | | EndLine 219..220
+| | | | EndLine 219..220
+| | | | | EndLine 219..220 "\n"
+| | | WhiteSpace 220..232
+| | | | WhiteSpace 220..232
+| | | | | WhiteSpace 220..232 " "
+| | | OutputSignalDecl 232..249
+| | | | SignalHeader 232..246
+| | | | | SignalKw 232..238
+| | | | | | SignalKw 232..238 "signal"
+| | | | | WhiteSpace 238..239
+| | | | | | WhiteSpace 238..239
+| | | | | | | WhiteSpace 238..239 " "
+| | | | | OutputKw 239..245
+| | | | | | OutputKw 239..245 "output"
+| | | | | WhiteSpace 245..246
+| | | | | | WhiteSpace 245..246
+| | | | | | | WhiteSpace 245..246 " "
+| | | | Identifier 246..249
+| | | | | Identifier 246..249 "out"
+| | | Semicolon 249..250
+| | | | Semicolon 249..250 ";"
+| | | EndLine 250..251
+| | | | EndLine 250..251
+| | | | | EndLine 250..251 "\n"
+| | | WhiteSpace 251..263
+| | | | WhiteSpace 251..263
+| | | | | WhiteSpace 251..263 " "
+| | | ComponentDecl 263..401
+| | | | ComponentKw 263..272
+| | | | | ComponentKw 263..272 "component"
+| | | | WhiteSpace 272..273
+| | | | | WhiteSpace 272..273
+| | | | | | WhiteSpace 272..273 " "
+| | | | ComponentIdentifier 273..277
+| | | | | Identifier 273..277
+| | | | | | Identifier 273..277 "comp"
+| | | | Error 277..307
+| | | | | Error 277..307
+| | | | | | Error 277..307 "expect Assign but got LBracket"
+| | | | TemplateName 307..341
+| | | | | Error 307..341
+| | | | | | Error 307..341
+| | | | | | | Error 307..341 "expect Identifier but got LBracket"
+| | | | Error 341..371
+| | | | | Error 341..371
+| | | | | | Error 341..371 "expect LParen but got LBracket"
+| | | | Error 371..401
+| | | | | Error 371..401
+| | | | | | Error 371..401 "expect RParen but got LBracket"
+| | | Error 401..434
+| | | | Error 401..434
+| | | | | Error 401..434 "expect Semicolon but got LBracket"
+| | | Statement 434..470
+| | | | Error 434..435
+| | | | | Expression 434..435
+| | | | | | Error 434..435
+| | | | | | | LBracket 434..435
+| | | | | | | | LBracket 434..435 "["
+| | | | Error 435..470
+| | | | | Error 435..470
+| | | | | | Error 435..470 "expect Semicolon but got Identifier"
+| | | Statement 470..499
+| | | | Error 470..471
+| | | | | Expression 470..471
+| | | | | | ComponentIdentifier 470..471
+| | | | | | | Identifier 470..471
+| | | | | | | | Identifier 470..471 "N"
+| | | | Error 471..499
+| | | | | Error 471..499
+| | | | | | Error 471..499 "expect Semicolon but got Sub"
+| | | Statement 499..534
+| | | | Error 499..501
+| | | | | Expression 499..501
+| | | | | | Sub 499..501
+| | | | | | | Sub 499..500
+| | | | | | | | Sub 499..500 "-"
+| | | | | | | Number 500..501
+| | | | | | | | Number 500..501
+| | | | | | | | | Number 500..501 "1"
+| | | | Error 501..534
+| | | | | Error 501..534
+| | | | | | Error 501..534 "expect Semicolon but got RBracket"
+| | | Statement 534..536
+| | | | Error 534..535
+| | | | | Expression 534..535
+| | | | | | Error 534..535
+| | | | | | | RBracket 534..535
+| | | | | | | | RBracket 534..535 "]"
+| | | | Semicolon 535..536
+| | | | | Semicolon 535..536 ";"
+| | | EndLine 536..537
+| | | | EndLine 536..537
+| | | | | EndLine 536..537 "\n"
+| | | WhiteSpace 537..550
+| | | | WhiteSpace 537..550
+| | | | | WhiteSpace 537..550 " "
+| | | EndLine 550..551
+| | | | EndLine 550..551
+| | | | | EndLine 550..551 "\n"
+| | | WhiteSpace 551..563
+| | | | WhiteSpace 551..563
+| | | | | WhiteSpace 551..563 " "
+| | | CommentLine 563..576
+| | | | CommentLine 563..576
+| | | | | CommentLine 563..576 "//Statements."
+| | | EndLine 576..577
+| | | | EndLine 576..577
+| | | | | EndLine 576..577 "\n"
+| | | WhiteSpace 577..589
+| | | | WhiteSpace 577..589
+| | | | | WhiteSpace 577..589 " "
+| | | Statement 589..677
+| | | | ForLoop 589..677
+| | | | | ForKw 589..592
+| | | | | | ForKw 589..592 "for"
+| | | | | LParen 592..593
+| | | | | | LParen 592..593 "("
+| | | | | VarDecl 593..602
+| | | | | | VarKw 593..596
+| | | | | | | VarKw 593..596 "var"
+| | | | | | WhiteSpace 596..597
+| | | | | | | WhiteSpace 596..597
+| | | | | | | | WhiteSpace 596..597 " "
+| | | | | | Identifier 597..598
+| | | | | | | Identifier 597..598 "i"
+| | | | | | WhiteSpace 598..599
+| | | | | | | WhiteSpace 598..599
+| | | | | | | | WhiteSpace 598..599 " "
+| | | | | | Assign 599..600
+| | | | | | | Assign 599..600 "="
+| | | | | | WhiteSpace 600..601
+| | | | | | | WhiteSpace 600..601
+| | | | | | | | WhiteSpace 600..601 " "
+| | | | | | Expression 601..602
+| | | | | | | Number 601..602
+| | | | | | | | Number 601..602
+| | | | | | | | | Number 601..602 "0"
+| | | | | Semicolon 602..603
+| | | | | | Semicolon 602..603 ";"
+| | | | | WhiteSpace 603..604
+| | | | | | WhiteSpace 603..604
+| | | | | | | WhiteSpace 603..604 " "
+| | | | | Expression 604..611
+| | | | | | LessThan 604..611
+| | | | | | | Identifier 604..605
+| | | | | | | | Identifier 604..605
+| | | | | | | | | Identifier 604..605 "i"
+| | | | | | | WhiteSpace 605..606
+| | | | | | | | WhiteSpace 605..606
+| | | | | | | | | WhiteSpace 605..606 " "
+| | | | | | | LessThan 606..607
+| | | | | | | | LessThan 606..607 "<"
+| | | | | | | WhiteSpace 607..608
+| | | | | | | | WhiteSpace 607..608
+| | | | | | | | | WhiteSpace 607..608 " "
+| | | | | | | Sub 608..611
+| | | | | | | | Identifier 608..609
+| | | | | | | | | Identifier 608..609
+| | | | | | | | | | Identifier 608..609 "N"
+| | | | | | | | Sub 609..610
+| | | | | | | | | Sub 609..610 "-"
+| | | | | | | | Number 610..611
+| | | | | | | | | Number 610..611
+| | | | | | | | | | Number 610..611 "1"
+| | | | | Semicolon 611..612
+| | | | | | Semicolon 611..612 ";"
+| | | | | WhiteSpace 612..613
+| | | | | | WhiteSpace 612..613
+| | | | | | | WhiteSpace 612..613 " "
+| | | | | Error 613..614
+| | | | | | Expression 613..614
+| | | | | | | ComponentIdentifier 613..614
+| | | | | | | | Identifier 613..614
+| | | | | | | | | Identifier 613..614 "i"
+| | | | | Error 614..643
+| | | | | | Error 614..643
+| | | | | | | Error 614..643 "expect RParen but got UnitInc"
+| | | | | Error 643..646
+| | | | | | Expression 643..646
+| | | | | | | UnitInc 643..646
+| | | | | | | | UnitInc 643..645
+| | | | | | | | | UnitInc 643..645 "++"
+| | | | | | | | Error 645..646
+| | | | | | | | | RParen 645..646
+| | | | | | | | | | RParen 645..646 ")"
+| | | | | Error 646..677
+| | | | | | Error 646..677
+| | | | | | | Error 646..677 "expect Semicolon but got LCurly"
+| | | Statement 677..765
+| | | | Block 677..765
+| | | | | LCurly 677..678
+| | | | | | LCurly 677..678 "{"
+| | | | | EndLine 678..679
+| | | | | | EndLine 678..679
+| | | | | | | EndLine 678..679 "\n"
+| | | | | WhiteSpace 679..695
+| | | | | | WhiteSpace 679..695
+| | | | | | | WhiteSpace 679..695 " "
+| | | | | StatementList 695..764
+| | | | | | Statement 695..751
+| | | | | | | AssignStatement 695..750
+| | | | | | | | Expression 695..703
+| | | | | | | | | ComponentIdentifier 695..699
+| | | | | | | | | | Identifier 695..699
+| | | | | | | | | | | Identifier 695..699 "comp"
+| | | | | | | | | LBracket 699..700
+| | | | | | | | | | LBracket 699..700 "["
+| | | | | | | | | Expression 700..701
+| | | | | | | | | | Identifier 700..701
+| | | | | | | | | | | Identifier 700..701
+| | | | | | | | | | | | Identifier 700..701 "i"
+| | | | | | | | | RBracket 701..702
+| | | | | | | | | | RBracket 701..702 "]"
+| | | | | | | | | WhiteSpace 702..703
+| | | | | | | | | | WhiteSpace 702..703
+| | | | | | | | | | | WhiteSpace 702..703 " "
+| | | | | | | | Assign 703..704
+| | | | | | | | | Assign 703..704 "="
+| | | | | | | | WhiteSpace 704..705
+| | | | | | | | | WhiteSpace 704..705
+| | | | | | | | | | WhiteSpace 704..705 " "
+| | | | | | | | Expression 705..750
+| | | | | | | | | Call 705..750
+| | | | | | | | | | Identifier 705..716
+| | | | | | | | | | | Identifier 705..716
+| | | | | | | | | | | | Identifier 705..716 "Multiplier2"
+| | | | | | | | | | Tuple 716..750
+| | | | | | | | | | | LParen 716..717
+| | | | | | | | | | | | LParen 716..717 "("
+| | | | | | | | | | | Error 717..749
+| | | | | | | | | | | | Error 717..749
+| | | | | | | | | | | | | Error 717..749 "expect Identifier but got RParen"
+| | | | | | | | | | | RParen 749..750
+| | | | | | | | | | | | RParen 749..750 ")"
+| | | | | | | Semicolon 750..751
+| | | | | | | | Semicolon 750..751 ";"
+| | | | | | EndLine 751..752
+| | | | | | | EndLine 751..752
+| | | | | | | | EndLine 751..752 "\n"
+| | | | | | WhiteSpace 752..764
+| | | | | | | WhiteSpace 752..764
+| | | | | | | | WhiteSpace 752..764 " "
+| | | | | RCurly 764..765
+| | | | | | RCurly 764..765 "}"
+| | | EndLine 765..766
+| | | | EndLine 765..766
+| | | | | EndLine 765..766 "\n"
+| | | WhiteSpace 766..782
+| | | | WhiteSpace 766..782
+| | | | | WhiteSpace 766..782 " "
+| | | EndLine 782..783
+| | | | EndLine 782..783
+| | | | | EndLine 782..783 "\n"
+| | RCurly 783..784
+| | | RCurly 783..784 "}"
diff --git a/crates/syntax/src/snapshots/syntax__syntax__grammar_tests____src__test_files__pragma.circom.snap b/crates/syntax/src/snapshots/syntax__syntax__grammar_tests____src__test_files__pragma.circom.snap
new file mode 100644
index 0000000..f84ef6f
--- /dev/null
+++ b/crates/syntax/src/snapshots/syntax__syntax__grammar_tests____src__test_files__pragma.circom.snap
@@ -0,0 +1,19 @@
+---
+source: crates/syntax/src/syntax.rs
+expression: "crate::view_syntax::view_ast(&syntax)"
+---
+ Pragma 0..20
+| Pragma 0..6
+| | Pragma 0..6 "pragma"
+| WhiteSpace 6..7
+| | WhiteSpace 6..7
+| | | WhiteSpace 6..7 " "
+| Circom 7..13
+| | Circom 7..13 "circom"
+| WhiteSpace 13..14
+| | WhiteSpace 13..14
+| | | WhiteSpace 13..14 " "
+| Version 14..19
+| | Version 14..19 "2.0.0"
+| Semicolon 19..20
+| | Semicolon 19..20 ";"
diff --git a/crates/syntax/src/snapshots/syntax__syntax__grammar_tests__block_happy_test_statements.snap b/crates/syntax/src/snapshots/syntax__syntax__grammar_tests__block_happy_test_statements.snap
index 5db6859..a0e6f49 100644
--- a/crates/syntax/src/snapshots/syntax__syntax__grammar_tests__block_happy_test_statements.snap
+++ b/crates/syntax/src/snapshots/syntax__syntax__grammar_tests__block_happy_test_statements.snap
@@ -2,11 +2,17 @@
source: crates/syntax/src/syntax.rs
expression: statements
---
-- "signal input in[N];"
-- "signal output out;"
-- "component comp[N-1];"
-- "for(var i = 0; i < N-1; i++){\n comp[i] = Multiplier2();\n }"
+- "[expect Semicolon but got Identifier"
+- Nexpect Semicolon but got RBracket
+- "];"
+- "[expect Semicolon but got Identifier"
+- Nexpect Semicolon but got Sub
+- "-1expect Semicolon but got RBracket"
+- "];"
+- for(var i = 0; i < N-1; iexpect RParen but got UnitInc++)expect Semicolon but got LCurly
+- "{\n comp[i] = Multiplier2(expect Identifier but got RParen);\n }"
- "comp[0].in1 <== in[0];"
- "comp[0].in2 <== in[1];"
-- "for(var i = 0; i < N-2; i++){\n comp[i+1].in1 <== comp[i].out;\n comp[i+1].in2 <== in[i+2];\n\n }"
-- "out <== comp[N-2].out;"
\ No newline at end of file
+- for(var i = 0; i < N-2; iexpect RParen but got UnitInc++)expect Semicolon but got LCurly
+- "{\n comp[i+1].in1 <== comp[i].out;\n comp[i+1].in2 <== in[i+2];\n\n }"
+- "out <== comp[N-2].out;"
diff --git a/crates/syntax/src/snapshots/syntax__syntax__grammar_tests__template_happy_test_statements.snap b/crates/syntax/src/snapshots/syntax__syntax__grammar_tests__template_happy_test_statements.snap
index 74cf89f..719979d 100644
--- a/crates/syntax/src/snapshots/syntax__syntax__grammar_tests__template_happy_test_statements.snap
+++ b/crates/syntax/src/snapshots/syntax__syntax__grammar_tests__template_happy_test_statements.snap
@@ -2,7 +2,12 @@
source: crates/syntax/src/syntax.rs
expression: statements
---
-- "signal input in[N];"
-- "signal output out;"
-- "component comp[N-1];"
-- "for(var i = 0; i < N-1; i++){\n comp[i] = Multiplier2();\n }"
+- "[expect Semicolon but got Identifier"
+- Nexpect Semicolon but got RBracket
+- "];"
+- "[expect Semicolon but got Identifier"
+- Nexpect Semicolon but got Sub
+- "-1expect Semicolon but got RBracket"
+- "];"
+- for(var i = 0; i < N-1; iexpect RParen but got UnitInc++)expect Semicolon but got LCurly
+- "{\n comp[i] = Multiplier2(expect Identifier but got RParen);\n }"
diff --git a/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__block.circom.snap b/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__block.circom.snap
new file mode 100644
index 0000000..beaf281
--- /dev/null
+++ b/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__block.circom.snap
@@ -0,0 +1,670 @@
+---
+source: crates/syntax/src/syntax.rs
+expression: "crate::view_syntax::view_ast(&syntax)"
+---
+ Block 0..1021
+| LCurly 0..1
+| | LCurly 0..1 "{"
+| EndLine 1..2
+| | EndLine 1..2
+| | | EndLine 1..2 "\n"
+| WhiteSpace 2..3
+| | WhiteSpace 2..3
+| | | WhiteSpace 2..3 " "
+| CommentLine 3..28
+| | CommentLine 3..28
+| | | CommentLine 3..28 "//Declaration of signals."
+| EndLine 28..29
+| | EndLine 28..29
+| | | EndLine 28..29 "\n"
+| WhiteSpace 29..41
+| | WhiteSpace 29..41
+| | | WhiteSpace 29..41 " "
+| StatementList 41..1020
+| | InputSignalDecl 41..56
+| | | SignalHeader 41..54
+| | | | SignalKw 41..47
+| | | | | SignalKw 41..47 "signal"
+| | | | WhiteSpace 47..48
+| | | | | WhiteSpace 47..48
+| | | | | | WhiteSpace 47..48 " "
+| | | | InputKw 48..53
+| | | | | InputKw 48..53 "input"
+| | | | WhiteSpace 53..54
+| | | | | WhiteSpace 53..54
+| | | | | | WhiteSpace 53..54 " "
+| | | Identifier 54..56
+| | | | Identifier 54..56 "in"
+| | Error 56..89
+| | | Error 56..89
+| | | | Error 56..89 "expect Semicolon but got LBracket"
+| | Statement 89..125
+| | | Error 89..90
+| | | | Expression 89..90
+| | | | | Error 89..90
+| | | | | | LBracket 89..90
+| | | | | | | LBracket 89..90 "["
+| | | Error 90..125
+| | | | Error 90..125
+| | | | | Error 90..125 "expect Semicolon but got Identifier"
+| | Statement 125..159
+| | | Error 125..126
+| | | | Expression 125..126
+| | | | | ComponentIdentifier 125..126
+| | | | | | Identifier 125..126
+| | | | | | | Identifier 125..126 "N"
+| | | Error 126..159
+| | | | Error 126..159
+| | | | | Error 126..159 "expect Semicolon but got RBracket"
+| | Statement 159..161
+| | | Error 159..160
+| | | | Expression 159..160
+| | | | | Error 159..160
+| | | | | | RBracket 159..160
+| | | | | | | RBracket 159..160 "]"
+| | | Semicolon 160..161
+| | | | Semicolon 160..161 ";"
+| | EndLine 161..162
+| | | EndLine 161..162
+| | | | EndLine 161..162 "\n"
+| | WhiteSpace 162..174
+| | | WhiteSpace 162..174
+| | | | WhiteSpace 162..174 " "
+| | OutputSignalDecl 174..191
+| | | SignalHeader 174..188
+| | | | SignalKw 174..180
+| | | | | SignalKw 174..180 "signal"
+| | | | WhiteSpace 180..181
+| | | | | WhiteSpace 180..181
+| | | | | | WhiteSpace 180..181 " "
+| | | | OutputKw 181..187
+| | | | | OutputKw 181..187 "output"
+| | | | WhiteSpace 187..188
+| | | | | WhiteSpace 187..188
+| | | | | | WhiteSpace 187..188 " "
+| | | Identifier 188..191
+| | | | Identifier 188..191 "out"
+| | Semicolon 191..192
+| | | Semicolon 191..192 ";"
+| | EndLine 192..193
+| | | EndLine 192..193
+| | | | EndLine 192..193 "\n"
+| | WhiteSpace 193..205
+| | | WhiteSpace 193..205
+| | | | WhiteSpace 193..205 " "
+| | ComponentDecl 205..343
+| | | ComponentKw 205..214
+| | | | ComponentKw 205..214 "component"
+| | | WhiteSpace 214..215
+| | | | WhiteSpace 214..215
+| | | | | WhiteSpace 214..215 " "
+| | | ComponentIdentifier 215..219
+| | | | Identifier 215..219
+| | | | | Identifier 215..219 "comp"
+| | | Error 219..249
+| | | | Error 219..249
+| | | | | Error 219..249 "expect Assign but got LBracket"
+| | | TemplateName 249..283
+| | | | Error 249..283
+| | | | | Error 249..283
+| | | | | | Error 249..283 "expect Identifier but got LBracket"
+| | | Error 283..313
+| | | | Error 283..313
+| | | | | Error 283..313 "expect LParen but got LBracket"
+| | | Error 313..343
+| | | | Error 313..343
+| | | | | Error 313..343 "expect RParen but got LBracket"
+| | Error 343..376
+| | | Error 343..376
+| | | | Error 343..376 "expect Semicolon but got LBracket"
+| | Statement 376..412
+| | | Error 376..377
+| | | | Expression 376..377
+| | | | | Error 376..377
+| | | | | | LBracket 376..377
+| | | | | | | LBracket 376..377 "["
+| | | Error 377..412
+| | | | Error 377..412
+| | | | | Error 377..412 "expect Semicolon but got Identifier"
+| | Statement 412..441
+| | | Error 412..413
+| | | | Expression 412..413
+| | | | | ComponentIdentifier 412..413
+| | | | | | Identifier 412..413
+| | | | | | | Identifier 412..413 "N"
+| | | Error 413..441
+| | | | Error 413..441
+| | | | | Error 413..441 "expect Semicolon but got Sub"
+| | Statement 441..476
+| | | Error 441..443
+| | | | Expression 441..443
+| | | | | Sub 441..443
+| | | | | | Sub 441..442
+| | | | | | | Sub 441..442 "-"
+| | | | | | Number 442..443
+| | | | | | | Number 442..443
+| | | | | | | | Number 442..443 "1"
+| | | Error 443..476
+| | | | Error 443..476
+| | | | | Error 443..476 "expect Semicolon but got RBracket"
+| | Statement 476..478
+| | | Error 476..477
+| | | | Expression 476..477
+| | | | | Error 476..477
+| | | | | | RBracket 476..477
+| | | | | | | RBracket 476..477 "]"
+| | | Semicolon 477..478
+| | | | Semicolon 477..478 ";"
+| | EndLine 478..479
+| | | EndLine 478..479
+| | | | EndLine 478..479 "\n"
+| | EndLine 479..480
+| | | EndLine 479..480
+| | | | EndLine 479..480 "\n"
+| | WhiteSpace 480..492
+| | | WhiteSpace 480..492
+| | | | WhiteSpace 480..492 " "
+| | CommentLine 492..505
+| | | CommentLine 492..505
+| | | | CommentLine 492..505 "//Statements."
+| | EndLine 505..506
+| | | EndLine 505..506
+| | | | EndLine 505..506 "\n"
+| | WhiteSpace 506..518
+| | | WhiteSpace 506..518
+| | | | WhiteSpace 506..518 " "
+| | Statement 518..606
+| | | ForLoop 518..606
+| | | | ForKw 518..521
+| | | | | ForKw 518..521 "for"
+| | | | LParen 521..522
+| | | | | LParen 521..522 "("
+| | | | VarDecl 522..531
+| | | | | VarKw 522..525
+| | | | | | VarKw 522..525 "var"
+| | | | | WhiteSpace 525..526
+| | | | | | WhiteSpace 525..526
+| | | | | | | WhiteSpace 525..526 " "
+| | | | | Identifier 526..527
+| | | | | | Identifier 526..527 "i"
+| | | | | WhiteSpace 527..528
+| | | | | | WhiteSpace 527..528
+| | | | | | | WhiteSpace 527..528 " "
+| | | | | Assign 528..529
+| | | | | | Assign 528..529 "="
+| | | | | WhiteSpace 529..530
+| | | | | | WhiteSpace 529..530
+| | | | | | | WhiteSpace 529..530 " "
+| | | | | Expression 530..531
+| | | | | | Number 530..531
+| | | | | | | Number 530..531
+| | | | | | | | Number 530..531 "0"
+| | | | Semicolon 531..532
+| | | | | Semicolon 531..532 ";"
+| | | | WhiteSpace 532..533
+| | | | | WhiteSpace 532..533
+| | | | | | WhiteSpace 532..533 " "
+| | | | Expression 533..540
+| | | | | LessThan 533..540
+| | | | | | Identifier 533..534
+| | | | | | | Identifier 533..534
+| | | | | | | | Identifier 533..534 "i"
+| | | | | | WhiteSpace 534..535
+| | | | | | | WhiteSpace 534..535
+| | | | | | | | WhiteSpace 534..535 " "
+| | | | | | LessThan 535..536
+| | | | | | | LessThan 535..536 "<"
+| | | | | | WhiteSpace 536..537
+| | | | | | | WhiteSpace 536..537
+| | | | | | | | WhiteSpace 536..537 " "
+| | | | | | Sub 537..540
+| | | | | | | Identifier 537..538
+| | | | | | | | Identifier 537..538
+| | | | | | | | | Identifier 537..538 "N"
+| | | | | | | Sub 538..539
+| | | | | | | | Sub 538..539 "-"
+| | | | | | | Number 539..540
+| | | | | | | | Number 539..540
+| | | | | | | | | Number 539..540 "1"
+| | | | Semicolon 540..541
+| | | | | Semicolon 540..541 ";"
+| | | | WhiteSpace 541..542
+| | | | | WhiteSpace 541..542
+| | | | | | WhiteSpace 541..542 " "
+| | | | Error 542..543
+| | | | | Expression 542..543
+| | | | | | ComponentIdentifier 542..543
+| | | | | | | Identifier 542..543
+| | | | | | | | Identifier 542..543 "i"
+| | | | Error 543..572
+| | | | | Error 543..572
+| | | | | | Error 543..572 "expect RParen but got UnitInc"
+| | | | Error 572..575
+| | | | | Expression 572..575
+| | | | | | UnitInc 572..575
+| | | | | | | UnitInc 572..574
+| | | | | | | | UnitInc 572..574 "++"
+| | | | | | | Error 574..575
+| | | | | | | | RParen 574..575
+| | | | | | | | | RParen 574..575 ")"
+| | | | Error 575..606
+| | | | | Error 575..606
+| | | | | | Error 575..606 "expect Semicolon but got LCurly"
+| | Statement 606..694
+| | | Block 606..694
+| | | | LCurly 606..607
+| | | | | LCurly 606..607 "{"
+| | | | EndLine 607..608
+| | | | | EndLine 607..608
+| | | | | | EndLine 607..608 "\n"
+| | | | WhiteSpace 608..624
+| | | | | WhiteSpace 608..624
+| | | | | | WhiteSpace 608..624 " "
+| | | | StatementList 624..693
+| | | | | Statement 624..680
+| | | | | | AssignStatement 624..679
+| | | | | | | Expression 624..632
+| | | | | | | | ComponentIdentifier 624..628
+| | | | | | | | | Identifier 624..628
+| | | | | | | | | | Identifier 624..628 "comp"
+| | | | | | | | LBracket 628..629
+| | | | | | | | | LBracket 628..629 "["
+| | | | | | | | Expression 629..630
+| | | | | | | | | Identifier 629..630
+| | | | | | | | | | Identifier 629..630
+| | | | | | | | | | | Identifier 629..630 "i"
+| | | | | | | | RBracket 630..631
+| | | | | | | | | RBracket 630..631 "]"
+| | | | | | | | WhiteSpace 631..632
+| | | | | | | | | WhiteSpace 631..632
+| | | | | | | | | | WhiteSpace 631..632 " "
+| | | | | | | Assign 632..633
+| | | | | | | | Assign 632..633 "="
+| | | | | | | WhiteSpace 633..634
+| | | | | | | | WhiteSpace 633..634
+| | | | | | | | | WhiteSpace 633..634 " "
+| | | | | | | Expression 634..679
+| | | | | | | | Call 634..679
+| | | | | | | | | Identifier 634..645
+| | | | | | | | | | Identifier 634..645
+| | | | | | | | | | | Identifier 634..645 "Multiplier2"
+| | | | | | | | | Tuple 645..679
+| | | | | | | | | | LParen 645..646
+| | | | | | | | | | | LParen 645..646 "("
+| | | | | | | | | | Error 646..678
+| | | | | | | | | | | Error 646..678
+| | | | | | | | | | | | Error 646..678 "expect Identifier but got RParen"
+| | | | | | | | | | RParen 678..679
+| | | | | | | | | | | RParen 678..679 ")"
+| | | | | | Semicolon 679..680
+| | | | | | | Semicolon 679..680 ";"
+| | | | | EndLine 680..681
+| | | | | | EndLine 680..681
+| | | | | | | EndLine 680..681 "\n"
+| | | | | WhiteSpace 681..693
+| | | | | | WhiteSpace 681..693
+| | | | | | | WhiteSpace 681..693 " "
+| | | | RCurly 693..694
+| | | | | RCurly 693..694 "}"
+| | EndLine 694..695
+| | | EndLine 694..695
+| | | | EndLine 694..695 "\n"
+| | WhiteSpace 695..707
+| | | WhiteSpace 695..707
+| | | | WhiteSpace 695..707 " "
+| | Statement 707..729
+| | | AssignStatement 707..728
+| | | | ComponentCall 707..718
+| | | | | ComponentIdentifier 707..711
+| | | | | | Identifier 707..711
+| | | | | | | Identifier 707..711 "comp"
+| | | | | LBracket 711..712
+| | | | | | LBracket 711..712 "["
+| | | | | Expression 712..713
+| | | | | | Number 712..713
+| | | | | | | Number 712..713
+| | | | | | | | Number 712..713 "0"
+| | | | | RBracket 713..714
+| | | | | | RBracket 713..714 "]"
+| | | | | Dot 714..715
+| | | | | | Dot 714..715 "."
+| | | | | Identifier 715..718
+| | | | | | Identifier 715..718 "in1"
+| | | | WhiteSpace 718..719
+| | | | | WhiteSpace 718..719
+| | | | | | WhiteSpace 718..719 " "
+| | | | RAssignConstraintSignal 719..722
+| | | | | RAssignConstraintSignal 719..722 "<=="
+| | | | WhiteSpace 722..723
+| | | | | WhiteSpace 722..723
+| | | | | | WhiteSpace 722..723 " "
+| | | | Expression 723..728
+| | | | | ArrayQuery 723..728
+| | | | | | Identifier 723..725
+| | | | | | | Identifier 723..725
+| | | | | | | | Identifier 723..725 "in"
+| | | | | | LBracket 725..726
+| | | | | | | LBracket 725..726 "["
+| | | | | | Number 726..727
+| | | | | | | Number 726..727
+| | | | | | | | Number 726..727 "0"
+| | | | | | RBracket 727..728
+| | | | | | | RBracket 727..728 "]"
+| | | Semicolon 728..729
+| | | | Semicolon 728..729 ";"
+| | EndLine 729..730
+| | | EndLine 729..730
+| | | | EndLine 729..730 "\n"
+| | WhiteSpace 730..742
+| | | WhiteSpace 730..742
+| | | | WhiteSpace 730..742 " "
+| | Statement 742..764
+| | | AssignStatement 742..763
+| | | | ComponentCall 742..753
+| | | | | ComponentIdentifier 742..746
+| | | | | | Identifier 742..746
+| | | | | | | Identifier 742..746 "comp"
+| | | | | LBracket 746..747
+| | | | | | LBracket 746..747 "["
+| | | | | Expression 747..748
+| | | | | | Number 747..748
+| | | | | | | Number 747..748
+| | | | | | | | Number 747..748 "0"
+| | | | | RBracket 748..749
+| | | | | | RBracket 748..749 "]"
+| | | | | Dot 749..750
+| | | | | | Dot 749..750 "."
+| | | | | Identifier 750..753
+| | | | | | Identifier 750..753 "in2"
+| | | | WhiteSpace 753..754
+| | | | | WhiteSpace 753..754
+| | | | | | WhiteSpace 753..754 " "
+| | | | RAssignConstraintSignal 754..757
+| | | | | RAssignConstraintSignal 754..757 "<=="
+| | | | WhiteSpace 757..758
+| | | | | WhiteSpace 757..758
+| | | | | | WhiteSpace 757..758 " "
+| | | | Expression 758..763
+| | | | | ArrayQuery 758..763
+| | | | | | Identifier 758..760
+| | | | | | | Identifier 758..760
+| | | | | | | | Identifier 758..760 "in"
+| | | | | | LBracket 760..761
+| | | | | | | LBracket 760..761 "["
+| | | | | | Number 761..762
+| | | | | | | Number 761..762
+| | | | | | | | Number 761..762 "1"
+| | | | | | RBracket 762..763
+| | | | | | | RBracket 762..763 "]"
+| | | Semicolon 763..764
+| | | | Semicolon 763..764 ";"
+| | EndLine 764..765
+| | | EndLine 764..765
+| | | | EndLine 764..765 "\n"
+| | WhiteSpace 765..777
+| | | WhiteSpace 765..777
+| | | | WhiteSpace 765..777 " "
+| | Statement 777..865
+| | | ForLoop 777..865
+| | | | ForKw 777..780
+| | | | | ForKw 777..780 "for"
+| | | | LParen 780..781
+| | | | | LParen 780..781 "("
+| | | | VarDecl 781..790
+| | | | | VarKw 781..784
+| | | | | | VarKw 781..784 "var"
+| | | | | WhiteSpace 784..785
+| | | | | | WhiteSpace 784..785
+| | | | | | | WhiteSpace 784..785 " "
+| | | | | Identifier 785..786
+| | | | | | Identifier 785..786 "i"
+| | | | | WhiteSpace 786..787
+| | | | | | WhiteSpace 786..787
+| | | | | | | WhiteSpace 786..787 " "
+| | | | | Assign 787..788
+| | | | | | Assign 787..788 "="
+| | | | | WhiteSpace 788..789
+| | | | | | WhiteSpace 788..789
+| | | | | | | WhiteSpace 788..789 " "
+| | | | | Expression 789..790
+| | | | | | Number 789..790
+| | | | | | | Number 789..790
+| | | | | | | | Number 789..790 "0"
+| | | | Semicolon 790..791
+| | | | | Semicolon 790..791 ";"
+| | | | WhiteSpace 791..792
+| | | | | WhiteSpace 791..792
+| | | | | | WhiteSpace 791..792 " "
+| | | | Expression 792..799
+| | | | | LessThan 792..799
+| | | | | | Identifier 792..793
+| | | | | | | Identifier 792..793
+| | | | | | | | Identifier 792..793 "i"
+| | | | | | WhiteSpace 793..794
+| | | | | | | WhiteSpace 793..794
+| | | | | | | | WhiteSpace 793..794 " "
+| | | | | | LessThan 794..795
+| | | | | | | LessThan 794..795 "<"
+| | | | | | WhiteSpace 795..796
+| | | | | | | WhiteSpace 795..796
+| | | | | | | | WhiteSpace 795..796 " "
+| | | | | | Sub 796..799
+| | | | | | | Identifier 796..797
+| | | | | | | | Identifier 796..797
+| | | | | | | | | Identifier 796..797 "N"
+| | | | | | | Sub 797..798
+| | | | | | | | Sub 797..798 "-"
+| | | | | | | Number 798..799
+| | | | | | | | Number 798..799
+| | | | | | | | | Number 798..799 "2"
+| | | | Semicolon 799..800
+| | | | | Semicolon 799..800 ";"
+| | | | WhiteSpace 800..801
+| | | | | WhiteSpace 800..801
+| | | | | | WhiteSpace 800..801 " "
+| | | | Error 801..802
+| | | | | Expression 801..802
+| | | | | | ComponentIdentifier 801..802
+| | | | | | | Identifier 801..802
+| | | | | | | | Identifier 801..802 "i"
+| | | | Error 802..831
+| | | | | Error 802..831
+| | | | | | Error 802..831 "expect RParen but got UnitInc"
+| | | | Error 831..834
+| | | | | Expression 831..834
+| | | | | | UnitInc 831..834
+| | | | | | | UnitInc 831..833
+| | | | | | | | UnitInc 831..833 "++"
+| | | | | | | Error 833..834
+| | | | | | | | RParen 833..834
+| | | | | | | | | RParen 833..834 ")"
+| | | | Error 834..865
+| | | | | Error 834..865
+| | | | | | Error 834..865 "expect Semicolon but got LCurly"
+| | Statement 865..971
+| | | Block 865..971
+| | | | LCurly 865..866
+| | | | | LCurly 865..866 "{"
+| | | | EndLine 866..867
+| | | | | EndLine 866..867
+| | | | | | EndLine 866..867 "\n"
+| | | | WhiteSpace 867..883
+| | | | | WhiteSpace 867..883
+| | | | | | WhiteSpace 867..883 " "
+| | | | StatementList 883..970
+| | | | | Statement 883..913
+| | | | | | AssignStatement 883..912
+| | | | | | | ComponentCall 883..896
+| | | | | | | | ComponentIdentifier 883..887
+| | | | | | | | | Identifier 883..887
+| | | | | | | | | | Identifier 883..887 "comp"
+| | | | | | | | LBracket 887..888
+| | | | | | | | | LBracket 887..888 "["
+| | | | | | | | Expression 888..891
+| | | | | | | | | Add 888..891
+| | | | | | | | | | Identifier 888..889
+| | | | | | | | | | | Identifier 888..889
+| | | | | | | | | | | | Identifier 888..889 "i"
+| | | | | | | | | | Add 889..890
+| | | | | | | | | | | Add 889..890 "+"
+| | | | | | | | | | Number 890..891
+| | | | | | | | | | | Number 890..891
+| | | | | | | | | | | | Number 890..891 "1"
+| | | | | | | | RBracket 891..892
+| | | | | | | | | RBracket 891..892 "]"
+| | | | | | | | Dot 892..893
+| | | | | | | | | Dot 892..893 "."
+| | | | | | | | Identifier 893..896
+| | | | | | | | | Identifier 893..896 "in1"
+| | | | | | | WhiteSpace 896..897
+| | | | | | | | WhiteSpace 896..897
+| | | | | | | | | WhiteSpace 896..897 " "
+| | | | | | | RAssignConstraintSignal 897..900
+| | | | | | | | RAssignConstraintSignal 897..900 "<=="
+| | | | | | | WhiteSpace 900..901
+| | | | | | | | WhiteSpace 900..901
+| | | | | | | | | WhiteSpace 900..901 " "
+| | | | | | | Expression 901..912
+| | | | | | | | ComponentCall 901..912
+| | | | | | | | | ArrayQuery 901..908
+| | | | | | | | | | Identifier 901..905
+| | | | | | | | | | | Identifier 901..905
+| | | | | | | | | | | | Identifier 901..905 "comp"
+| | | | | | | | | | LBracket 905..906
+| | | | | | | | | | | LBracket 905..906 "["
+| | | | | | | | | | Identifier 906..907
+| | | | | | | | | | | Identifier 906..907
+| | | | | | | | | | | | Identifier 906..907 "i"
+| | | | | | | | | | RBracket 907..908
+| | | | | | | | | | | RBracket 907..908 "]"
+| | | | | | | | | Dot 908..909
+| | | | | | | | | | Dot 908..909 "."
+| | | | | | | | | Identifier 909..912
+| | | | | | | | | | Identifier 909..912 "out"
+| | | | | | Semicolon 912..913
+| | | | | | | Semicolon 912..913 ";"
+| | | | | EndLine 913..914
+| | | | | | EndLine 913..914
+| | | | | | | EndLine 913..914 "\n"
+| | | | | WhiteSpace 914..930
+| | | | | | WhiteSpace 914..930
+| | | | | | | WhiteSpace 914..930 " "
+| | | | | Statement 930..956
+| | | | | | AssignStatement 930..955
+| | | | | | | ComponentCall 930..943
+| | | | | | | | ComponentIdentifier 930..934
+| | | | | | | | | Identifier 930..934
+| | | | | | | | | | Identifier 930..934 "comp"
+| | | | | | | | LBracket 934..935
+| | | | | | | | | LBracket 934..935 "["
+| | | | | | | | Expression 935..938
+| | | | | | | | | Add 935..938
+| | | | | | | | | | Identifier 935..936
+| | | | | | | | | | | Identifier 935..936
+| | | | | | | | | | | | Identifier 935..936 "i"
+| | | | | | | | | | Add 936..937
+| | | | | | | | | | | Add 936..937 "+"
+| | | | | | | | | | Number 937..938
+| | | | | | | | | | | Number 937..938
+| | | | | | | | | | | | Number 937..938 "1"
+| | | | | | | | RBracket 938..939
+| | | | | | | | | RBracket 938..939 "]"
+| | | | | | | | Dot 939..940
+| | | | | | | | | Dot 939..940 "."
+| | | | | | | | Identifier 940..943
+| | | | | | | | | Identifier 940..943 "in2"
+| | | | | | | WhiteSpace 943..944
+| | | | | | | | WhiteSpace 943..944
+| | | | | | | | | WhiteSpace 943..944 " "
+| | | | | | | RAssignConstraintSignal 944..947
+| | | | | | | | RAssignConstraintSignal 944..947 "<=="
+| | | | | | | WhiteSpace 947..948
+| | | | | | | | WhiteSpace 947..948
+| | | | | | | | | WhiteSpace 947..948 " "
+| | | | | | | Expression 948..955
+| | | | | | | | ArrayQuery 948..955
+| | | | | | | | | Identifier 948..950
+| | | | | | | | | | Identifier 948..950
+| | | | | | | | | | | Identifier 948..950 "in"
+| | | | | | | | | LBracket 950..951
+| | | | | | | | | | LBracket 950..951 "["
+| | | | | | | | | Add 951..954
+| | | | | | | | | | Identifier 951..952
+| | | | | | | | | | | Identifier 951..952
+| | | | | | | | | | | | Identifier 951..952 "i"
+| | | | | | | | | | Add 952..953
+| | | | | | | | | | | Add 952..953 "+"
+| | | | | | | | | | Number 953..954
+| | | | | | | | | | | Number 953..954
+| | | | | | | | | | | | Number 953..954 "2"
+| | | | | | | | | RBracket 954..955
+| | | | | | | | | | RBracket 954..955 "]"
+| | | | | | Semicolon 955..956
+| | | | | | | Semicolon 955..956 ";"
+| | | | | EndLine 956..957
+| | | | | | EndLine 956..957
+| | | | | | | EndLine 956..957 "\n"
+| | | | | EndLine 957..958
+| | | | | | EndLine 957..958
+| | | | | | | EndLine 957..958 "\n"
+| | | | | WhiteSpace 958..970
+| | | | | | WhiteSpace 958..970
+| | | | | | | WhiteSpace 958..970 " "
+| | | | RCurly 970..971
+| | | | | RCurly 970..971 "}"
+| | EndLine 971..972
+| | | EndLine 971..972
+| | | | EndLine 971..972 "\n"
+| | WhiteSpace 972..984
+| | | WhiteSpace 972..984
+| | | | WhiteSpace 972..984 " "
+| | Statement 984..1006
+| | | AssignStatement 984..1005
+| | | | Expression 984..988
+| | | | | ComponentIdentifier 984..987
+| | | | | | Identifier 984..987
+| | | | | | | Identifier 984..987 "out"
+| | | | | WhiteSpace 987..988
+| | | | | | WhiteSpace 987..988
+| | | | | | | WhiteSpace 987..988 " "
+| | | | RAssignConstraintSignal 988..991
+| | | | | RAssignConstraintSignal 988..991 "<=="
+| | | | WhiteSpace 991..992
+| | | | | WhiteSpace 991..992
+| | | | | | WhiteSpace 991..992 " "
+| | | | Expression 992..1005
+| | | | | ComponentCall 992..1005
+| | | | | | ArrayQuery 992..1001
+| | | | | | | Identifier 992..996
+| | | | | | | | Identifier 992..996
+| | | | | | | | | Identifier 992..996 "comp"
+| | | | | | | LBracket 996..997
+| | | | | | | | LBracket 996..997 "["
+| | | | | | | Sub 997..1000
+| | | | | | | | Identifier 997..998
+| | | | | | | | | Identifier 997..998
+| | | | | | | | | | Identifier 997..998 "N"
+| | | | | | | | Sub 998..999
+| | | | | | | | | Sub 998..999 "-"
+| | | | | | | | Number 999..1000
+| | | | | | | | | Number 999..1000
+| | | | | | | | | | Number 999..1000 "2"
+| | | | | | | RBracket 1000..1001
+| | | | | | | | RBracket 1000..1001 "]"
+| | | | | | Dot 1001..1002
+| | | | | | | Dot 1001..1002 "."
+| | | | | | Identifier 1002..1005
+| | | | | | | Identifier 1002..1005 "out"
+| | | Semicolon 1005..1006
+| | | | Semicolon 1005..1006 ";"
+| | WhiteSpace 1006..1007
+| | | WhiteSpace 1006..1007
+| | | | WhiteSpace 1006..1007 " "
+| | EndLine 1007..1008
+| | | EndLine 1007..1008
+| | | | EndLine 1007..1008 "\n"
+| | WhiteSpace 1008..1020
+| | | WhiteSpace 1008..1020
+| | | | WhiteSpace 1008..1020 " "
+| RCurly 1020..1021
+| | RCurly 1020..1021 "}"
diff --git a/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__block_comment.circom.snap b/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__block_comment.circom.snap
new file mode 100644
index 0000000..2932d5d
--- /dev/null
+++ b/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__block_comment.circom.snap
@@ -0,0 +1,29 @@
+---
+source: crates/syntax/src/syntax.rs
+expression: "crate::view_syntax::view_ast(&syntax)"
+---
+ CircomProgram 0..42
+| EndLine 0..1
+| | EndLine 0..1
+| | | EndLine 0..1 "\n"
+| BlockComment 1..21
+| | BlockComment 1..21
+| | | BlockComment 1..21 "/*\ncomment\nblocks\n*/"
+| EndLine 21..22
+| | EndLine 21..22
+| | | EndLine 21..22 "\n"
+| Pragma 22..42
+| | Pragma 22..28
+| | | Pragma 22..28 "pragma"
+| | WhiteSpace 28..29
+| | | WhiteSpace 28..29
+| | | | WhiteSpace 28..29 " "
+| | Circom 29..35
+| | | Circom 29..35 "circom"
+| | WhiteSpace 35..36
+| | | WhiteSpace 35..36
+| | | | WhiteSpace 35..36 " "
+| | Version 36..41
+| | | Version 36..41 "2.0.0"
+| | Semicolon 41..42
+| | | Semicolon 41..42 ";"
diff --git a/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__full_circom_program.circom.snap b/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__full_circom_program.circom.snap
new file mode 100644
index 0000000..2886dde
--- /dev/null
+++ b/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__full_circom_program.circom.snap
@@ -0,0 +1,1417 @@
+---
+source: crates/syntax/src/syntax.rs
+expression: "crate::view_syntax::view_ast(&syntax)"
+---
+ CircomProgram 0..3637
+| BlockComment 0..747
+| | BlockComment 0..747
+| | | BlockComment 0..747 "/*\n Copyright 2018 0KIMS association.\n\n This file is part of circom (Zero Knowledge Circuit Compiler).\n\n circom is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n circom is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with circom. If not, see .\n*/"
+| EndLine 747..748
+| | EndLine 747..748
+| | | EndLine 747..748 "\n"
+| BlockComment 748..1434
+| | BlockComment 748..1434
+| | | BlockComment 748..1434 "/*\n\nBinary Sum\n==========\n\nThis component creates a binary sum componet of ops operands and n bits each operand.\n\ne is Number of carries: Depends on the number of operands in the input.\n\nMain Constraint:\n in[0][0] * 2^0 + in[0][1] * 2^1 + ..... + in[0][n-1] * 2^(n-1) +\n + in[1][0] * 2^0 + in[1][1] * 2^1 + ..... + in[1][n-1] * 2^(n-1) +\n + ..\n + in[ops-1][0] * 2^0 + in[ops-1][1] * 2^1 + ..... + in[ops-1][n-1] * 2^(n-1) +\n ===\n out[0] * 2^0 + out[1] * 2^1 + + out[n+e-1] *2(n+e-1)\n\nTo waranty binary outputs:\n\n out[0] * (out[0] - 1) === 0\n out[1] * (out[0] - 1) === 0\n .\n .\n .\n out[n+e-1] * (out[n+e-1] - 1) == 0\n\n */"
+| EndLine 1434..1435
+| | EndLine 1434..1435
+| | | EndLine 1434..1435 "\n"
+| EndLine 1435..1436
+| | EndLine 1435..1436
+| | | EndLine 1435..1436 "\n"
+| EndLine 1436..1437
+| | EndLine 1436..1437
+| | | EndLine 1436..1437 "\n"
+| BlockComment 1437..1531
+| | BlockComment 1437..1531
+| | | BlockComment 1437..1531 "/*\n This function calculates the number of extra bits in the output to do the full sum.\n */"
+| EndLine 1531..1532
+| | EndLine 1531..1532
+| | | EndLine 1531..1532 "\n"
+| WhiteSpace 1532..1533
+| | WhiteSpace 1532..1533
+| | | WhiteSpace 1532..1533 " "
+| Pragma 1533..1553
+| | Pragma 1533..1539
+| | | Pragma 1533..1539 "pragma"
+| | WhiteSpace 1539..1540
+| | | WhiteSpace 1539..1540
+| | | | WhiteSpace 1539..1540 " "
+| | Circom 1540..1546
+| | | Circom 1540..1546 "circom"
+| | WhiteSpace 1546..1547
+| | | WhiteSpace 1546..1547
+| | | | WhiteSpace 1546..1547 " "
+| | Version 1547..1552
+| | | Version 1547..1552 "2.0.0"
+| | Semicolon 1552..1553
+| | | Semicolon 1552..1553 ";"
+| EndLine 1553..1554
+| | EndLine 1553..1554
+| | | EndLine 1553..1554 "\n"
+| EndLine 1554..1555
+| | EndLine 1554..1555
+| | | EndLine 1554..1555 "\n"
+| FunctionDef 1555..1807
+| | FunctionKw 1555..1563
+| | | FunctionKw 1555..1563 "function"
+| | WhiteSpace 1563..1564
+| | | WhiteSpace 1563..1564
+| | | | WhiteSpace 1563..1564 " "
+| | FunctionName 1564..1569
+| | | Identifier 1564..1569
+| | | | Identifier 1564..1569 "nbits"
+| | LParen 1569..1570
+| | | LParen 1569..1570 "("
+| | ParameterList 1570..1571
+| | | Identifier 1570..1571
+| | | | Identifier 1570..1571 "a"
+| | RParen 1571..1572
+| | | RParen 1571..1572 ")"
+| | WhiteSpace 1572..1573
+| | | WhiteSpace 1572..1573
+| | | | WhiteSpace 1572..1573 " "
+| | Block 1573..1807
+| | | LCurly 1573..1574
+| | | | LCurly 1573..1574 "{"
+| | | EndLine 1574..1575
+| | | | EndLine 1574..1575
+| | | | | EndLine 1574..1575 "\n"
+| | | WhiteSpace 1575..1579
+| | | | WhiteSpace 1575..1579
+| | | | | WhiteSpace 1575..1579 " "
+| | | StatementList 1579..1806
+| | | | VarDecl 1579..1588
+| | | | | VarKw 1579..1582
+| | | | | | VarKw 1579..1582 "var"
+| | | | | WhiteSpace 1582..1583
+| | | | | | WhiteSpace 1582..1583
+| | | | | | | WhiteSpace 1582..1583 " "
+| | | | | Identifier 1583..1584
+| | | | | | Identifier 1583..1584 "n"
+| | | | | WhiteSpace 1584..1585
+| | | | | | WhiteSpace 1584..1585
+| | | | | | | WhiteSpace 1584..1585 " "
+| | | | | Assign 1585..1586
+| | | | | | Assign 1585..1586 "="
+| | | | | WhiteSpace 1586..1587
+| | | | | | WhiteSpace 1586..1587
+| | | | | | | WhiteSpace 1586..1587 " "
+| | | | | Expression 1587..1588
+| | | | | | Number 1587..1588
+| | | | | | | Number 1587..1588
+| | | | | | | | Number 1587..1588 "1"
+| | | | Semicolon 1588..1589
+| | | | | Semicolon 1588..1589 ";"
+| | | | EndLine 1589..1590
+| | | | | EndLine 1589..1590
+| | | | | | EndLine 1589..1590 "\n"
+| | | | WhiteSpace 1590..1594
+| | | | | WhiteSpace 1590..1594
+| | | | | | WhiteSpace 1590..1594 " "
+| | | | VarDecl 1594..1603
+| | | | | VarKw 1594..1597
+| | | | | | VarKw 1594..1597 "var"
+| | | | | WhiteSpace 1597..1598
+| | | | | | WhiteSpace 1597..1598
+| | | | | | | WhiteSpace 1597..1598 " "
+| | | | | Identifier 1598..1599
+| | | | | | Identifier 1598..1599 "r"
+| | | | | WhiteSpace 1599..1600
+| | | | | | WhiteSpace 1599..1600
+| | | | | | | WhiteSpace 1599..1600 " "
+| | | | | Assign 1600..1601
+| | | | | | Assign 1600..1601 "="
+| | | | | WhiteSpace 1601..1602
+| | | | | | WhiteSpace 1601..1602
+| | | | | | | WhiteSpace 1601..1602 " "
+| | | | | Expression 1602..1603
+| | | | | | Number 1602..1603
+| | | | | | | Number 1602..1603
+| | | | | | | | Number 1602..1603 "0"
+| | | | Semicolon 1603..1604
+| | | | | Semicolon 1603..1604 ";"
+| | | | EndLine 1604..1605
+| | | | | EndLine 1604..1605
+| | | | | | EndLine 1604..1605 "\n"
+| | | | WhiteSpace 1605..1609
+| | | | | WhiteSpace 1605..1609
+| | | | | | WhiteSpace 1605..1609 " "
+| | | | Statement 1609..1791
+| | | | | WhileKw 1609..1614
+| | | | | | WhileKw 1609..1614 "while"
+| | | | | WhiteSpace 1614..1615
+| | | | | | WhiteSpace 1614..1615
+| | | | | | | WhiteSpace 1614..1615 " "
+| | | | | LParen 1615..1616
+| | | | | | LParen 1615..1616 "("
+| | | | | Expression 1616..1621
+| | | | | | LessThan 1616..1621
+| | | | | | | Sub 1616..1619
+| | | | | | | | Identifier 1616..1617
+| | | | | | | | | Identifier 1616..1617
+| | | | | | | | | | Identifier 1616..1617 "n"
+| | | | | | | | Sub 1617..1618
+| | | | | | | | | Sub 1617..1618 "-"
+| | | | | | | | Number 1618..1619
+| | | | | | | | | Number 1618..1619
+| | | | | | | | | | Number 1618..1619 "1"
+| | | | | | | LessThan 1619..1620
+| | | | | | | | LessThan 1619..1620 "<"
+| | | | | | | Identifier 1620..1621
+| | | | | | | | Identifier 1620..1621
+| | | | | | | | | Identifier 1620..1621 "a"
+| | | | | RParen 1621..1622
+| | | | | | RParen 1621..1622 ")"
+| | | | | WhiteSpace 1622..1623
+| | | | | | WhiteSpace 1622..1623
+| | | | | | | WhiteSpace 1622..1623 " "
+| | | | | Statement 1623..1791
+| | | | | | Block 1623..1791
+| | | | | | | LCurly 1623..1624
+| | | | | | | | LCurly 1623..1624 "{"
+| | | | | | | EndLine 1624..1625
+| | | | | | | | EndLine 1624..1625
+| | | | | | | | | EndLine 1624..1625 "\n"
+| | | | | | | WhiteSpace 1625..1633
+| | | | | | | | WhiteSpace 1625..1633
+| | | | | | | | | WhiteSpace 1625..1633 " "
+| | | | | | | StatementList 1633..1790
+| | | | | | | | Statement 1633..1666
+| | | | | | | | | Error 1633..1634
+| | | | | | | | | | Expression 1633..1634
+| | | | | | | | | | | ComponentIdentifier 1633..1634
+| | | | | | | | | | | | Identifier 1633..1634
+| | | | | | | | | | | | | Identifier 1633..1634 "r"
+| | | | | | | | | Error 1634..1666
+| | | | | | | | | | Error 1634..1666
+| | | | | | | | | | | Error 1634..1666 "expect Semicolon but got UnitInc"
+| | | | | | | | Statement 1666..1713
+| | | | | | | | | Error 1666..1678
+| | | | | | | | | | Expression 1666..1678
+| | | | | | | | | | | UnitInc 1666..1669
+| | | | | | | | | | | | UnitInc 1666..1668
+| | | | | | | | | | | | | UnitInc 1666..1668 "++"
+| | | | | | | | | | | | Error 1668..1669
+| | | | | | | | | | | | | Semicolon 1668..1669
+| | | | | | | | | | | | | | Semicolon 1668..1669 ";"
+| | | | | | | | | | | EndLine 1669..1670
+| | | | | | | | | | | | EndLine 1669..1670
+| | | | | | | | | | | | | EndLine 1669..1670 "\n"
+| | | | | | | | | | | WhiteSpace 1670..1678
+| | | | | | | | | | | | WhiteSpace 1670..1678
+| | | | | | | | | | | | | WhiteSpace 1670..1678 " "
+| | | | | | | | | Error 1678..1713
+| | | | | | | | | | Error 1678..1713
+| | | | | | | | | | | Error 1678..1713 "expect Semicolon but got Identifier"
+| | | | | | | | Statement 1713..1749
+| | | | | | | | | Error 1713..1715
+| | | | | | | | | | Expression 1713..1715
+| | | | | | | | | | | ComponentIdentifier 1713..1714
+| | | | | | | | | | | | Identifier 1713..1714
+| | | | | | | | | | | | | Identifier 1713..1714 "n"
+| | | | | | | | | | | WhiteSpace 1714..1715
+| | | | | | | | | | | | WhiteSpace 1714..1715
+| | | | | | | | | | | | | WhiteSpace 1714..1715 " "
+| | | | | | | | | Error 1715..1749
+| | | | | | | | | | Error 1715..1749
+| | | | | | | | | | | Error 1715..1749 "expect Semicolon but got MulAssign"
+| | | | | | | | Statement 1749..1783
+| | | | | | | | | Error 1749..1752
+| | | | | | | | | | Expression 1749..1751
+| | | | | | | | | | | Error 1749..1751
+| | | | | | | | | | | | MulAssign 1749..1751
+| | | | | | | | | | | | | MulAssign 1749..1751 "*="
+| | | | | | | | | | WhiteSpace 1751..1752
+| | | | | | | | | | | WhiteSpace 1751..1752
+| | | | | | | | | | | | WhiteSpace 1751..1752 " "
+| | | | | | | | | Error 1752..1783
+| | | | | | | | | | Error 1752..1783
+| | | | | | | | | | | Error 1752..1783 "expect Semicolon but got Number"
+| | | | | | | | Statement 1783..1785
+| | | | | | | | | Error 1783..1784
+| | | | | | | | | | Expression 1783..1784
+| | | | | | | | | | | Number 1783..1784
+| | | | | | | | | | | | Number 1783..1784
+| | | | | | | | | | | | | Number 1783..1784 "2"
+| | | | | | | | | Semicolon 1784..1785
+| | | | | | | | | | Semicolon 1784..1785 ";"
+| | | | | | | | EndLine 1785..1786
+| | | | | | | | | EndLine 1785..1786
+| | | | | | | | | | EndLine 1785..1786 "\n"
+| | | | | | | | WhiteSpace 1786..1790
+| | | | | | | | | WhiteSpace 1786..1790
+| | | | | | | | | | WhiteSpace 1786..1790 " "
+| | | | | | | RCurly 1790..1791
+| | | | | | | | RCurly 1790..1791 "}"
+| | | | EndLine 1791..1792
+| | | | | EndLine 1791..1792
+| | | | | | EndLine 1791..1792 "\n"
+| | | | WhiteSpace 1792..1796
+| | | | | WhiteSpace 1792..1796
+| | | | | | WhiteSpace 1792..1796 " "
+| | | | Statement 1796..1805
+| | | | | ReturnKw 1796..1804
+| | | | | | ReturnKw 1796..1802
+| | | | | | | ReturnKw 1796..1802 "return"
+| | | | | | WhiteSpace 1802..1803
+| | | | | | | WhiteSpace 1802..1803
+| | | | | | | | WhiteSpace 1802..1803 " "
+| | | | | | Expression 1803..1804
+| | | | | | | Identifier 1803..1804
+| | | | | | | | Identifier 1803..1804
+| | | | | | | | | Identifier 1803..1804 "r"
+| | | | | Semicolon 1804..1805
+| | | | | | Semicolon 1804..1805 ";"
+| | | | EndLine 1805..1806
+| | | | | EndLine 1805..1806
+| | | | | | EndLine 1805..1806 "\n"
+| | | RCurly 1806..1807
+| | | | RCurly 1806..1807 "}"
+| EndLine 1807..1808
+| | EndLine 1807..1808
+| | | EndLine 1807..1808 "\n"
+| EndLine 1808..1809
+| | EndLine 1808..1809
+| | | EndLine 1808..1809 "\n"
+| EndLine 1809..1810
+| | EndLine 1809..1810
+| | | EndLine 1809..1810 "\n"
+| TemplateDef 1810..3637
+| | TemplateKw 1810..1818
+| | | TemplateKw 1810..1818 "template"
+| | WhiteSpace 1818..1819
+| | | WhiteSpace 1818..1819
+| | | | WhiteSpace 1818..1819 " "
+| | TemplateName 1819..1825
+| | | Identifier 1819..1825
+| | | | Identifier 1819..1825 "BinSum"
+| | LParen 1825..1826
+| | | LParen 1825..1826 "("
+| | ParameterList 1826..1832
+| | | Identifier 1826..1827
+| | | | Identifier 1826..1827 "n"
+| | | Comma 1827..1828
+| | | | Comma 1827..1828 ","
+| | | WhiteSpace 1828..1829
+| | | | WhiteSpace 1828..1829
+| | | | | WhiteSpace 1828..1829 " "
+| | | Identifier 1829..1832
+| | | | Identifier 1829..1832 "ops"
+| | RParen 1832..1833
+| | | RParen 1832..1833 ")"
+| | WhiteSpace 1833..1834
+| | | WhiteSpace 1833..1834
+| | | | WhiteSpace 1833..1834 " "
+| | Block 1834..3637
+| | | LCurly 1834..1835
+| | | | LCurly 1834..1835 "{"
+| | | EndLine 1835..1836
+| | | | EndLine 1835..1836
+| | | | | EndLine 1835..1836 "\n"
+| | | WhiteSpace 1836..1840
+| | | | WhiteSpace 1836..1840
+| | | | | WhiteSpace 1836..1840 " "
+| | | StatementList 1840..3612
+| | | | VarDecl 1840..1950
+| | | | | VarKw 1840..1843
+| | | | | | VarKw 1840..1843 "var"
+| | | | | WhiteSpace 1843..1844
+| | | | | | WhiteSpace 1843..1844
+| | | | | | | WhiteSpace 1843..1844 " "
+| | | | | Identifier 1844..1848
+| | | | | | Identifier 1844..1848 "nout"
+| | | | | WhiteSpace 1848..1849
+| | | | | | WhiteSpace 1848..1849
+| | | | | | | WhiteSpace 1848..1849 " "
+| | | | | Assign 1849..1850
+| | | | | | Assign 1849..1850 "="
+| | | | | WhiteSpace 1850..1851
+| | | | | | WhiteSpace 1850..1851
+| | | | | | | WhiteSpace 1850..1851 " "
+| | | | | Expression 1851..1950
+| | | | | | ArrayQuery 1851..1950
+| | | | | | | Call 1851..1917
+| | | | | | | | Identifier 1851..1856
+| | | | | | | | | Identifier 1851..1856
+| | | | | | | | | | Identifier 1851..1856 "nbits"
+| | | | | | | | Tuple 1856..1917
+| | | | | | | | | LParen 1856..1857
+| | | | | | | | | | LParen 1856..1857 "("
+| | | | | | | | | Error 1857..1889
+| | | | | | | | | | Error 1857..1889
+| | | | | | | | | | | Error 1857..1889 "expect Identifier but got LParen"
+| | | | | | | | | Error 1889..1917
+| | | | | | | | | | Error 1889..1917
+| | | | | | | | | | | Error 1889..1917 "expect RParen but got LParen"
+| | | | | | | LParen 1917..1918
+| | | | | | | | LParen 1917..1918 "("
+| | | | | | | Error 1918..1950
+| | | | | | | | Error 1918..1950
+| | | | | | | | | Error 1918..1950 "expect Identifier but got Number"
+| | | | Error 1950..1981
+| | | | | Error 1950..1981
+| | | | | | Error 1950..1981 "expect Semicolon but got Number"
+| | | | Statement 1981..2019
+| | | | | Error 1981..1988
+| | | | | | Expression 1981..1988
+| | | | | | | Sub 1981..1988
+| | | | | | | | Power 1981..1986
+| | | | | | | | | Number 1981..1982
+| | | | | | | | | | Number 1981..1982
+| | | | | | | | | | | Number 1981..1982 "2"
+| | | | | | | | | Power 1982..1984
+| | | | | | | | | | Power 1982..1984 "**"
+| | | | | | | | | Identifier 1984..1985
+| | | | | | | | | | Identifier 1984..1985
+| | | | | | | | | | | Identifier 1984..1985 "n"
+| | | | | | | | | WhiteSpace 1985..1986
+| | | | | | | | | | WhiteSpace 1985..1986
+| | | | | | | | | | | WhiteSpace 1985..1986 " "
+| | | | | | | | Sub 1986..1987
+| | | | | | | | | Sub 1986..1987 "-"
+| | | | | | | | Number 1987..1988
+| | | | | | | | | Number 1987..1988
+| | | | | | | | | | Number 1987..1988 "1"
+| | | | | Error 1988..2019
+| | | | | | Error 1988..2019
+| | | | | | | Error 1988..2019 "expect Semicolon but got RParen"
+| | | | Statement 2019..2048
+| | | | | Error 2019..2020
+| | | | | | Expression 2019..2020
+| | | | | | | Error 2019..2020
+| | | | | | | | RParen 2019..2020
+| | | | | | | | | RParen 2019..2020 ")"
+| | | | | Error 2020..2048
+| | | | | | Error 2020..2048
+| | | | | | | Error 2020..2048 "expect Semicolon but got Mul"
+| | | | Statement 2048..2084
+| | | | | Error 2048..2049
+| | | | | | Expression 2048..2049
+| | | | | | | Error 2048..2049
+| | | | | | | | Mul 2048..2049
+| | | | | | | | | Mul 2048..2049 "*"
+| | | | | Error 2049..2084
+| | | | | | Error 2049..2084
+| | | | | | | Error 2049..2084 "expect Semicolon but got Identifier"
+| | | | Statement 2084..2118
+| | | | | Error 2084..2087
+| | | | | | Expression 2084..2087
+| | | | | | | ComponentIdentifier 2084..2087
+| | | | | | | | Identifier 2084..2087
+| | | | | | | | | Identifier 2084..2087 "ops"
+| | | | | Error 2087..2118
+| | | | | | Error 2087..2118
+| | | | | | | Error 2087..2118 "expect Semicolon but got RParen"
+| | | | Statement 2118..2120
+| | | | | Error 2118..2119
+| | | | | | Expression 2118..2119
+| | | | | | | Error 2118..2119
+| | | | | | | | RParen 2118..2119
+| | | | | | | | | RParen 2118..2119 ")"
+| | | | | Semicolon 2119..2120
+| | | | | | Semicolon 2119..2120 ";"
+| | | | EndLine 2120..2121
+| | | | | EndLine 2120..2121
+| | | | | | EndLine 2120..2121 "\n"
+| | | | WhiteSpace 2121..2125
+| | | | | WhiteSpace 2121..2125
+| | | | | | WhiteSpace 2121..2125 " "
+| | | | InputSignalDecl 2125..2140
+| | | | | SignalHeader 2125..2138
+| | | | | | SignalKw 2125..2131
+| | | | | | | SignalKw 2125..2131 "signal"
+| | | | | | WhiteSpace 2131..2132
+| | | | | | | WhiteSpace 2131..2132
+| | | | | | | | WhiteSpace 2131..2132 " "
+| | | | | | InputKw 2132..2137
+| | | | | | | InputKw 2132..2137 "input"
+| | | | | | WhiteSpace 2137..2138
+| | | | | | | WhiteSpace 2137..2138
+| | | | | | | | WhiteSpace 2137..2138 " "
+| | | | | Identifier 2138..2140
+| | | | | | Identifier 2138..2140 "in"
+| | | | Error 2140..2173
+| | | | | Error 2140..2173
+| | | | | | Error 2140..2173 "expect Semicolon but got LBracket"
+| | | | Statement 2173..2209
+| | | | | Error 2173..2174
+| | | | | | Expression 2173..2174
+| | | | | | | Error 2173..2174
+| | | | | | | | LBracket 2173..2174
+| | | | | | | | | LBracket 2173..2174 "["
+| | | | | Error 2174..2209
+| | | | | | Error 2174..2209
+| | | | | | | Error 2174..2209 "expect Semicolon but got Identifier"
+| | | | Statement 2209..2245
+| | | | | Error 2209..2212
+| | | | | | Expression 2209..2212
+| | | | | | | ComponentIdentifier 2209..2212
+| | | | | | | | Identifier 2209..2212
+| | | | | | | | | Identifier 2209..2212 "ops"
+| | | | | Error 2212..2245
+| | | | | | Error 2212..2245
+| | | | | | | Error 2212..2245 "expect Semicolon but got RBracket"
+| | | | Statement 2245..2279
+| | | | | Error 2245..2246
+| | | | | | Expression 2245..2246
+| | | | | | | Error 2245..2246
+| | | | | | | | RBracket 2245..2246
+| | | | | | | | | RBracket 2245..2246 "]"
+| | | | | Error 2246..2279
+| | | | | | Error 2246..2279
+| | | | | | | Error 2246..2279 "expect Semicolon but got LBracket"
+| | | | Statement 2279..2315
+| | | | | Error 2279..2280
+| | | | | | Expression 2279..2280
+| | | | | | | Error 2279..2280
+| | | | | | | | LBracket 2279..2280
+| | | | | | | | | LBracket 2279..2280 "["
+| | | | | Error 2280..2315
+| | | | | | Error 2280..2315
+| | | | | | | Error 2280..2315 "expect Semicolon but got Identifier"
+| | | | Statement 2315..2349
+| | | | | Error 2315..2316
+| | | | | | Expression 2315..2316
+| | | | | | | ComponentIdentifier 2315..2316
+| | | | | | | | Identifier 2315..2316
+| | | | | | | | | Identifier 2315..2316 "n"
+| | | | | Error 2316..2349
+| | | | | | Error 2316..2349
+| | | | | | | Error 2316..2349 "expect Semicolon but got RBracket"
+| | | | Statement 2349..2351
+| | | | | Error 2349..2350
+| | | | | | Expression 2349..2350
+| | | | | | | Error 2349..2350
+| | | | | | | | RBracket 2349..2350
+| | | | | | | | | RBracket 2349..2350 "]"
+| | | | | Semicolon 2350..2351
+| | | | | | Semicolon 2350..2351 ";"
+| | | | EndLine 2351..2352
+| | | | | EndLine 2351..2352
+| | | | | | EndLine 2351..2352 "\n"
+| | | | WhiteSpace 2352..2356
+| | | | | WhiteSpace 2352..2356
+| | | | | | WhiteSpace 2352..2356 " "
+| | | | OutputSignalDecl 2356..2373
+| | | | | SignalHeader 2356..2370
+| | | | | | SignalKw 2356..2362
+| | | | | | | SignalKw 2356..2362 "signal"
+| | | | | | WhiteSpace 2362..2363
+| | | | | | | WhiteSpace 2362..2363
+| | | | | | | | WhiteSpace 2362..2363 " "
+| | | | | | OutputKw 2363..2369
+| | | | | | | OutputKw 2363..2369 "output"
+| | | | | | WhiteSpace 2369..2370
+| | | | | | | WhiteSpace 2369..2370
+| | | | | | | | WhiteSpace 2369..2370 " "
+| | | | | Identifier 2370..2373
+| | | | | | Identifier 2370..2373 "out"
+| | | | Error 2373..2406
+| | | | | Error 2373..2406
+| | | | | | Error 2373..2406 "expect Semicolon but got LBracket"
+| | | | Statement 2406..2442
+| | | | | Error 2406..2407
+| | | | | | Expression 2406..2407
+| | | | | | | Error 2406..2407
+| | | | | | | | LBracket 2406..2407
+| | | | | | | | | LBracket 2406..2407 "["
+| | | | | Error 2407..2442
+| | | | | | Error 2407..2442
+| | | | | | | Error 2407..2442 "expect Semicolon but got Identifier"
+| | | | Statement 2442..2479
+| | | | | Error 2442..2446
+| | | | | | Expression 2442..2446
+| | | | | | | ComponentIdentifier 2442..2446
+| | | | | | | | Identifier 2442..2446
+| | | | | | | | | Identifier 2442..2446 "nout"
+| | | | | Error 2446..2479
+| | | | | | Error 2446..2479
+| | | | | | | Error 2446..2479 "expect Semicolon but got RBracket"
+| | | | Statement 2479..2481
+| | | | | Error 2479..2480
+| | | | | | Expression 2479..2480
+| | | | | | | Error 2479..2480
+| | | | | | | | RBracket 2479..2480
+| | | | | | | | | RBracket 2479..2480 "]"
+| | | | | Semicolon 2480..2481
+| | | | | | Semicolon 2480..2481 ";"
+| | | | EndLine 2481..2482
+| | | | | EndLine 2481..2482
+| | | | | | EndLine 2481..2482 "\n"
+| | | | EndLine 2482..2483
+| | | | | EndLine 2482..2483
+| | | | | | EndLine 2482..2483 "\n"
+| | | | WhiteSpace 2483..2487
+| | | | | WhiteSpace 2483..2487
+| | | | | | WhiteSpace 2483..2487 " "
+| | | | VarDecl 2487..2498
+| | | | | VarKw 2487..2490
+| | | | | | VarKw 2487..2490 "var"
+| | | | | WhiteSpace 2490..2491
+| | | | | | WhiteSpace 2490..2491
+| | | | | | | WhiteSpace 2490..2491 " "
+| | | | | Identifier 2491..2494
+| | | | | | Identifier 2491..2494 "lin"
+| | | | | WhiteSpace 2494..2495
+| | | | | | WhiteSpace 2494..2495
+| | | | | | | WhiteSpace 2494..2495 " "
+| | | | | Assign 2495..2496
+| | | | | | Assign 2495..2496 "="
+| | | | | WhiteSpace 2496..2497
+| | | | | | WhiteSpace 2496..2497
+| | | | | | | WhiteSpace 2496..2497 " "
+| | | | | Expression 2497..2498
+| | | | | | Number 2497..2498
+| | | | | | | Number 2497..2498
+| | | | | | | | Number 2497..2498 "0"
+| | | | Semicolon 2498..2499
+| | | | | Semicolon 2498..2499 ";"
+| | | | EndLine 2499..2500
+| | | | | EndLine 2499..2500
+| | | | | | EndLine 2499..2500 "\n"
+| | | | WhiteSpace 2500..2504
+| | | | | WhiteSpace 2500..2504
+| | | | | | WhiteSpace 2500..2504 " "
+| | | | VarDecl 2504..2516
+| | | | | VarKw 2504..2507
+| | | | | | VarKw 2504..2507 "var"
+| | | | | WhiteSpace 2507..2508
+| | | | | | WhiteSpace 2507..2508
+| | | | | | | WhiteSpace 2507..2508 " "
+| | | | | Identifier 2508..2512
+| | | | | | Identifier 2508..2512 "lout"
+| | | | | WhiteSpace 2512..2513
+| | | | | | WhiteSpace 2512..2513
+| | | | | | | WhiteSpace 2512..2513 " "
+| | | | | Assign 2513..2514
+| | | | | | Assign 2513..2514 "="
+| | | | | WhiteSpace 2514..2515
+| | | | | | WhiteSpace 2514..2515
+| | | | | | | WhiteSpace 2514..2515 " "
+| | | | | Expression 2515..2516
+| | | | | | Number 2515..2516
+| | | | | | | Number 2515..2516
+| | | | | | | | Number 2515..2516 "0"
+| | | | Semicolon 2516..2517
+| | | | | Semicolon 2516..2517 ";"
+| | | | EndLine 2517..2518
+| | | | | EndLine 2517..2518
+| | | | | | EndLine 2517..2518 "\n"
+| | | | EndLine 2518..2519
+| | | | | EndLine 2518..2519
+| | | | | | EndLine 2518..2519 "\n"
+| | | | WhiteSpace 2519..2523
+| | | | | WhiteSpace 2519..2523
+| | | | | | WhiteSpace 2519..2523 " "
+| | | | VarDecl 2523..2528
+| | | | | VarKw 2523..2526
+| | | | | | VarKw 2523..2526 "var"
+| | | | | WhiteSpace 2526..2527
+| | | | | | WhiteSpace 2526..2527
+| | | | | | | WhiteSpace 2526..2527 " "
+| | | | | Identifier 2527..2528
+| | | | | | Identifier 2527..2528 "k"
+| | | | Semicolon 2528..2529
+| | | | | Semicolon 2528..2529 ";"
+| | | | EndLine 2529..2530
+| | | | | EndLine 2529..2530
+| | | | | | EndLine 2529..2530 "\n"
+| | | | WhiteSpace 2530..2534
+| | | | | WhiteSpace 2530..2534
+| | | | | | WhiteSpace 2530..2534 " "
+| | | | VarDecl 2534..2539
+| | | | | VarKw 2534..2537
+| | | | | | VarKw 2534..2537 "var"
+| | | | | WhiteSpace 2537..2538
+| | | | | | WhiteSpace 2537..2538
+| | | | | | | WhiteSpace 2537..2538 " "
+| | | | | Identifier 2538..2539
+| | | | | | Identifier 2538..2539 "j"
+| | | | Semicolon 2539..2540
+| | | | | Semicolon 2539..2540 ";"
+| | | | EndLine 2540..2541
+| | | | | EndLine 2540..2541
+| | | | | | EndLine 2540..2541 "\n"
+| | | | EndLine 2541..2542
+| | | | | EndLine 2541..2542
+| | | | | | EndLine 2541..2542 "\n"
+| | | | WhiteSpace 2542..2546
+| | | | | WhiteSpace 2542..2546
+| | | | | | WhiteSpace 2542..2546 " "
+| | | | VarDecl 2546..2552
+| | | | | VarKw 2546..2549
+| | | | | | VarKw 2546..2549 "var"
+| | | | | WhiteSpace 2549..2550
+| | | | | | WhiteSpace 2549..2550
+| | | | | | | WhiteSpace 2549..2550 " "
+| | | | | Identifier 2550..2552
+| | | | | | Identifier 2550..2552 "e2"
+| | | | Semicolon 2552..2553
+| | | | | Semicolon 2552..2553 ";"
+| | | | EndLine 2553..2554
+| | | | | EndLine 2553..2554
+| | | | | | EndLine 2553..2554 "\n"
+| | | | EndLine 2554..2555
+| | | | | EndLine 2554..2555
+| | | | | | EndLine 2554..2555 "\n"
+| | | | WhiteSpace 2555..2559
+| | | | | WhiteSpace 2555..2559
+| | | | | | WhiteSpace 2555..2559 " "
+| | | | Statement 2559..2566
+| | | | | AssignStatement 2559..2565
+| | | | | | Expression 2559..2562
+| | | | | | | ComponentIdentifier 2559..2561
+| | | | | | | | Identifier 2559..2561
+| | | | | | | | | Identifier 2559..2561 "e2"
+| | | | | | | WhiteSpace 2561..2562
+| | | | | | | | WhiteSpace 2561..2562
+| | | | | | | | | WhiteSpace 2561..2562 " "
+| | | | | | Assign 2562..2563
+| | | | | | | Assign 2562..2563 "="
+| | | | | | WhiteSpace 2563..2564
+| | | | | | | WhiteSpace 2563..2564
+| | | | | | | | WhiteSpace 2563..2564 " "
+| | | | | | Expression 2564..2565
+| | | | | | | Number 2564..2565
+| | | | | | | | Number 2564..2565
+| | | | | | | | | Number 2564..2565 "1"
+| | | | | Semicolon 2565..2566
+| | | | | | Semicolon 2565..2566 ";"
+| | | | EndLine 2566..2567
+| | | | | EndLine 2566..2567
+| | | | | | EndLine 2566..2567 "\n"
+| | | | WhiteSpace 2567..2571
+| | | | | WhiteSpace 2567..2571
+| | | | | | WhiteSpace 2567..2571 " "
+| | | | Statement 2571..2651
+| | | | | ForLoop 2571..2651
+| | | | | | ForKw 2571..2574
+| | | | | | | ForKw 2571..2574 "for"
+| | | | | | WhiteSpace 2574..2575
+| | | | | | | WhiteSpace 2574..2575
+| | | | | | | | WhiteSpace 2574..2575 " "
+| | | | | | LParen 2575..2576
+| | | | | | | LParen 2575..2576 "("
+| | | | | | AssignStatement 2576..2579
+| | | | | | | Expression 2576..2577
+| | | | | | | | ComponentIdentifier 2576..2577
+| | | | | | | | | Identifier 2576..2577
+| | | | | | | | | | Identifier 2576..2577 "k"
+| | | | | | | Assign 2577..2578
+| | | | | | | | Assign 2577..2578 "="
+| | | | | | | Expression 2578..2579
+| | | | | | | | Number 2578..2579
+| | | | | | | | | Number 2578..2579
+| | | | | | | | | | Number 2578..2579 "0"
+| | | | | | Semicolon 2579..2580
+| | | | | | | Semicolon 2579..2580 ";"
+| | | | | | WhiteSpace 2580..2581
+| | | | | | | WhiteSpace 2580..2581
+| | | | | | | | WhiteSpace 2580..2581 " "
+| | | | | | Expression 2581..2584
+| | | | | | | LessThan 2581..2584
+| | | | | | | | Identifier 2581..2582
+| | | | | | | | | Identifier 2581..2582
+| | | | | | | | | | Identifier 2581..2582 "k"
+| | | | | | | | LessThan 2582..2583
+| | | | | | | | | LessThan 2582..2583 "<"
+| | | | | | | | Identifier 2583..2584
+| | | | | | | | | Identifier 2583..2584
+| | | | | | | | | | Identifier 2583..2584 "n"
+| | | | | | Semicolon 2584..2585
+| | | | | | | Semicolon 2584..2585 ";"
+| | | | | | WhiteSpace 2585..2586
+| | | | | | | WhiteSpace 2585..2586
+| | | | | | | | WhiteSpace 2585..2586 " "
+| | | | | | Error 2586..2587
+| | | | | | | Expression 2586..2587
+| | | | | | | | ComponentIdentifier 2586..2587
+| | | | | | | | | Identifier 2586..2587
+| | | | | | | | | | Identifier 2586..2587 "k"
+| | | | | | Error 2587..2616
+| | | | | | | Error 2587..2616
+| | | | | | | | Error 2587..2616 "expect RParen but got UnitInc"
+| | | | | | Error 2616..2620
+| | | | | | | Expression 2616..2620
+| | | | | | | | UnitInc 2616..2619
+| | | | | | | | | UnitInc 2616..2618
+| | | | | | | | | | UnitInc 2616..2618 "++"
+| | | | | | | | | Error 2618..2619
+| | | | | | | | | | RParen 2618..2619
+| | | | | | | | | | | RParen 2618..2619 ")"
+| | | | | | | | WhiteSpace 2619..2620
+| | | | | | | | | WhiteSpace 2619..2620
+| | | | | | | | | | WhiteSpace 2619..2620 " "
+| | | | | | Error 2620..2651
+| | | | | | | Error 2620..2651
+| | | | | | | | Error 2620..2651 "expect Semicolon but got LCurly"
+| | | | Statement 2651..3611
+| | | | | Block 2651..3611
+| | | | | | LCurly 2651..2652
+| | | | | | | LCurly 2651..2652 "{"
+| | | | | | EndLine 2652..2653
+| | | | | | | EndLine 2652..2653
+| | | | | | | | EndLine 2652..2653 "\n"
+| | | | | | WhiteSpace 2653..2661
+| | | | | | | WhiteSpace 2653..2661
+| | | | | | | | WhiteSpace 2653..2661 " "
+| | | | | | StatementList 2661..3610
+| | | | | | | Statement 2661..2743
+| | | | | | | | ForLoop 2661..2743
+| | | | | | | | | ForKw 2661..2664
+| | | | | | | | | | ForKw 2661..2664 "for"
+| | | | | | | | | WhiteSpace 2664..2665
+| | | | | | | | | | WhiteSpace 2664..2665
+| | | | | | | | | | | WhiteSpace 2664..2665 " "
+| | | | | | | | | LParen 2665..2666
+| | | | | | | | | | LParen 2665..2666 "("
+| | | | | | | | | AssignStatement 2666..2669
+| | | | | | | | | | Expression 2666..2667
+| | | | | | | | | | | ComponentIdentifier 2666..2667
+| | | | | | | | | | | | Identifier 2666..2667
+| | | | | | | | | | | | | Identifier 2666..2667 "j"
+| | | | | | | | | | Assign 2667..2668
+| | | | | | | | | | | Assign 2667..2668 "="
+| | | | | | | | | | Expression 2668..2669
+| | | | | | | | | | | Number 2668..2669
+| | | | | | | | | | | | Number 2668..2669
+| | | | | | | | | | | | | Number 2668..2669 "0"
+| | | | | | | | | Semicolon 2669..2670
+| | | | | | | | | | Semicolon 2669..2670 ";"
+| | | | | | | | | WhiteSpace 2670..2671
+| | | | | | | | | | WhiteSpace 2670..2671
+| | | | | | | | | | | WhiteSpace 2670..2671 " "
+| | | | | | | | | Expression 2671..2676
+| | | | | | | | | | LessThan 2671..2676
+| | | | | | | | | | | Identifier 2671..2672
+| | | | | | | | | | | | Identifier 2671..2672
+| | | | | | | | | | | | | Identifier 2671..2672 "j"
+| | | | | | | | | | | LessThan 2672..2673
+| | | | | | | | | | | | LessThan 2672..2673 "<"
+| | | | | | | | | | | Identifier 2673..2676
+| | | | | | | | | | | | Identifier 2673..2676
+| | | | | | | | | | | | | Identifier 2673..2676 "ops"
+| | | | | | | | | Semicolon 2676..2677
+| | | | | | | | | | Semicolon 2676..2677 ";"
+| | | | | | | | | WhiteSpace 2677..2678
+| | | | | | | | | | WhiteSpace 2677..2678
+| | | | | | | | | | | WhiteSpace 2677..2678 " "
+| | | | | | | | | Error 2678..2679
+| | | | | | | | | | Expression 2678..2679
+| | | | | | | | | | | ComponentIdentifier 2678..2679
+| | | | | | | | | | | | Identifier 2678..2679
+| | | | | | | | | | | | | Identifier 2678..2679 "j"
+| | | | | | | | | Error 2679..2708
+| | | | | | | | | | Error 2679..2708
+| | | | | | | | | | | Error 2679..2708 "expect RParen but got UnitInc"
+| | | | | | | | | Error 2708..2712
+| | | | | | | | | | Expression 2708..2712
+| | | | | | | | | | | UnitInc 2708..2711
+| | | | | | | | | | | | UnitInc 2708..2710
+| | | | | | | | | | | | | UnitInc 2708..2710 "++"
+| | | | | | | | | | | | Error 2710..2711
+| | | | | | | | | | | | | RParen 2710..2711
+| | | | | | | | | | | | | | RParen 2710..2711 ")"
+| | | | | | | | | | | WhiteSpace 2711..2712
+| | | | | | | | | | | | WhiteSpace 2711..2712
+| | | | | | | | | | | | | WhiteSpace 2711..2712 " "
+| | | | | | | | | Error 2712..2743
+| | | | | | | | | | Error 2712..2743
+| | | | | | | | | | | Error 2712..2743 "expect Semicolon but got LCurly"
+| | | | | | | Statement 2743..3021
+| | | | | | | | Block 2743..3021
+| | | | | | | | | LCurly 2743..2744
+| | | | | | | | | | LCurly 2743..2744 "{"
+| | | | | | | | | EndLine 2744..2745
+| | | | | | | | | | EndLine 2744..2745
+| | | | | | | | | | | EndLine 2744..2745 "\n"
+| | | | | | | | | WhiteSpace 2745..2757
+| | | | | | | | | | WhiteSpace 2745..2757
+| | | | | | | | | | | WhiteSpace 2745..2757 " "
+| | | | | | | | | StatementList 2757..3020
+| | | | | | | | | | Statement 2757..2795
+| | | | | | | | | | | Error 2757..2761
+| | | | | | | | | | | | Expression 2757..2761
+| | | | | | | | | | | | | ComponentIdentifier 2757..2760
+| | | | | | | | | | | | | | Identifier 2757..2760
+| | | | | | | | | | | | | | | Identifier 2757..2760 "lin"
+| | | | | | | | | | | | | WhiteSpace 2760..2761
+| | | | | | | | | | | | | | WhiteSpace 2760..2761
+| | | | | | | | | | | | | | | WhiteSpace 2760..2761 " "
+| | | | | | | | | | | Error 2761..2795
+| | | | | | | | | | | | Error 2761..2795
+| | | | | | | | | | | | | Error 2761..2795 "expect Semicolon but got AddAssign"
+| | | | | | | | | | Statement 2795..2833
+| | | | | | | | | | | Error 2795..2798
+| | | | | | | | | | | | Expression 2795..2797
+| | | | | | | | | | | | | Error 2795..2797
+| | | | | | | | | | | | | | AddAssign 2795..2797
+| | | | | | | | | | | | | | | AddAssign 2795..2797 "+="
+| | | | | | | | | | | | WhiteSpace 2797..2798
+| | | | | | | | | | | | | WhiteSpace 2797..2798
+| | | | | | | | | | | | | | WhiteSpace 2797..2798 " "
+| | | | | | | | | | | Error 2798..2833
+| | | | | | | | | | | | Error 2798..2833
+| | | | | | | | | | | | | Error 2798..2833 "expect Semicolon but got Identifier"
+| | | | | | | | | | Statement 2833..2871
+| | | | | | | | | | | Error 2833..2838
+| | | | | | | | | | | | Expression 2833..2838
+| | | | | | | | | | | | | ComponentIdentifier 2833..2835
+| | | | | | | | | | | | | | Identifier 2833..2835
+| | | | | | | | | | | | | | | Identifier 2833..2835 "in"
+| | | | | | | | | | | | | LBracket 2835..2836
+| | | | | | | | | | | | | | LBracket 2835..2836 "["
+| | | | | | | | | | | | | Expression 2836..2837
+| | | | | | | | | | | | | | Identifier 2836..2837
+| | | | | | | | | | | | | | | Identifier 2836..2837
+| | | | | | | | | | | | | | | | Identifier 2836..2837 "j"
+| | | | | | | | | | | | | RBracket 2837..2838
+| | | | | | | | | | | | | | RBracket 2837..2838 "]"
+| | | | | | | | | | | Error 2838..2871
+| | | | | | | | | | | | Error 2838..2871
+| | | | | | | | | | | | | Error 2838..2871 "expect Semicolon but got LBracket"
+| | | | | | | | | | Statement 2871..2907
+| | | | | | | | | | | Error 2871..2872
+| | | | | | | | | | | | Expression 2871..2872
+| | | | | | | | | | | | | Error 2871..2872
+| | | | | | | | | | | | | | LBracket 2871..2872
+| | | | | | | | | | | | | | | LBracket 2871..2872 "["
+| | | | | | | | | | | Error 2872..2907
+| | | | | | | | | | | | Error 2872..2907
+| | | | | | | | | | | | | Error 2872..2907 "expect Semicolon but got Identifier"
+| | | | | | | | | | Statement 2907..2941
+| | | | | | | | | | | Error 2907..2908
+| | | | | | | | | | | | Expression 2907..2908
+| | | | | | | | | | | | | ComponentIdentifier 2907..2908
+| | | | | | | | | | | | | | Identifier 2907..2908
+| | | | | | | | | | | | | | | Identifier 2907..2908 "k"
+| | | | | | | | | | | Error 2908..2941
+| | | | | | | | | | | | Error 2908..2941
+| | | | | | | | | | | | | Error 2908..2941 "expect Semicolon but got RBracket"
+| | | | | | | | | | Statement 2941..2971
+| | | | | | | | | | | Error 2941..2943
+| | | | | | | | | | | | Expression 2941..2942
+| | | | | | | | | | | | | Error 2941..2942
+| | | | | | | | | | | | | | RBracket 2941..2942
+| | | | | | | | | | | | | | | RBracket 2941..2942 "]"
+| | | | | | | | | | | | WhiteSpace 2942..2943
+| | | | | | | | | | | | | WhiteSpace 2942..2943
+| | | | | | | | | | | | | | WhiteSpace 2942..2943 " "
+| | | | | | | | | | | Error 2943..2971
+| | | | | | | | | | | | Error 2943..2971
+| | | | | | | | | | | | | Error 2943..2971 "expect Semicolon but got Mul"
+| | | | | | | | | | Statement 2971..3008
+| | | | | | | | | | | Error 2971..2973
+| | | | | | | | | | | | Expression 2971..2972
+| | | | | | | | | | | | | Error 2971..2972
+| | | | | | | | | | | | | | Mul 2971..2972
+| | | | | | | | | | | | | | | Mul 2971..2972 "*"
+| | | | | | | | | | | | WhiteSpace 2972..2973
+| | | | | | | | | | | | | WhiteSpace 2972..2973
+| | | | | | | | | | | | | | WhiteSpace 2972..2973 " "
+| | | | | | | | | | | Error 2973..3008
+| | | | | | | | | | | | Error 2973..3008
+| | | | | | | | | | | | | Error 2973..3008 "expect Semicolon but got Identifier"
+| | | | | | | | | | Statement 3008..3011
+| | | | | | | | | | | Error 3008..3010
+| | | | | | | | | | | | Expression 3008..3010
+| | | | | | | | | | | | | ComponentIdentifier 3008..3010
+| | | | | | | | | | | | | | Identifier 3008..3010
+| | | | | | | | | | | | | | | Identifier 3008..3010 "e2"
+| | | | | | | | | | | Semicolon 3010..3011
+| | | | | | | | | | | | Semicolon 3010..3011 ";"
+| | | | | | | | | | EndLine 3011..3012
+| | | | | | | | | | | EndLine 3011..3012
+| | | | | | | | | | | | EndLine 3011..3012 "\n"
+| | | | | | | | | | WhiteSpace 3012..3020
+| | | | | | | | | | | WhiteSpace 3012..3020
+| | | | | | | | | | | | WhiteSpace 3012..3020 " "
+| | | | | | | | | RCurly 3020..3021
+| | | | | | | | | | RCurly 3020..3021 "}"
+| | | | | | | EndLine 3021..3022
+| | | | | | | | EndLine 3021..3022
+| | | | | | | | | EndLine 3021..3022 "\n"
+| | | | | | | WhiteSpace 3022..3030
+| | | | | | | | WhiteSpace 3022..3030
+| | | | | | | | | WhiteSpace 3022..3030 " "
+| | | | | | | Statement 3030..3043
+| | | | | | | | AssignStatement 3030..3042
+| | | | | | | | | Expression 3030..3033
+| | | | | | | | | | ComponentIdentifier 3030..3032
+| | | | | | | | | | | Identifier 3030..3032
+| | | | | | | | | | | | Identifier 3030..3032 "e2"
+| | | | | | | | | | WhiteSpace 3032..3033
+| | | | | | | | | | | WhiteSpace 3032..3033
+| | | | | | | | | | | | WhiteSpace 3032..3033 " "
+| | | | | | | | | Assign 3033..3034
+| | | | | | | | | | Assign 3033..3034 "="
+| | | | | | | | | WhiteSpace 3034..3035
+| | | | | | | | | | WhiteSpace 3034..3035
+| | | | | | | | | | | WhiteSpace 3034..3035 " "
+| | | | | | | | | Expression 3035..3042
+| | | | | | | | | | Add 3035..3042
+| | | | | | | | | | | Identifier 3035..3037
+| | | | | | | | | | | | Identifier 3035..3037
+| | | | | | | | | | | | | Identifier 3035..3037 "e2"
+| | | | | | | | | | | WhiteSpace 3037..3038
+| | | | | | | | | | | | WhiteSpace 3037..3038
+| | | | | | | | | | | | | WhiteSpace 3037..3038 " "
+| | | | | | | | | | | Add 3038..3039
+| | | | | | | | | | | | Add 3038..3039 "+"
+| | | | | | | | | | | WhiteSpace 3039..3040
+| | | | | | | | | | | | WhiteSpace 3039..3040
+| | | | | | | | | | | | | WhiteSpace 3039..3040 " "
+| | | | | | | | | | | Identifier 3040..3042
+| | | | | | | | | | | | Identifier 3040..3042
+| | | | | | | | | | | | | Identifier 3040..3042 "e2"
+| | | | | | | | Semicolon 3042..3043
+| | | | | | | | | Semicolon 3042..3043 ";"
+| | | | | | | EndLine 3043..3044
+| | | | | | | | EndLine 3043..3044
+| | | | | | | | | EndLine 3043..3044 "\n"
+| | | | | | | WhiteSpace 3044..3048
+| | | | | | | | WhiteSpace 3044..3048
+| | | | | | | | | WhiteSpace 3044..3048 " "
+| | | | | | | EndLine 3048..3049
+| | | | | | | | EndLine 3048..3049
+| | | | | | | | | EndLine 3048..3049 "\n"
+| | | | | | | WhiteSpace 3049..3057
+| | | | | | | | WhiteSpace 3049..3057
+| | | | | | | | | WhiteSpace 3049..3057 " "
+| | | | | | | Statement 3057..3064
+| | | | | | | | AssignStatement 3057..3063
+| | | | | | | | | Expression 3057..3060
+| | | | | | | | | | ComponentIdentifier 3057..3059
+| | | | | | | | | | | Identifier 3057..3059
+| | | | | | | | | | | | Identifier 3057..3059 "e2"
+| | | | | | | | | | WhiteSpace 3059..3060
+| | | | | | | | | | | WhiteSpace 3059..3060
+| | | | | | | | | | | | WhiteSpace 3059..3060 " "
+| | | | | | | | | Assign 3060..3061
+| | | | | | | | | | Assign 3060..3061 "="
+| | | | | | | | | WhiteSpace 3061..3062
+| | | | | | | | | | WhiteSpace 3061..3062
+| | | | | | | | | | | WhiteSpace 3061..3062 " "
+| | | | | | | | | Expression 3062..3063
+| | | | | | | | | | Number 3062..3063
+| | | | | | | | | | | Number 3062..3063
+| | | | | | | | | | | | Number 3062..3063 "1"
+| | | | | | | | Semicolon 3063..3064
+| | | | | | | | | Semicolon 3063..3064 ";"
+| | | | | | | EndLine 3064..3065
+| | | | | | | | EndLine 3064..3065
+| | | | | | | | | EndLine 3064..3065 "\n"
+| | | | | | | WhiteSpace 3065..3073
+| | | | | | | | WhiteSpace 3065..3073
+| | | | | | | | | WhiteSpace 3065..3073 " "
+| | | | | | | Statement 3073..3156
+| | | | | | | | ForLoop 3073..3156
+| | | | | | | | | ForKw 3073..3076
+| | | | | | | | | | ForKw 3073..3076 "for"
+| | | | | | | | | WhiteSpace 3076..3077
+| | | | | | | | | | WhiteSpace 3076..3077
+| | | | | | | | | | | WhiteSpace 3076..3077 " "
+| | | | | | | | | LParen 3077..3078
+| | | | | | | | | | LParen 3077..3078 "("
+| | | | | | | | | AssignStatement 3078..3081
+| | | | | | | | | | Expression 3078..3079
+| | | | | | | | | | | ComponentIdentifier 3078..3079
+| | | | | | | | | | | | Identifier 3078..3079
+| | | | | | | | | | | | | Identifier 3078..3079 "k"
+| | | | | | | | | | Assign 3079..3080
+| | | | | | | | | | | Assign 3079..3080 "="
+| | | | | | | | | | Expression 3080..3081
+| | | | | | | | | | | Number 3080..3081
+| | | | | | | | | | | | Number 3080..3081
+| | | | | | | | | | | | | Number 3080..3081 "0"
+| | | | | | | | | Semicolon 3081..3082
+| | | | | | | | | | Semicolon 3081..3082 ";"
+| | | | | | | | | WhiteSpace 3082..3083
+| | | | | | | | | | WhiteSpace 3082..3083
+| | | | | | | | | | | WhiteSpace 3082..3083 " "
+| | | | | | | | | Expression 3083..3089
+| | | | | | | | | | LessThan 3083..3089
+| | | | | | | | | | | Identifier 3083..3084
+| | | | | | | | | | | | Identifier 3083..3084
+| | | | | | | | | | | | | Identifier 3083..3084 "k"
+| | | | | | | | | | | LessThan 3084..3085
+| | | | | | | | | | | | LessThan 3084..3085 "<"
+| | | | | | | | | | | Identifier 3085..3089
+| | | | | | | | | | | | Identifier 3085..3089
+| | | | | | | | | | | | | Identifier 3085..3089 "nout"
+| | | | | | | | | Semicolon 3089..3090
+| | | | | | | | | | Semicolon 3089..3090 ";"
+| | | | | | | | | WhiteSpace 3090..3091
+| | | | | | | | | | WhiteSpace 3090..3091
+| | | | | | | | | | | WhiteSpace 3090..3091 " "
+| | | | | | | | | Error 3091..3092
+| | | | | | | | | | Expression 3091..3092
+| | | | | | | | | | | ComponentIdentifier 3091..3092
+| | | | | | | | | | | | Identifier 3091..3092
+| | | | | | | | | | | | | Identifier 3091..3092 "k"
+| | | | | | | | | Error 3092..3121
+| | | | | | | | | | Error 3092..3121
+| | | | | | | | | | | Error 3092..3121 "expect RParen but got UnitInc"
+| | | | | | | | | Error 3121..3125
+| | | | | | | | | | Expression 3121..3125
+| | | | | | | | | | | UnitInc 3121..3124
+| | | | | | | | | | | | UnitInc 3121..3123
+| | | | | | | | | | | | | UnitInc 3121..3123 "++"
+| | | | | | | | | | | | Error 3123..3124
+| | | | | | | | | | | | | RParen 3123..3124
+| | | | | | | | | | | | | | RParen 3123..3124 ")"
+| | | | | | | | | | | WhiteSpace 3124..3125
+| | | | | | | | | | | | WhiteSpace 3124..3125
+| | | | | | | | | | | | | WhiteSpace 3124..3125 " "
+| | | | | | | | | Error 3125..3156
+| | | | | | | | | | Error 3125..3156
+| | | | | | | | | | | Error 3125..3156 "expect Semicolon but got LCurly"
+| | | | | | | Statement 3156..3546
+| | | | | | | | Block 3156..3546
+| | | | | | | | | LCurly 3156..3157
+| | | | | | | | | | LCurly 3156..3157 "{"
+| | | | | | | | | EndLine 3157..3158
+| | | | | | | | | | EndLine 3157..3158
+| | | | | | | | | | | EndLine 3157..3158 "\n"
+| | | | | | | | | WhiteSpace 3158..3170
+| | | | | | | | | | WhiteSpace 3158..3170
+| | | | | | | | | | | WhiteSpace 3158..3170 " "
+| | | | | | | | | StatementList 3170..3545
+| | | | | | | | | | Statement 3170..3196
+| | | | | | | | | | | AssignStatement 3170..3195
+| | | | | | | | | | | | Expression 3170..3177
+| | | | | | | | | | | | | ComponentIdentifier 3170..3173
+| | | | | | | | | | | | | | Identifier 3170..3173
+| | | | | | | | | | | | | | | Identifier 3170..3173 "out"
+| | | | | | | | | | | | | LBracket 3173..3174
+| | | | | | | | | | | | | | LBracket 3173..3174 "["
+| | | | | | | | | | | | | Expression 3174..3175
+| | | | | | | | | | | | | | Identifier 3174..3175
+| | | | | | | | | | | | | | | Identifier 3174..3175
+| | | | | | | | | | | | | | | | Identifier 3174..3175 "k"
+| | | | | | | | | | | | | RBracket 3175..3176
+| | | | | | | | | | | | | | RBracket 3175..3176 "]"
+| | | | | | | | | | | | | WhiteSpace 3176..3177
+| | | | | | | | | | | | | | WhiteSpace 3176..3177
+| | | | | | | | | | | | | | | WhiteSpace 3176..3177 " "
+| | | | | | | | | | | | RAssignSignal 3177..3180
+| | | | | | | | | | | | | RAssignSignal 3177..3180 "<--"
+| | | | | | | | | | | | WhiteSpace 3180..3181
+| | | | | | | | | | | | | WhiteSpace 3180..3181
+| | | | | | | | | | | | | | WhiteSpace 3180..3181 " "
+| | | | | | | | | | | | Expression 3181..3195
+| | | | | | | | | | | | | BitAnd 3181..3195
+| | | | | | | | | | | | | | Tuple 3181..3191
+| | | | | | | | | | | | | | | LParen 3181..3182
+| | | | | | | | | | | | | | | | LParen 3181..3182 "("
+| | | | | | | | | | | | | | | ShiftR 3182..3190
+| | | | | | | | | | | | | | | | Identifier 3182..3185
+| | | | | | | | | | | | | | | | | Identifier 3182..3185
+| | | | | | | | | | | | | | | | | | Identifier 3182..3185 "lin"
+| | | | | | | | | | | | | | | | WhiteSpace 3185..3186
+| | | | | | | | | | | | | | | | | WhiteSpace 3185..3186
+| | | | | | | | | | | | | | | | | | WhiteSpace 3185..3186 " "
+| | | | | | | | | | | | | | | | ShiftR 3186..3188
+| | | | | | | | | | | | | | | | | ShiftR 3186..3188 ">>"
+| | | | | | | | | | | | | | | | WhiteSpace 3188..3189
+| | | | | | | | | | | | | | | | | WhiteSpace 3188..3189
+| | | | | | | | | | | | | | | | | | WhiteSpace 3188..3189 " "
+| | | | | | | | | | | | | | | | Identifier 3189..3190
+| | | | | | | | | | | | | | | | | Identifier 3189..3190
+| | | | | | | | | | | | | | | | | | Identifier 3189..3190 "k"
+| | | | | | | | | | | | | | | RParen 3190..3191
+| | | | | | | | | | | | | | | | RParen 3190..3191 ")"
+| | | | | | | | | | | | | | WhiteSpace 3191..3192
+| | | | | | | | | | | | | | | WhiteSpace 3191..3192
+| | | | | | | | | | | | | | | | WhiteSpace 3191..3192 " "
+| | | | | | | | | | | | | | BitAnd 3192..3193
+| | | | | | | | | | | | | | | BitAnd 3192..3193 "&"
+| | | | | | | | | | | | | | WhiteSpace 3193..3194
+| | | | | | | | | | | | | | | WhiteSpace 3193..3194
+| | | | | | | | | | | | | | | | WhiteSpace 3193..3194 " "
+| | | | | | | | | | | | | | Number 3194..3195
+| | | | | | | | | | | | | | | Number 3194..3195
+| | | | | | | | | | | | | | | | Number 3194..3195 "1"
+| | | | | | | | | | | Semicolon 3195..3196
+| | | | | | | | | | | | Semicolon 3195..3196 ";"
+| | | | | | | | | | EndLine 3196..3197
+| | | | | | | | | | | EndLine 3196..3197
+| | | | | | | | | | | | EndLine 3196..3197 "\n"
+| | | | | | | | | | WhiteSpace 3197..3201
+| | | | | | | | | | | WhiteSpace 3197..3201
+| | | | | | | | | | | | WhiteSpace 3197..3201 " "
+| | | | | | | | | | EndLine 3201..3202
+| | | | | | | | | | | EndLine 3201..3202
+| | | | | | | | | | | | EndLine 3201..3202 "\n"
+| | | | | | | | | | WhiteSpace 3202..3214
+| | | | | | | | | | | WhiteSpace 3202..3214
+| | | | | | | | | | | | WhiteSpace 3202..3214 " "
+| | | | | | | | | | CommentLine 3214..3237
+| | | | | | | | | | | CommentLine 3214..3237
+| | | | | | | | | | | | CommentLine 3214..3237 "// Ensure out is binary"
+| | | | | | | | | | EndLine 3237..3238
+| | | | | | | | | | | EndLine 3237..3238
+| | | | | | | | | | | | EndLine 3237..3238 "\n"
+| | | | | | | | | | WhiteSpace 3238..3250
+| | | | | | | | | | | WhiteSpace 3238..3250
+| | | | | | | | | | | | WhiteSpace 3238..3250 " "
+| | | | | | | | | | Statement 3250..3285
+| | | | | | | | | | | Error 3250..3257
+| | | | | | | | | | | | Expression 3250..3257
+| | | | | | | | | | | | | ComponentIdentifier 3250..3253
+| | | | | | | | | | | | | | Identifier 3250..3253
+| | | | | | | | | | | | | | | Identifier 3250..3253 "out"
+| | | | | | | | | | | | | LBracket 3253..3254
+| | | | | | | | | | | | | | LBracket 3253..3254 "["
+| | | | | | | | | | | | | Expression 3254..3255
+| | | | | | | | | | | | | | Identifier 3254..3255
+| | | | | | | | | | | | | | | Identifier 3254..3255
+| | | | | | | | | | | | | | | | Identifier 3254..3255 "k"
+| | | | | | | | | | | | | RBracket 3255..3256
+| | | | | | | | | | | | | | RBracket 3255..3256 "]"
+| | | | | | | | | | | | | WhiteSpace 3256..3257
+| | | | | | | | | | | | | | WhiteSpace 3256..3257
+| | | | | | | | | | | | | | | WhiteSpace 3256..3257 " "
+| | | | | | | | | | | Error 3257..3285
+| | | | | | | | | | | | Error 3257..3285
+| | | | | | | | | | | | | Error 3257..3285 "expect Semicolon but got Mul"
+| | | | | | | | | | Statement 3285..3318
+| | | | | | | | | | | Error 3285..3287
+| | | | | | | | | | | | Expression 3285..3286
+| | | | | | | | | | | | | Error 3285..3286
+| | | | | | | | | | | | | | Mul 3285..3286
+| | | | | | | | | | | | | | | Mul 3285..3286 "*"
+| | | | | | | | | | | | WhiteSpace 3286..3287
+| | | | | | | | | | | | | WhiteSpace 3286..3287
+| | | | | | | | | | | | | | WhiteSpace 3286..3287 " "
+| | | | | | | | | | | Error 3287..3318
+| | | | | | | | | | | | Error 3287..3318
+| | | | | | | | | | | | | Error 3287..3318 "expect Semicolon but got LParen"
+| | | | | | | | | | Statement 3318..3337
+| | | | | | | | | | | AssignStatement 3318..3336
+| | | | | | | | | | | | Expression 3318..3331
+| | | | | | | | | | | | | Tuple 3318..3330
+| | | | | | | | | | | | | | LParen 3318..3319
+| | | | | | | | | | | | | | | LParen 3318..3319 "("
+| | | | | | | | | | | | | | Sub 3319..3329
+| | | | | | | | | | | | | | | ArrayQuery 3319..3325
+| | | | | | | | | | | | | | | | Identifier 3319..3322
+| | | | | | | | | | | | | | | | | Identifier 3319..3322
+| | | | | | | | | | | | | | | | | | Identifier 3319..3322 "out"
+| | | | | | | | | | | | | | | | LBracket 3322..3323
+| | | | | | | | | | | | | | | | | LBracket 3322..3323 "["
+| | | | | | | | | | | | | | | | Identifier 3323..3324
+| | | | | | | | | | | | | | | | | Identifier 3323..3324
+| | | | | | | | | | | | | | | | | | Identifier 3323..3324 "k"
+| | | | | | | | | | | | | | | | RBracket 3324..3325
+| | | | | | | | | | | | | | | | | RBracket 3324..3325 "]"
+| | | | | | | | | | | | | | | WhiteSpace 3325..3326
+| | | | | | | | | | | | | | | | WhiteSpace 3325..3326
+| | | | | | | | | | | | | | | | | WhiteSpace 3325..3326 " "
+| | | | | | | | | | | | | | | Sub 3326..3327
+| | | | | | | | | | | | | | | | Sub 3326..3327 "-"
+| | | | | | | | | | | | | | | WhiteSpace 3327..3328
+| | | | | | | | | | | | | | | | WhiteSpace 3327..3328
+| | | | | | | | | | | | | | | | | WhiteSpace 3327..3328 " "
+| | | | | | | | | | | | | | | Number 3328..3329
+| | | | | | | | | | | | | | | | Number 3328..3329
+| | | | | | | | | | | | | | | | | Number 3328..3329 "1"
+| | | | | | | | | | | | | | RParen 3329..3330
+| | | | | | | | | | | | | | | RParen 3329..3330 ")"
+| | | | | | | | | | | | | WhiteSpace 3330..3331
+| | | | | | | | | | | | | | WhiteSpace 3330..3331
+| | | | | | | | | | | | | | | WhiteSpace 3330..3331 " "
+| | | | | | | | | | | | EqualSignal 3331..3334
+| | | | | | | | | | | | | EqualSignal 3331..3334 "==="
+| | | | | | | | | | | | WhiteSpace 3334..3335
+| | | | | | | | | | | | | WhiteSpace 3334..3335
+| | | | | | | | | | | | | | WhiteSpace 3334..3335 " "
+| | | | | | | | | | | | Expression 3335..3336
+| | | | | | | | | | | | | Number 3335..3336
+| | | | | | | | | | | | | | Number 3335..3336
+| | | | | | | | | | | | | | | Number 3335..3336 "0"
+| | | | | | | | | | | Semicolon 3336..3337
+| | | | | | | | | | | | Semicolon 3336..3337 ";"
+| | | | | | | | | | EndLine 3337..3338
+| | | | | | | | | | | EndLine 3337..3338
+| | | | | | | | | | | | EndLine 3337..3338 "\n"
+| | | | | | | | | | WhiteSpace 3338..3342
+| | | | | | | | | | | WhiteSpace 3338..3342
+| | | | | | | | | | | | WhiteSpace 3338..3342 " "
+| | | | | | | | | | EndLine 3342..3343
+| | | | | | | | | | | EndLine 3342..3343
+| | | | | | | | | | | | EndLine 3342..3343 "\n"
+| | | | | | | | | | WhiteSpace 3343..3355
+| | | | | | | | | | | WhiteSpace 3343..3355
+| | | | | | | | | | | | WhiteSpace 3343..3355 " "
+| | | | | | | | | | Statement 3355..3394
+| | | | | | | | | | | Error 3355..3360
+| | | | | | | | | | | | Expression 3355..3360
+| | | | | | | | | | | | | ComponentIdentifier 3355..3359
+| | | | | | | | | | | | | | Identifier 3355..3359
+| | | | | | | | | | | | | | | Identifier 3355..3359 "lout"
+| | | | | | | | | | | | | WhiteSpace 3359..3360
+| | | | | | | | | | | | | | WhiteSpace 3359..3360
+| | | | | | | | | | | | | | | WhiteSpace 3359..3360 " "
+| | | | | | | | | | | Error 3360..3394
+| | | | | | | | | | | | Error 3360..3394
+| | | | | | | | | | | | | Error 3360..3394 "expect Semicolon but got AddAssign"
+| | | | | | | | | | Statement 3394..3432
+| | | | | | | | | | | Error 3394..3397
+| | | | | | | | | | | | Expression 3394..3396
+| | | | | | | | | | | | | Error 3394..3396
+| | | | | | | | | | | | | | AddAssign 3394..3396
+| | | | | | | | | | | | | | | AddAssign 3394..3396 "+="
+| | | | | | | | | | | | WhiteSpace 3396..3397
+| | | | | | | | | | | | | WhiteSpace 3396..3397
+| | | | | | | | | | | | | | WhiteSpace 3396..3397 " "
+| | | | | | | | | | | Error 3397..3432
+| | | | | | | | | | | | Error 3397..3432
+| | | | | | | | | | | | | Error 3397..3432 "expect Semicolon but got Identifier"
+| | | | | | | | | | Statement 3432..3467
+| | | | | | | | | | | Error 3432..3439
+| | | | | | | | | | | | Expression 3432..3439
+| | | | | | | | | | | | | ComponentIdentifier 3432..3435
+| | | | | | | | | | | | | | Identifier 3432..3435
+| | | | | | | | | | | | | | | Identifier 3432..3435 "out"
+| | | | | | | | | | | | | LBracket 3435..3436
+| | | | | | | | | | | | | | LBracket 3435..3436 "["
+| | | | | | | | | | | | | Expression 3436..3437
+| | | | | | | | | | | | | | Identifier 3436..3437
+| | | | | | | | | | | | | | | Identifier 3436..3437
+| | | | | | | | | | | | | | | | Identifier 3436..3437 "k"
+| | | | | | | | | | | | | RBracket 3437..3438
+| | | | | | | | | | | | | | RBracket 3437..3438 "]"
+| | | | | | | | | | | | | WhiteSpace 3438..3439
+| | | | | | | | | | | | | | WhiteSpace 3438..3439
+| | | | | | | | | | | | | | | WhiteSpace 3438..3439 " "
+| | | | | | | | | | | Error 3439..3467
+| | | | | | | | | | | | Error 3439..3467
+| | | | | | | | | | | | | Error 3439..3467 "expect Semicolon but got Mul"
+| | | | | | | | | | Statement 3467..3504
+| | | | | | | | | | | Error 3467..3469
+| | | | | | | | | | | | Expression 3467..3468
+| | | | | | | | | | | | | Error 3467..3468
+| | | | | | | | | | | | | | Mul 3467..3468
+| | | | | | | | | | | | | | | Mul 3467..3468 "*"
+| | | | | | | | | | | | WhiteSpace 3468..3469
+| | | | | | | | | | | | | WhiteSpace 3468..3469
+| | | | | | | | | | | | | | WhiteSpace 3468..3469 " "
+| | | | | | | | | | | Error 3469..3504
+| | | | | | | | | | | | Error 3469..3504
+| | | | | | | | | | | | | Error 3469..3504 "expect Semicolon but got Identifier"
+| | | | | | | | | | Statement 3504..3507
+| | | | | | | | | | | Error 3504..3506
+| | | | | | | | | | | | Expression 3504..3506
+| | | | | | | | | | | | | ComponentIdentifier 3504..3506
+| | | | | | | | | | | | | | Identifier 3504..3506
+| | | | | | | | | | | | | | | Identifier 3504..3506 "e2"
+| | | | | | | | | | | Semicolon 3506..3507
+| | | | | | | | | | | | Semicolon 3506..3507 ";"
+| | | | | | | | | | EndLine 3507..3508
+| | | | | | | | | | | EndLine 3507..3508
+| | | | | | | | | | | | EndLine 3507..3508 "\n"
+| | | | | | | | | | WhiteSpace 3508..3512
+| | | | | | | | | | | WhiteSpace 3508..3512
+| | | | | | | | | | | | WhiteSpace 3508..3512 " "
+| | | | | | | | | | EndLine 3512..3513
+| | | | | | | | | | | EndLine 3512..3513
+| | | | | | | | | | | | EndLine 3512..3513 "\n"
+| | | | | | | | | | WhiteSpace 3513..3525
+| | | | | | | | | | | WhiteSpace 3513..3525
+| | | | | | | | | | | | WhiteSpace 3513..3525 " "
+| | | | | | | | | | Statement 3525..3536
+| | | | | | | | | | | AssignStatement 3525..3535
+| | | | | | | | | | | | Expression 3525..3528
+| | | | | | | | | | | | | ComponentIdentifier 3525..3527
+| | | | | | | | | | | | | | Identifier 3525..3527
+| | | | | | | | | | | | | | | Identifier 3525..3527 "e2"
+| | | | | | | | | | | | | WhiteSpace 3527..3528
+| | | | | | | | | | | | | | WhiteSpace 3527..3528
+| | | | | | | | | | | | | | | WhiteSpace 3527..3528 " "
+| | | | | | | | | | | | Assign 3528..3529
+| | | | | | | | | | | | | Assign 3528..3529 "="
+| | | | | | | | | | | | WhiteSpace 3529..3530
+| | | | | | | | | | | | | WhiteSpace 3529..3530
+| | | | | | | | | | | | | | WhiteSpace 3529..3530 " "
+| | | | | | | | | | | | Expression 3530..3535
+| | | | | | | | | | | | | Add 3530..3535
+| | | | | | | | | | | | | | Identifier 3530..3532
+| | | | | | | | | | | | | | | Identifier 3530..3532
+| | | | | | | | | | | | | | | | Identifier 3530..3532 "e2"
+| | | | | | | | | | | | | | Add 3532..3533
+| | | | | | | | | | | | | | | Add 3532..3533 "+"
+| | | | | | | | | | | | | | Identifier 3533..3535
+| | | | | | | | | | | | | | | Identifier 3533..3535
+| | | | | | | | | | | | | | | | Identifier 3533..3535 "e2"
+| | | | | | | | | | | Semicolon 3535..3536
+| | | | | | | | | | | | Semicolon 3535..3536 ";"
+| | | | | | | | | | EndLine 3536..3537
+| | | | | | | | | | | EndLine 3536..3537
+| | | | | | | | | | | | EndLine 3536..3537 "\n"
+| | | | | | | | | | WhiteSpace 3537..3545
+| | | | | | | | | | | WhiteSpace 3537..3545
+| | | | | | | | | | | | WhiteSpace 3537..3545 " "
+| | | | | | | | | RCurly 3545..3546
+| | | | | | | | | | RCurly 3545..3546 "}"
+| | | | | | | EndLine 3546..3547
+| | | | | | | | EndLine 3546..3547
+| | | | | | | | | EndLine 3546..3547 "\n"
+| | | | | | | WhiteSpace 3547..3551
+| | | | | | | | WhiteSpace 3547..3551
+| | | | | | | | | WhiteSpace 3547..3551 " "
+| | | | | | | EndLine 3551..3552
+| | | | | | | | EndLine 3551..3552
+| | | | | | | | | EndLine 3551..3552 "\n"
+| | | | | | | WhiteSpace 3552..3560
+| | | | | | | | WhiteSpace 3552..3560
+| | | | | | | | | WhiteSpace 3552..3560 " "
+| | | | | | | CommentLine 3560..3578
+| | | | | | | | CommentLine 3560..3578
+| | | | | | | | | CommentLine 3560..3578 "// Ensure the sum;"
+| | | | | | | EndLine 3578..3579
+| | | | | | | | EndLine 3578..3579
+| | | | | | | | | EndLine 3578..3579 "\n"
+| | | | | | | WhiteSpace 3579..3583
+| | | | | | | | WhiteSpace 3579..3583
+| | | | | | | | | WhiteSpace 3579..3583 " "
+| | | | | | | EndLine 3583..3584
+| | | | | | | | EndLine 3583..3584
+| | | | | | | | | EndLine 3583..3584 "\n"
+| | | | | | | WhiteSpace 3584..3592
+| | | | | | | | WhiteSpace 3584..3592
+| | | | | | | | | WhiteSpace 3584..3592 " "
+| | | | | | | Statement 3592..3605
+| | | | | | | | AssignStatement 3592..3604
+| | | | | | | | | Expression 3592..3596
+| | | | | | | | | | ComponentIdentifier 3592..3595
+| | | | | | | | | | | Identifier 3592..3595
+| | | | | | | | | | | | Identifier 3592..3595 "lin"
+| | | | | | | | | | WhiteSpace 3595..3596
+| | | | | | | | | | | WhiteSpace 3595..3596
+| | | | | | | | | | | | WhiteSpace 3595..3596 " "
+| | | | | | | | | EqualSignal 3596..3599
+| | | | | | | | | | EqualSignal 3596..3599 "==="
+| | | | | | | | | WhiteSpace 3599..3600
+| | | | | | | | | | WhiteSpace 3599..3600
+| | | | | | | | | | | WhiteSpace 3599..3600 " "
+| | | | | | | | | Expression 3600..3604
+| | | | | | | | | | Identifier 3600..3604
+| | | | | | | | | | | Identifier 3600..3604
+| | | | | | | | | | | | Identifier 3600..3604 "lout"
+| | | | | | | | Semicolon 3604..3605
+| | | | | | | | | Semicolon 3604..3605 ";"
+| | | | | | | EndLine 3605..3606
+| | | | | | | | EndLine 3605..3606
+| | | | | | | | | EndLine 3605..3606 "\n"
+| | | | | | | WhiteSpace 3606..3610
+| | | | | | | | WhiteSpace 3606..3610
+| | | | | | | | | WhiteSpace 3606..3610 " "
+| | | | | | RCurly 3610..3611
+| | | | | | | RCurly 3610..3611 "}"
+| | | | EndLine 3611..3612
+| | | | | EndLine 3611..3612
+| | | | | | EndLine 3611..3612 "\n"
+| | | Error 3612..3637
+| | | | Error 3612..3637
+| | | | | Error 3612..3637 "expect RCurly but got EOF"
diff --git a/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__line_comment.circom.snap b/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__line_comment.circom.snap
new file mode 100644
index 0000000..cb78791
--- /dev/null
+++ b/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__line_comment.circom.snap
@@ -0,0 +1,38 @@
+---
+source: crates/syntax/src/syntax.rs
+expression: "crate::view_syntax::view_ast(&syntax)"
+---
+ CircomProgram 0..41
+| EndLine 0..1
+| | EndLine 0..1
+| | | EndLine 0..1 "\n"
+| CommentLine 1..14
+| | CommentLine 1..14
+| | | CommentLine 1..14 "// comment :>"
+| EndLine 14..15
+| | EndLine 14..15
+| | | EndLine 14..15 "\n"
+| EndLine 15..16
+| | EndLine 15..16
+| | | EndLine 15..16 "\n"
+| WhiteSpace 16..20
+| | WhiteSpace 16..20
+| | | WhiteSpace 16..20 " "
+| Pragma 20..40
+| | Pragma 20..26
+| | | Pragma 20..26 "pragma"
+| | WhiteSpace 26..27
+| | | WhiteSpace 26..27
+| | | | WhiteSpace 26..27 " "
+| | Circom 27..33
+| | | Circom 27..33 "circom"
+| | WhiteSpace 33..34
+| | | WhiteSpace 33..34
+| | | | WhiteSpace 33..34 " "
+| | Version 34..39
+| | | Version 34..39 "2.0.0"
+| | Semicolon 39..40
+| | | Semicolon 39..40 ";"
+| EndLine 40..41
+| | EndLine 40..41
+| | | EndLine 40..41 "\n"
diff --git a/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__pragma.circom.snap b/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__pragma.circom.snap
new file mode 100644
index 0000000..f84ef6f
--- /dev/null
+++ b/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__pragma.circom.snap
@@ -0,0 +1,19 @@
+---
+source: crates/syntax/src/syntax.rs
+expression: "crate::view_syntax::view_ast(&syntax)"
+---
+ Pragma 0..20
+| Pragma 0..6
+| | Pragma 0..6 "pragma"
+| WhiteSpace 6..7
+| | WhiteSpace 6..7
+| | | WhiteSpace 6..7 " "
+| Circom 7..13
+| | Circom 7..13 "circom"
+| WhiteSpace 13..14
+| | WhiteSpace 13..14
+| | | WhiteSpace 13..14 " "
+| Version 14..19
+| | Version 14..19 "2.0.0"
+| Semicolon 19..20
+| | Semicolon 19..20 ";"
diff --git a/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__template.circom.snap b/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__template.circom.snap
new file mode 100644
index 0000000..6d1a073
--- /dev/null
+++ b/crates/syntax/src/snapshots/syntax__syntax__tests____src__test_files__happy__template.circom.snap
@@ -0,0 +1,358 @@
+---
+source: crates/syntax/src/syntax.rs
+expression: "crate::view_syntax::view_ast(&syntax)"
+---
+ TemplateDef 0..784
+| TemplateKw 0..8
+| | TemplateKw 0..8 "template"
+| WhiteSpace 8..9
+| | WhiteSpace 8..9
+| | | WhiteSpace 8..9 " "
+| TemplateName 9..20
+| | Identifier 9..20
+| | | Identifier 9..20 "MultiplierN"
+| WhiteSpace 20..21
+| | WhiteSpace 20..21
+| | | WhiteSpace 20..21 " "
+| LParen 21..22
+| | LParen 21..22 "("
+| ParameterList 22..30
+| | Identifier 22..23
+| | | Identifier 22..23 "N"
+| | Comma 23..24
+| | | Comma 23..24 ","
+| | WhiteSpace 24..25
+| | | WhiteSpace 24..25
+| | | | WhiteSpace 24..25 " "
+| | Identifier 25..26
+| | | Identifier 25..26 "P"
+| | Comma 26..27
+| | | Comma 26..27 ","
+| | WhiteSpace 27..28
+| | | WhiteSpace 27..28
+| | | | WhiteSpace 27..28 " "
+| | Identifier 28..30
+| | | Identifier 28..30 "QQ"
+| RParen 30..31
+| | RParen 30..31 ")"
+| WhiteSpace 31..32
+| | WhiteSpace 31..32
+| | | WhiteSpace 31..32 " "
+| Block 32..784
+| | LCurly 32..33
+| | | LCurly 32..33 "{"
+| | EndLine 33..34
+| | | EndLine 33..34
+| | | | EndLine 33..34 "\n"
+| | WhiteSpace 34..46
+| | | WhiteSpace 34..46
+| | | | WhiteSpace 34..46 " "
+| | CommentLine 46..86
+| | | CommentLine 46..86
+| | | | CommentLine 46..86 "//Declaration of signals and components."
+| | EndLine 86..87
+| | | EndLine 86..87
+| | | | EndLine 86..87 "\n"
+| | WhiteSpace 87..99
+| | | WhiteSpace 87..99
+| | | | WhiteSpace 87..99 " "
+| | StatementList 99..783
+| | | InputSignalDecl 99..114
+| | | | SignalHeader 99..112
+| | | | | SignalKw 99..105
+| | | | | | SignalKw 99..105 "signal"
+| | | | | WhiteSpace 105..106
+| | | | | | WhiteSpace 105..106
+| | | | | | | WhiteSpace 105..106 " "
+| | | | | InputKw 106..111
+| | | | | | InputKw 106..111 "input"
+| | | | | WhiteSpace 111..112
+| | | | | | WhiteSpace 111..112
+| | | | | | | WhiteSpace 111..112 " "
+| | | | Identifier 112..114
+| | | | | Identifier 112..114 "in"
+| | | Error 114..147
+| | | | Error 114..147
+| | | | | Error 114..147 "expect Semicolon but got LBracket"
+| | | Statement 147..183
+| | | | Error 147..148
+| | | | | Expression 147..148
+| | | | | | Error 147..148
+| | | | | | | LBracket 147..148
+| | | | | | | | LBracket 147..148 "["
+| | | | Error 148..183
+| | | | | Error 148..183
+| | | | | | Error 148..183 "expect Semicolon but got Identifier"
+| | | Statement 183..217
+| | | | Error 183..184
+| | | | | Expression 183..184
+| | | | | | ComponentIdentifier 183..184
+| | | | | | | Identifier 183..184
+| | | | | | | | Identifier 183..184 "N"
+| | | | Error 184..217
+| | | | | Error 184..217
+| | | | | | Error 184..217 "expect Semicolon but got RBracket"
+| | | Statement 217..219
+| | | | Error 217..218
+| | | | | Expression 217..218
+| | | | | | Error 217..218
+| | | | | | | RBracket 217..218
+| | | | | | | | RBracket 217..218 "]"
+| | | | Semicolon 218..219
+| | | | | Semicolon 218..219 ";"
+| | | EndLine 219..220
+| | | | EndLine 219..220
+| | | | | EndLine 219..220 "\n"
+| | | WhiteSpace 220..232
+| | | | WhiteSpace 220..232
+| | | | | WhiteSpace 220..232 " "
+| | | OutputSignalDecl 232..249
+| | | | SignalHeader 232..246
+| | | | | SignalKw 232..238
+| | | | | | SignalKw 232..238 "signal"
+| | | | | WhiteSpace 238..239
+| | | | | | WhiteSpace 238..239
+| | | | | | | WhiteSpace 238..239 " "
+| | | | | OutputKw 239..245
+| | | | | | OutputKw 239..245 "output"
+| | | | | WhiteSpace 245..246
+| | | | | | WhiteSpace 245..246
+| | | | | | | WhiteSpace 245..246 " "
+| | | | Identifier 246..249
+| | | | | Identifier 246..249 "out"
+| | | Semicolon 249..250
+| | | | Semicolon 249..250 ";"
+| | | EndLine 250..251
+| | | | EndLine 250..251
+| | | | | EndLine 250..251 "\n"
+| | | WhiteSpace 251..263
+| | | | WhiteSpace 251..263
+| | | | | WhiteSpace 251..263 " "
+| | | ComponentDecl 263..401
+| | | | ComponentKw 263..272
+| | | | | ComponentKw 263..272 "component"
+| | | | WhiteSpace 272..273
+| | | | | WhiteSpace 272..273
+| | | | | | WhiteSpace 272..273 " "
+| | | | ComponentIdentifier 273..277
+| | | | | Identifier 273..277
+| | | | | | Identifier 273..277 "comp"
+| | | | Error 277..307
+| | | | | Error 277..307
+| | | | | | Error 277..307 "expect Assign but got LBracket"
+| | | | TemplateName 307..341
+| | | | | Error 307..341
+| | | | | | Error 307..341
+| | | | | | | Error 307..341 "expect Identifier but got LBracket"
+| | | | Error 341..371
+| | | | | Error 341..371
+| | | | | | Error 341..371 "expect LParen but got LBracket"
+| | | | Error 371..401
+| | | | | Error 371..401
+| | | | | | Error 371..401 "expect RParen but got LBracket"
+| | | Error 401..434
+| | | | Error 401..434
+| | | | | Error 401..434 "expect Semicolon but got LBracket"
+| | | Statement 434..470
+| | | | Error 434..435
+| | | | | Expression 434..435
+| | | | | | Error 434..435
+| | | | | | | LBracket 434..435
+| | | | | | | | LBracket 434..435 "["
+| | | | Error 435..470
+| | | | | Error 435..470
+| | | | | | Error 435..470 "expect Semicolon but got Identifier"
+| | | Statement 470..499
+| | | | Error 470..471
+| | | | | Expression 470..471
+| | | | | | ComponentIdentifier 470..471
+| | | | | | | Identifier 470..471
+| | | | | | | | Identifier 470..471 "N"
+| | | | Error 471..499
+| | | | | Error 471..499
+| | | | | | Error 471..499 "expect Semicolon but got Sub"
+| | | Statement 499..534
+| | | | Error 499..501
+| | | | | Expression 499..501
+| | | | | | Sub 499..501
+| | | | | | | Sub 499..500
+| | | | | | | | Sub 499..500 "-"
+| | | | | | | Number 500..501
+| | | | | | | | Number 500..501
+| | | | | | | | | Number 500..501 "1"
+| | | | Error 501..534
+| | | | | Error 501..534
+| | | | | | Error 501..534 "expect Semicolon but got RBracket"
+| | | Statement 534..536
+| | | | Error 534..535
+| | | | | Expression 534..535
+| | | | | | Error 534..535
+| | | | | | | RBracket 534..535
+| | | | | | | | RBracket 534..535 "]"
+| | | | Semicolon 535..536
+| | | | | Semicolon 535..536 ";"
+| | | EndLine 536..537
+| | | | EndLine 536..537
+| | | | | EndLine 536..537 "\n"
+| | | WhiteSpace 537..550
+| | | | WhiteSpace 537..550
+| | | | | WhiteSpace 537..550 " "
+| | | EndLine 550..551
+| | | | EndLine 550..551
+| | | | | EndLine 550..551 "\n"
+| | | WhiteSpace 551..563
+| | | | WhiteSpace 551..563
+| | | | | WhiteSpace 551..563 " "
+| | | CommentLine 563..576
+| | | | CommentLine 563..576
+| | | | | CommentLine 563..576 "//Statements."
+| | | EndLine 576..577
+| | | | EndLine 576..577
+| | | | | EndLine 576..577 "\n"
+| | | WhiteSpace 577..589
+| | | | WhiteSpace 577..589
+| | | | | WhiteSpace 577..589 " "
+| | | Statement 589..677
+| | | | ForLoop 589..677
+| | | | | ForKw 589..592
+| | | | | | ForKw 589..592 "for"
+| | | | | LParen 592..593
+| | | | | | LParen 592..593 "("
+| | | | | VarDecl 593..602
+| | | | | | VarKw 593..596
+| | | | | | | VarKw 593..596 "var"
+| | | | | | WhiteSpace 596..597
+| | | | | | | WhiteSpace 596..597
+| | | | | | | | WhiteSpace 596..597 " "
+| | | | | | Identifier 597..598
+| | | | | | | Identifier 597..598 "i"
+| | | | | | WhiteSpace 598..599
+| | | | | | | WhiteSpace 598..599
+| | | | | | | | WhiteSpace 598..599 " "
+| | | | | | Assign 599..600
+| | | | | | | Assign 599..600 "="
+| | | | | | WhiteSpace 600..601
+| | | | | | | WhiteSpace 600..601
+| | | | | | | | WhiteSpace 600..601 " "
+| | | | | | Expression 601..602
+| | | | | | | Number 601..602
+| | | | | | | | Number 601..602
+| | | | | | | | | Number 601..602 "0"
+| | | | | Semicolon 602..603
+| | | | | | Semicolon 602..603 ";"
+| | | | | WhiteSpace 603..604
+| | | | | | WhiteSpace 603..604
+| | | | | | | WhiteSpace 603..604 " "
+| | | | | Expression 604..611
+| | | | | | LessThan 604..611
+| | | | | | | Identifier 604..605
+| | | | | | | | Identifier 604..605
+| | | | | | | | | Identifier 604..605 "i"
+| | | | | | | WhiteSpace 605..606
+| | | | | | | | WhiteSpace 605..606
+| | | | | | | | | WhiteSpace 605..606 " "
+| | | | | | | LessThan 606..607
+| | | | | | | | LessThan 606..607 "<"
+| | | | | | | WhiteSpace 607..608
+| | | | | | | | WhiteSpace 607..608
+| | | | | | | | | WhiteSpace 607..608 " "
+| | | | | | | Sub 608..611
+| | | | | | | | Identifier 608..609
+| | | | | | | | | Identifier 608..609
+| | | | | | | | | | Identifier 608..609 "N"
+| | | | | | | | Sub 609..610
+| | | | | | | | | Sub 609..610 "-"
+| | | | | | | | Number 610..611
+| | | | | | | | | Number 610..611
+| | | | | | | | | | Number 610..611 "1"
+| | | | | Semicolon 611..612
+| | | | | | Semicolon 611..612 ";"
+| | | | | WhiteSpace 612..613
+| | | | | | WhiteSpace 612..613
+| | | | | | | WhiteSpace 612..613 " "
+| | | | | Error 613..614
+| | | | | | Expression 613..614
+| | | | | | | ComponentIdentifier 613..614
+| | | | | | | | Identifier 613..614
+| | | | | | | | | Identifier 613..614 "i"
+| | | | | Error 614..643
+| | | | | | Error 614..643
+| | | | | | | Error 614..643 "expect RParen but got UnitInc"
+| | | | | Error 643..646
+| | | | | | Expression 643..646
+| | | | | | | UnitInc 643..646
+| | | | | | | | UnitInc 643..645
+| | | | | | | | | UnitInc 643..645 "++"
+| | | | | | | | Error 645..646
+| | | | | | | | | RParen 645..646
+| | | | | | | | | | RParen 645..646 ")"
+| | | | | Error 646..677
+| | | | | | Error 646..677
+| | | | | | | Error 646..677 "expect Semicolon but got LCurly"
+| | | Statement 677..765
+| | | | Block 677..765
+| | | | | LCurly 677..678
+| | | | | | LCurly 677..678 "{"
+| | | | | EndLine 678..679
+| | | | | | EndLine 678..679
+| | | | | | | EndLine 678..679 "\n"
+| | | | | WhiteSpace 679..695
+| | | | | | WhiteSpace 679..695
+| | | | | | | WhiteSpace 679..695 " "
+| | | | | StatementList 695..764
+| | | | | | Statement 695..751
+| | | | | | | AssignStatement 695..750
+| | | | | | | | Expression 695..703
+| | | | | | | | | ComponentIdentifier 695..699
+| | | | | | | | | | Identifier 695..699
+| | | | | | | | | | | Identifier 695..699 "comp"
+| | | | | | | | | LBracket 699..700
+| | | | | | | | | | LBracket 699..700 "["
+| | | | | | | | | Expression 700..701
+| | | | | | | | | | Identifier 700..701
+| | | | | | | | | | | Identifier 700..701
+| | | | | | | | | | | | Identifier 700..701 "i"
+| | | | | | | | | RBracket 701..702
+| | | | | | | | | | RBracket 701..702 "]"
+| | | | | | | | | WhiteSpace 702..703
+| | | | | | | | | | WhiteSpace 702..703
+| | | | | | | | | | | WhiteSpace 702..703 " "
+| | | | | | | | Assign 703..704
+| | | | | | | | | Assign 703..704 "="
+| | | | | | | | WhiteSpace 704..705
+| | | | | | | | | WhiteSpace 704..705
+| | | | | | | | | | WhiteSpace 704..705 " "
+| | | | | | | | Expression 705..750
+| | | | | | | | | Call 705..750
+| | | | | | | | | | Identifier 705..716
+| | | | | | | | | | | Identifier 705..716
+| | | | | | | | | | | | Identifier 705..716 "Multiplier2"
+| | | | | | | | | | Tuple 716..750
+| | | | | | | | | | | LParen 716..717
+| | | | | | | | | | | | LParen 716..717 "("
+| | | | | | | | | | | Error 717..749
+| | | | | | | | | | | | Error 717..749
+| | | | | | | | | | | | | Error 717..749 "expect Identifier but got RParen"
+| | | | | | | | | | | RParen 749..750
+| | | | | | | | | | | | RParen 749..750 ")"
+| | | | | | | Semicolon 750..751
+| | | | | | | | Semicolon 750..751 ";"
+| | | | | | EndLine 751..752
+| | | | | | | EndLine 751..752
+| | | | | | | | EndLine 751..752 "\n"
+| | | | | | WhiteSpace 752..764
+| | | | | | | WhiteSpace 752..764
+| | | | | | | | WhiteSpace 752..764 " "
+| | | | | RCurly 764..765
+| | | | | | RCurly 764..765 "}"
+| | | EndLine 765..766
+| | | | EndLine 765..766
+| | | | | EndLine 765..766 "\n"
+| | | WhiteSpace 766..782
+| | | | WhiteSpace 766..782
+| | | | | WhiteSpace 766..782 " "
+| | | EndLine 782..783
+| | | | EndLine 782..783
+| | | | | EndLine 782..783 "\n"
+| | RCurly 783..784
+| | | RCurly 783..784 "}"
diff --git a/crates/syntax/src/syntax.rs b/crates/syntax/src/syntax.rs
index ded3cc3..08acdf5 100644
--- a/crates/syntax/src/syntax.rs
+++ b/crates/syntax/src/syntax.rs
@@ -1,9 +1,15 @@
+use parser::grammar::entry::Scope;
use parser::input::Input;
use parser::output::{Child, Output};
use parser::parser::Parser;
use parser::token_kind::TokenKind;
use rowan::{GreenNode, GreenNodeBuilder};
+pub use rowan::{
+ api::Preorder, Direction, NodeOrToken, SyntaxText, TextRange, TextSize, TokenAtOffset,
+ WalkEvent,
+};
+
use crate::syntax_node::SyntaxNode;
pub struct SyntaxTreeBuilder<'a> {
@@ -65,355 +71,60 @@ impl<'a> SyntaxTreeBuilder<'a> {
}
}
-#[cfg(test)]
-mod tests {
- use std::hash::{DefaultHasher, Hash, Hasher};
-
- use rowan::ast::AstNode;
-
- use crate::{abstract_syntax_tree::AstCircomProgram, test_programs};
-
- use super::SyntaxTreeBuilder;
-
- fn ast_from_source(source: &str) -> AstCircomProgram {
- let syntax = SyntaxTreeBuilder::syntax_tree(source);
- AstCircomProgram::cast(syntax).unwrap()
- }
-
- fn children_from_ast(ast: &AstCircomProgram) -> Vec {
- let children = ast
- .syntax()
- .first_child()
- .unwrap()
- .siblings(rowan::Direction::Next)
- .into_iter()
- .map(|child| child.text().to_string())
- .collect();
-
- children
- }
-
- fn pragma_string_from_ast(ast: &AstCircomProgram) -> String {
- ast.pragma().unwrap().syntax().text().to_string()
- }
-
- fn pragma_version_from_ast(ast: &AstCircomProgram) -> String {
- ast.pragma()
- .unwrap()
- .version()
- .unwrap()
- .syntax()
- .text()
- .to_string()
- }
-
- fn template_names_from_ast(ast: &AstCircomProgram) -> Vec {
- let templates = ast
- .template_list()
- .iter()
- .map(|template| template.name().unwrap().syntax().text().to_string())
- .collect();
-
- templates
- }
-
- fn function_names_from_ast(ast: &AstCircomProgram) -> Vec {
- let functions = ast
- .function_list()
- .iter()
- .map(|function| {
- function
- .function_name()
- .unwrap()
- .syntax()
- .text()
- .to_string()
- })
- .collect();
-
- functions
- }
-
- #[test]
- fn syntax_test_1() {
- let ast = ast_from_source(test_programs::PARSER_TEST_1);
-
- // check_ast_children
- let children = children_from_ast(&ast);
- insta::assert_yaml_snapshot!("syntax_test_1_children", children);
-
- // check pragma
- let pragma = pragma_string_from_ast(&ast);
- insta::assert_yaml_snapshot!(pragma, @"pragma circom 2.0.0;");
-
- // check ast hash
- let mut hasher = DefaultHasher::default();
- ast.syntax().hash(&mut hasher);
- let _ast_hash = hasher.finish();
-
- // check template hash
- let mut h1 = DefaultHasher::default();
- let mut h2 = DefaultHasher::default();
-
- let template = ast.template_list();
-
- template[0].syntax().hash(&mut h1);
- template[1].syntax().hash(&mut h2);
-
- assert_ne!(
- h1.finish(),
- h2.finish(),
- "Templates with same syntax should have different hashes!"
- );
-
- // check template syntax (text & green node)
- assert_eq!(
- template[0].syntax().text(),
- template[1].syntax().text(),
- "The syntax (as text) of template 1 and 2 must be the same!"
- );
- assert_eq!(
- template[0].syntax().green(),
- template[1].syntax().green(),
- "The syntax (as green node) of template 1 and 2 must be the same!!"
- );
- }
-
- #[test]
- fn syntax_test_2() {
- let ast = ast_from_source(test_programs::PARSER_TEST_2);
-
- let pragma = pragma_string_from_ast(&ast);
- insta::assert_yaml_snapshot!(pragma, @"pragma circom 2.0.0;");
-
- let function_names = function_names_from_ast(&ast);
- insta::assert_yaml_snapshot!("syntax_test_2_functions", function_names);
-
- let template_names = template_names_from_ast(&ast);
- insta::assert_yaml_snapshot!("syntax_test_2_templates", template_names);
- }
-
- #[test]
- fn syntax_test_3() {
- let ast = ast_from_source(test_programs::PARSER_TEST_3);
- let pragma = pragma_string_from_ast(&ast);
- insta::assert_yaml_snapshot!(pragma, @"pragma circom 2.0.0;");
-
- let pragma_version = pragma_version_from_ast(&ast);
- insta::assert_yaml_snapshot!(pragma_version, @"2.0.0");
- }
-
- #[test]
- fn syntax_test_4() {
- let ast = ast_from_source(test_programs::PARSER_TEST_4);
- let pragma = pragma_string_from_ast(&ast);
- insta::assert_yaml_snapshot!(pragma, @"pragma circom 2.0.0;");
-
- let pragma_version = pragma_version_from_ast(&ast);
- insta::assert_yaml_snapshot!(pragma_version, @"2.0.0");
- }
-
- #[test]
- fn syntax_test_5() {
- let ast = ast_from_source(test_programs::PARSER_TEST_5);
- let pragma = ast.pragma().is_none();
- insta::assert_yaml_snapshot!(pragma, @"true");
+pub fn syntax_node_from_source(source: &str, scope: Scope) -> SyntaxNode {
+ let input = Input::new(&source);
+ let output = Parser::parsing_with_scope(&input, scope);
- let template_names = template_names_from_ast(&ast);
- insta::assert_yaml_snapshot!("syntax_test_5_templates", template_names);
- }
+ // output is a tree whose node is index of token, no content of token
+ // convert output into green node
+ let mut builder = SyntaxTreeBuilder::new(&input);
+ builder.build(output);
+ let green = builder.finish();
- #[test]
- fn syntax_test_6() {
- let ast = ast_from_source(test_programs::PARSER_TEST_6);
- let pragma = ast.pragma().is_none();
- insta::assert_yaml_snapshot!(pragma, @"true");
+ // then cast green node into syntax node
+ let syntax = SyntaxNode::new_root(green);
- let template_names = template_names_from_ast(&ast);
- insta::assert_yaml_snapshot!("syntax_test_6_templates", template_names);
- }
+ syntax
}
#[cfg(test)]
-mod grammar_tests {
-
- use crate::{
- abstract_syntax_tree::{AstBlock, AstOutputSignalDecl, AstPragma, AstTemplateDef},
- syntax::SyntaxTreeBuilder,
- syntax_node::CircomLanguage,
- };
- use parser::{grammar::entry::Scope, input::Input, parser::Parser};
- use rowan::{ast::AstNode, SyntaxNode};
-
- fn syntax_node_from_source(source: &str, scope: Scope) -> SyntaxNode {
- let input = Input::new(&source);
- let output = Parser::parsing_with_scope(&input, scope);
-
- // output is a tree whose node is index of token, no content of token
- // convert output into green node
- let mut builder = SyntaxTreeBuilder::new(&input);
- builder.build(output);
- let green = builder.finish();
-
- // then cast green node into syntax node
- let syntax = SyntaxNode::new_root(green);
-
- syntax
- }
+mod tests {
+ use crate::test_syntax;
+ use parser::grammar::entry::Scope;
#[test]
fn pragma_happy_test() {
- // parse source (string) into output tree
- let version = r#"2.0.1"#;
- let source = format!(r#"pragma circom {};"#, version);
-
- let syntax = syntax_node_from_source(&source, Scope::Pragma);
-
- // cast syntax node into ast node to retrieve more information
- let pragma = AstPragma::cast(syntax).expect("Can not cast syntax node into ast pragma");
-
- // finally, assert with expect value
- let pragma_versison_kind = pragma.version().unwrap().syntax().kind();
- insta::assert_yaml_snapshot!(pragma_versison_kind, @"Version");
-
- let pragma_versison_text = pragma.version().unwrap().syntax().text().to_string();
- insta::assert_yaml_snapshot!(pragma_versison_text, @"2.0.1");
+ test_syntax!("/src/test_files/happy/pragma.circom", Scope::Pragma);
}
#[test]
fn template_happy_test() {
// SOURCE & EXPECTED RESULT
- const SOURCE: &str = r#"template MultiplierN (N, P, QQ) {
- //Declaration of signals and components.
- signal input in[N];
- signal output out;
- component comp[N-1];
-
- //Statements.
- for(var i = 0; i < N-1; i++){
- comp[i] = Multiplier2();
- }
-
- // ... some more code (see below)
-
- }"#;
-
- let syntax = syntax_node_from_source(&SOURCE, Scope::Template);
-
- // cast syntax node into ast node to retrieve more information
- let template =
- AstTemplateDef::cast(syntax).expect("Can not cast syntax node into ast template");
-
- // finally, assert with expect value
-
- // name
- let name = template
- .name()
- .expect("Can not extract template name")
- .syntax()
- .text()
- .to_string();
- insta::assert_yaml_snapshot!(name, @"MultiplierN");
-
- // parameter list
- let first_param = template
- .parameter_list()
- .expect("Can not detect parameter list")
- .syntax()
- .first_child()
- .unwrap()
- .text()
- .to_string();
- insta::assert_yaml_snapshot!(first_param, @"N");
-
- let last_param = template
- .parameter_list()
- .expect("Can not detect parameter list")
- .syntax()
- .last_child()
- .unwrap()
- .text()
- .to_string();
- insta::assert_yaml_snapshot!(last_param, @"QQ");
-
- // statements
- let statements = template.statements().unwrap();
- let output_signal = statements.find_children::();
- println!("{:?}", output_signal);
-
- let statements: Vec = statements
- .statement_list()
- .into_iter()
- .map(|statement| statement.syntax().text().to_string())
- .collect();
- insta::assert_yaml_snapshot!("template_happy_test_statements", statements);
-
- // input signal
- let input_signal = template
- .find_input_signal("in")
- .unwrap()
- .syntax()
- .text()
- .to_string();
- insta::assert_yaml_snapshot!(input_signal, @"signal input in[N];");
-
- // output signal
- let output_signal = template
- .find_output_signal("out")
- .unwrap()
- .syntax()
- .text()
- .to_string();
- insta::assert_yaml_snapshot!(output_signal, @"signal output out;");
-
- // internal signal
- let internal_signal = template.find_internal_signal("in").is_none();
- insta::assert_yaml_snapshot!(internal_signal, @"true");
-
- // component
- let component = template
- .find_component("comp")
- .unwrap()
- .syntax()
- .text()
- .to_string();
- insta::assert_yaml_snapshot!(component, @"component comp[N-1];");
+ test_syntax!("/src/test_files/happy/template.circom", Scope::Template);
}
#[test]
fn block_happy_test() {
- // SOURCE & EXPECTED RESULT
- let source = r#"{
- //Declaration of signals.
- signal input in[N];
- signal output out;
- component comp[N-1];
-
- //Statements.
- for(var i = 0; i < N-1; i++){
- comp[i] = Multiplier2();
- }
- comp[0].in1 <== in[0];
- comp[0].in2 <== in[1];
- for(var i = 0; i < N-2; i++){
- comp[i+1].in1 <== comp[i].out;
- comp[i+1].in2 <== in[i+2];
-
- }
- out <== comp[N-2].out;
- }"#;
-
- let syntax = syntax_node_from_source(&source, Scope::Block);
+ test_syntax!("/src/test_files/happy/block.circom", Scope::Block);
+ }
- // cast syntax node into ast node to retrieve more information
- let block = AstBlock::cast(syntax).expect("Can not cast syntax node into ast block");
+ #[test]
+ fn comment_happy_test() {
+ test_syntax!(
+ "/src/test_files/happy/block_comment.circom",
+ Scope::CircomProgram
+ );
+ test_syntax!(
+ "/src/test_files/happy/line_comment.circom",
+ Scope::CircomProgram
+ );
+ }
- // finally, assert with expect statements
- let statements = block.statement_list().unwrap().statement_list();
- let statements: Vec = statements
- .into_iter()
- .map(|statement| statement.syntax().text().to_string())
- .collect();
- insta::assert_yaml_snapshot!("block_happy_test_statements", statements);
+ #[test]
+ fn full_circom_program() {
+ test_syntax!(
+ "/src/test_files/happy/full_circom_program.circom",
+ Scope::CircomProgram
+ );
}
}
diff --git a/crates/syntax/src/test_files/happy/block.circom b/crates/syntax/src/test_files/happy/block.circom
new file mode 100644
index 0000000..fdfa1a7
--- /dev/null
+++ b/crates/syntax/src/test_files/happy/block.circom
@@ -0,0 +1,19 @@
+{
+ //Declaration of signals.
+ signal input in[N];
+ signal output out;
+ component comp[N-1];
+
+ //Statements.
+ for(var i = 0; i < N-1; i++){
+ comp[i] = Multiplier2();
+ }
+ comp[0].in1 <== in[0];
+ comp[0].in2 <== in[1];
+ for(var i = 0; i < N-2; i++){
+ comp[i+1].in1 <== comp[i].out;
+ comp[i+1].in2 <== in[i+2];
+
+ }
+ out <== comp[N-2].out;
+ }
\ No newline at end of file
diff --git a/crates/syntax/src/test_files/happy/block_comment.circom b/crates/syntax/src/test_files/happy/block_comment.circom
new file mode 100644
index 0000000..603f889
--- /dev/null
+++ b/crates/syntax/src/test_files/happy/block_comment.circom
@@ -0,0 +1,6 @@
+
+/*
+comment
+blocks
+*/
+pragma circom 2.0.0;
\ No newline at end of file
diff --git a/crates/syntax/src/test_files/happy/empty_template.circom b/crates/syntax/src/test_files/happy/empty_template.circom
new file mode 100644
index 0000000..e69de29
diff --git a/crates/syntax/src/test_programs.rs b/crates/syntax/src/test_files/happy/full_circom_program.circom
similarity index 81%
rename from crates/syntax/src/test_programs.rs
rename to crates/syntax/src/test_files/happy/full_circom_program.circom
index 655222f..d2a7757 100644
--- a/crates/syntax/src/test_programs.rs
+++ b/crates/syntax/src/test_files/happy/full_circom_program.circom
@@ -1,11 +1,4 @@
-pub const PARSER_TEST_1: &str = r#"pragma circom 2.0.0;
-
-
- template Multiplier2 () {}
- template Multiplier2 () {}
- "#;
-
-pub const PARSER_TEST_2: &str = r#"/*
+/*
Copyright 2018 0KIMS association.
This file is part of circom (Zero Knowledge Circuit Compiler).
@@ -104,31 +97,3 @@ template BinSum(n, ops) {
lin === lout;
}
- "#;
-
-pub const PARSER_TEST_3: &str = r#"
-
-// comment :>
-
- pragma circom 2.0.0;
-
- "#;
-
-pub const PARSER_TEST_4: &str = r#"
-
-/*
-comment
-blocks
-*/
-pragma circom 2.0.0;
- "#;
-
-pub const PARSER_TEST_5: &str = r#"
-// no pragma here
- template Multiplier2 () {}
- "#;
-
-pub const PARSER_TEST_6: &str = r#"
-/* T _ T */
- template Multiplier2 () {}
- "#;
diff --git a/crates/syntax/src/test_files/happy/line_comment.circom b/crates/syntax/src/test_files/happy/line_comment.circom
new file mode 100644
index 0000000..d293753
--- /dev/null
+++ b/crates/syntax/src/test_files/happy/line_comment.circom
@@ -0,0 +1,4 @@
+
+// comment :>
+
+ pragma circom 2.0.0;
diff --git a/crates/syntax/src/test_files/happy/no_pragma.circom b/crates/syntax/src/test_files/happy/no_pragma.circom
new file mode 100644
index 0000000..678dd3d
--- /dev/null
+++ b/crates/syntax/src/test_files/happy/no_pragma.circom
@@ -0,0 +1,2 @@
+// no pragma here
+ template Multiplier2 () {}
\ No newline at end of file
diff --git a/crates/syntax/src/test_files/happy/pragma.circom b/crates/syntax/src/test_files/happy/pragma.circom
new file mode 100644
index 0000000..8a5d3da
--- /dev/null
+++ b/crates/syntax/src/test_files/happy/pragma.circom
@@ -0,0 +1 @@
+pragma circom 2.0.0;
diff --git a/crates/syntax/src/test_files/happy/template.circom b/crates/syntax/src/test_files/happy/template.circom
new file mode 100644
index 0000000..ad25810
--- /dev/null
+++ b/crates/syntax/src/test_files/happy/template.circom
@@ -0,0 +1,13 @@
+template MultiplierN (N, P, QQ) {
+ //Declaration of signals and components.
+ signal input in[N];
+ signal output out;
+ component comp[N-1];
+
+ //Statements.
+ for(var i = 0; i < N-1; i++){
+ comp[i] = Multiplier2();
+ }
+
+}
+
\ No newline at end of file
diff --git a/crates/syntax/src/utils.rs b/crates/syntax/src/utils.rs
index e69de29..76de9f3 100644
--- a/crates/syntax/src/utils.rs
+++ b/crates/syntax/src/utils.rs
@@ -0,0 +1,10 @@
+#[macro_export]
+macro_rules! test_syntax {
+ ($file_path:expr, $scope: expr) => {
+ let crate_path = std::env::var("CARGO_MANIFEST_DIR").unwrap();
+ let full_path = format!("{}{}", crate_path, $file_path);
+ let source = std::fs::read_to_string(full_path).expect("Should not failed");
+ let syntax = crate::syntax::syntax_node_from_source(&source, $scope);
+ insta::assert_snapshot!($file_path, crate::view_syntax::view_ast(&syntax));
+ };
+}
diff --git a/crates/syntax/src/view_syntax.rs b/crates/syntax/src/view_syntax.rs
new file mode 100644
index 0000000..35edfb6
--- /dev/null
+++ b/crates/syntax/src/view_syntax.rs
@@ -0,0 +1,52 @@
+use crate::syntax_node::{SyntaxNode, SyntaxToken};
+
+pub use rowan::{
+ api::Preorder, Direction, GreenNode, NodeOrToken, SyntaxText, TextRange, TextSize,
+ TokenAtOffset, WalkEvent,
+};
+
+fn level_str(level: u32) -> String {
+ let mut ans = String::from("");
+
+ for _i in 0..level {
+ ans.push_str("| ");
+ }
+ ans
+}
+
+pub(crate) fn view_ast(node: &SyntaxNode) -> String {
+ let mut level = 0;
+ let mut result = String::new();
+ for event in node.preorder_with_tokens() {
+ match event {
+ WalkEvent::Enter(it) => {
+ match it {
+ NodeOrToken::Node(node) => {
+ result.push_str(&format!(
+ "{} {:?} {:?}",
+ level_str(level),
+ node.kind(),
+ node.text_range()
+ ));
+ }
+ NodeOrToken::Token(token) => {
+ result.push_str(&format!(
+ "{} {:?} {:?} {:?}",
+ level_str(level),
+ token.kind(),
+ token.text_range(),
+ token.text()
+ ));
+ }
+ }
+ result.push('\n');
+ level = level + 1;
+ }
+
+ WalkEvent::Leave(_it) => {
+ level = level - 1;
+ }
+ }
+ }
+ return result;
+}