public void defineSyntax(KDEFINE_SYNTAX[] syndefs)
{
//KMethod pParseStmt = null, pParseExpr = null, pStmtTyCheck = null, pExprTyCheck = null;
//KMethod mParseStmt = null, mParseExpr = null, mStmtTyCheck = null, mExprTyCheck = null;
foreach (var syndef in syndefs)
{
ctx.kmodsugar.AddKeyword(syndef.name, syndef.kw);
KeywordType kw = ctx.kmodsugar.keyword_(syndef.name, Symbol.NewID).Type;
Syntax syn = GetSyntax(kw, true);
//syn.token = syndef.name;
syn.Flag |= syndef.flag;
//if(syndef.type != null) {
// syn.Type = syndef.type;
//}
//if(syndef.op1 != null) {
// syn.Op1 = null;// syndef.op1;//Symbol.Get(ctx, syndef.op1, Symbol.NewID, SymPol.MsETHOD);
//}
//if(syndef.op2 != null) {
// syn.Op2 = null;// syndef.op2;//Symbol.Get(ctx, syndef.op2, Symbol.NewID, SymPol.MsETHOD);
//}
if (syndef.priority_op2 > 0)
{
syn.priority = syndef.priority_op2;
}
if (syndef.rule != null)
{
List<Token> adst;
parseSyntaxRule(syndef.rule, new LineInfo(0, ""), out adst);
syn.SyntaxRule = adst;
}
syn.ParseStmt = syndef.ParseStmt;
syn.ParseExpr = syndef.ParseExpr ?? KModSugar.UndefinedParseExpr;
syn.TopStmtTyCheck = syndef.TopStmtTyCheck;
syn.StmtTyCheck = syndef.StmtTyCheck ?? ctx.kmodsugar.UndefinedStmtTyCheck;
syn.ExprTyCheck = syndef.ExprTyCheck ?? ctx.kmodsugar.UndefinedExprTyCheck;
if (syn.ParseExpr == KModSugar.UndefinedParseExpr)
{
if (syn.Flag == SynFlag.ExprOp)
{
syn.ParseExpr = KModSugar.ParseExpr_Op;
}
else if (syn.Flag == SynFlag.ExprTerm)
{
syn.ParseExpr = KModSugar.ParseExpr_Term;
}
}
}
//Console.WriteLine("syntax size={0}, hmax={1}", syntaxMap.Count, syntaxMap.);
}