public virtual void DefineRule( IToken ruleToken,
string modifier,
IDictionary<string,object> options,
GrammarAST tree,
GrammarAST argActionAST,
int numAlts )
{
string ruleName = ruleToken.Text;
if ( GetLocallyDefinedRule( ruleName ) != null )
{
ErrorManager.GrammarError( ErrorManager.MSG_RULE_REDEFINITION,
this, ruleToken, ruleName );
return;
}
if ( ( type == GrammarType.Parser || type == GrammarType.TreeParser ) &&
Rule.GetRuleType(ruleName) == RuleType.Lexer)
{
ErrorManager.GrammarError( ErrorManager.MSG_LEXER_RULES_NOT_ALLOWED,
this, ruleToken, ruleName );
return;
}
Rule r = new Rule( this, ruleName, composite.RuleIndex, numAlts );
/*
[email protected]("defineRule("+ruleName+",modifier="+modifier+
"): index="+r.index+", nalts="+numAlts);
*/
r.Modifier = modifier ?? DefaultRuleModifier;
nameToRuleMap[ruleName] = r;
SetRuleAST( ruleName, tree );
r.SetOptions( options, ruleToken );
r.ArgActionAST = argActionAST;
composite.RuleIndexToRuleList.Resize( composite.RuleIndex + 1 );
composite.RuleIndexToRuleList[composite.RuleIndex] = r;
composite.RuleIndex++;
if ( ruleName.StartsWith( SynpredRulePrefix ) )
{
r.IsSynPred = true;
}
}