@@ -7,8 +7,6 @@ export class GbnfRef extends GbnfTerminal {
77 public readonly getValueTerminal : ( ) => GbnfTerminal ;
88 public readonly defName : string ;
99 public readonly def : GbnfJsonSchema ;
10- private _valueTerminal ?: GbnfTerminal ;
11- private _grammar ?: string ;
1210
1311 public constructor ( {
1412 getValueTerminal,
@@ -26,28 +24,30 @@ export class GbnfRef extends GbnfTerminal {
2624 }
2725
2826 public override getGrammar ( grammarGenerator : GbnfGrammarGenerator ) : string {
29- this . _createRule ( grammarGenerator ) ;
30-
31- if ( this . _valueTerminal != null )
32- return this . _valueTerminal . getGrammar ( grammarGenerator ) ;
33- else if ( this . _grammar != null )
34- return this . _grammar ;
35-
36- return this . getValueTerminal ( ) . getGrammar ( grammarGenerator ) ;
27+ return this . generateRuleName ( grammarGenerator ) ;
3728 }
3829
3930 protected override generateRuleName ( grammarGenerator : GbnfGrammarGenerator ) : string {
40- return this . _createRule ( grammarGenerator ) ;
41- }
31+ if ( ! grammarGenerator . defRuleNames . has ( [ this . defName , this . def ] ) ) {
32+ const alreadyGeneratingGrammarForThisRef = grammarGenerator . defRuleNames . get ( [ this . defName , this . def ] ) === null ;
33+ if ( alreadyGeneratingGrammarForThisRef )
34+ return grammarGenerator . generateRuleNameForDef ( this . defName , this . def ) ;
35+
36+ grammarGenerator . defRuleNames . set ( [ this . defName , this . def ] , null ) ;
37+ const grammar = this . getValueTerminal ( ) . resolve ( grammarGenerator ) ;
38+
39+ if ( grammarGenerator . rules . has ( grammar ) && grammarGenerator . defRuleNames . get ( [ this . defName , this . def ] ) === null ) {
40+ grammarGenerator . defRuleNames . set ( [ this . defName , this . def ] , grammar ) ;
41+ return grammar ;
42+ }
43+
44+ const ruleName = grammarGenerator . generateRuleNameForDef ( this . defName , this . def ) ;
45+ grammarGenerator . rules . set ( ruleName , grammar ) ;
46+ grammarGenerator . ruleContentToRuleName . set ( grammar , ruleName ) ;
4247
43- private _createRule ( grammarGenerator : GbnfGrammarGenerator ) {
44- const [ isNew , ruleName ] = grammarGenerator . generateRuleNameForDef ( this . defName , this . def ) ;
45- if ( ! isNew ) {
46- this . _grammar = ruleName ;
4748 return ruleName ;
4849 }
4950
50- this . _valueTerminal = this . getValueTerminal ( ) ;
51- return ruleName ;
51+ return grammarGenerator . generateRuleNameForDef ( this . defName , this . def ) ;
5252 }
5353}
0 commit comments