@@ -3810,17 +3810,8 @@ class ParserGenerator {
3810
3810
if (!ret) { return nullptr ; }
3811
3811
3812
3812
// Check infinite loop
3813
- {
3814
- DetectInfiniteLoop vis (data.start_pos , data.start );
3815
- start_rule.accept (vis);
3816
- if (vis.has_error ) {
3817
- if (log ) {
3818
- auto line = line_info (s, vis.error_s );
3819
- log (line.first , line.second ,
3820
- " infinite loop is detected in '" + vis.error_name + " '." );
3821
- }
3822
- return nullptr ;
3823
- }
3813
+ if (detect_infiniteLoop (data, start_rule, log , s)) {
3814
+ return nullptr ;
3824
3815
}
3825
3816
3826
3817
// Automatic whitespace skipping
@@ -3831,13 +3822,22 @@ class ParserGenerator {
3831
3822
if (IsLiteralToken::check (*ope)) { rule <= tok (ope); }
3832
3823
}
3833
3824
3834
- start_rule.whitespaceOpe =
3835
- wsp (grammar[WHITESPACE_DEFINITION_NAME].get_core_operator ());
3825
+ auto &rule = grammar[WHITESPACE_DEFINITION_NAME];
3826
+ start_rule.whitespaceOpe = wsp (rule.get_core_operator ());
3827
+
3828
+ if (detect_infiniteLoop (data, rule, log , s)) {
3829
+ return nullptr ;
3830
+ }
3836
3831
}
3837
3832
3838
3833
// Word expression
3839
3834
if (grammar.count (WORD_DEFINITION_NAME)) {
3840
- start_rule.wordOpe = grammar[WORD_DEFINITION_NAME].get_core_operator ();
3835
+ auto &rule = grammar[WORD_DEFINITION_NAME];
3836
+ start_rule.wordOpe = rule.get_core_operator ();
3837
+
3838
+ if (detect_infiniteLoop (data, rule, log , s)) {
3839
+ return nullptr ;
3840
+ }
3841
3841
}
3842
3842
3843
3843
// Apply instructions
@@ -3867,6 +3867,20 @@ class ParserGenerator {
3867
3867
return data.grammar ;
3868
3868
}
3869
3869
3870
+ bool detect_infiniteLoop (const Data &data, Definition &rule, const Log &log, const char *s) const {
3871
+ DetectInfiniteLoop vis (data.start_pos , rule.name );
3872
+ rule.accept (vis);
3873
+ if (vis.has_error ) {
3874
+ if (log ) {
3875
+ auto line = line_info (s, vis.error_s );
3876
+ log (line.first , line.second ,
3877
+ " infinite loop is detected in '" + vis.error_name + " '." );
3878
+ }
3879
+ return true ;
3880
+ }
3881
+ return false ;
3882
+ }
3883
+
3870
3884
Grammar g;
3871
3885
};
3872
3886
0 commit comments