protected void DefineTemporalConstraint(ParseForest forest, SemanticContext context) { var DCvisitor = new ParseTreeVisitor(forest); var MCvisitor = new ParseTreeVisitor(DCvisitor); if (DCvisitor.currentNode.B == NonTerminalSymbol.DC) { DCvisitor.Left(); MCvisitor.Right(); } else { DCvisitor.Right(); MCvisitor.Left(); } context.SignatureBeingDefined.verb = "??constraint"; context.InvocationBeingDefined = new Invocation(""); context.FunctionBeingDefined = new Symbol { Category = Categories.Constraint, PartOfSpeech = NonTerminalSymbol.TR, }; Scope.EnterNew(context.SignatureBeingDefined.verb); DefineImpInvSymbol(forest, context, MCvisitor); " MAIN CLAUSE:".Log(context.SignatureBeingDefined.verb); DefineImpInvSymbol(forest, context, DCvisitor); " DEPENDENT CLAUSE:".Log(context.SignatureBeingDefined.verb); "DEFINED constraint:".Log(context.SignatureBeingDefined); context.FunctionBeingDefined.Name = context.SignatureBeingDefined.ToString(); context.FunctionBeingDefined.Type = context.SignatureBeingDefined.verb; context.FunctionBeingDefined.Signature = context.SignatureBeingDefined; Scope.Current.Define(context.FunctionBeingDefined); EndPreviousFunctionBody(context); }
protected void CreateSymbol(ParseForest forest, ParseTreeVisitor visitor, SemanticContext context) { if (visitor == null) { return; } ParseTreeVisitor visitor2; switch (visitor.currentType) { case NonTerminalSymbol.G: // the problem with lone gerunds like "giving" is that you don't know if its GP or aGP so look to see what the container is if (visitor.parentNode.B == NonTerminalSymbol.IV) { // aGP MatchGerundSignature(forest.a[visitor.i], forest, visitor, context, false); } else if (visitor.parentNode.B == NonTerminalSymbol.VO || visitor.parentNode.B == NonTerminalSymbol.SVO) { // GP //if (visitor.currentNode != null && visitor.currentNode.B == NonTerminalSymbol.G) MatchGerundSignature(forest.a[visitor.i], forest, visitor, context, false); //else // FillParameterWith_NP(forest, visitor, context); // the G -- G is an argument } else { throw new Exception("Unknown context for lone gerund."); } break; case NonTerminalSymbol.NPPP: case NonTerminalSymbol.SV: case NonTerminalSymbol.SVO: case NonTerminalSymbol.VO: case NonTerminalSymbol.IsHas: case NonTerminalSymbol.NPs: case NonTerminalSymbol.ConjNP: case NonTerminalSymbol.aSVO: case NonTerminalSymbol.aNPPP: visitor2 = new ParseTreeVisitor(visitor); CreateSymbol(forest, visitor.Left(), context); CreateSymbol(forest, visitor2.Right(), context); break; case NonTerminalSymbol.XYZ: CreateSymbol(forest, visitor.Right(), context); break; case NonTerminalSymbol.Conj: case NonTerminalSymbol.comma: case NonTerminalSymbol.colon: break; case NonTerminalSymbol.aSV: if (visitor.currentNode != null && visitor.currentNode.B == NonTerminalSymbol.G) { MatchGerundSignature(forest.a[visitor.i], forest, visitor.Left(), context, true); } else { CreateParameterFrom_aNP(forest, visitor.Left(), context, true); } break; case NonTerminalSymbol.aVO: if (visitor.currentNode != null && visitor.currentNode.B == NonTerminalSymbol.G) { MatchGerundSignature(forest.a[visitor.i], forest, visitor.Right(), context, false); } else { CreateParameterFrom_aNP(forest, visitor.Right(), context, true); } break; case NonTerminalSymbol.aGP: case NonTerminalSymbol.aNP: if (visitor.currentNode != null && visitor.currentNode.B == NonTerminalSymbol.G) { MatchGerundSignature(forest.a[visitor.i], forest, visitor, context, false); } else { CreateParameterFrom_aNP(forest, visitor, context); } break; case NonTerminalSymbol.aPP: case NonTerminalSymbol.PP: context.prepFound = ""; visitor2 = new ParseTreeVisitor(visitor); CreateSymbol(forest, visitor.Left(), context); CreateSymbol(forest, visitor2.Right(), context); break; case NonTerminalSymbol.P: context.prepFound = forest.a[visitor.i]; break; case NonTerminalSymbol.GP: MatchGerundSignature(forest.a[visitor.i], forest, visitor, context, false); break; case NonTerminalSymbol.NP: // is this NP actually a gerund phrase? if (visitor.currentNode != null && visitor.currentNode.B == NonTerminalSymbol.G) { MatchGerundSignature(forest.a[visitor.i], forest, visitor, context, false); } else { FillParameterWith_NP(forest, visitor, context); } break; case NonTerminalSymbol.V: case NonTerminalSymbol.VP: if (context.InvocationBeingDefined == null) { context.InvocationBeingDefined = new Invocation(forest.a[visitor.i]); } else { context.InvocationBeingDefined.verb = forest.a[visitor.i]; } break; case NonTerminalSymbol.Ops: //AppendToFunctionBody(context); visitor2 = new ParseTreeVisitor(visitor); CreateSymbol(forest, visitor.Left(), context); CreateSymbol(forest, visitor2.Right(), context); break; case NonTerminalSymbol.ConjOp: AppendToFunctionBody(context); visitor2 = new ParseTreeVisitor(visitor); CreateSymbol(forest, visitor.Left(), context); CreateSymbol(forest, visitor2.Right(), context); break; case NonTerminalSymbol.body: CreateSymbol(forest, visitor.Right(), context); AppendToFunctionBody(context); break; case NonTerminalSymbol.DeObj: case NonTerminalSymbol.DeVar: var whichCase = visitor.currentType; visitor2 = new ParseTreeVisitor(visitor); if (visitor.currentNode.B == NonTerminalSymbol.G) { throw new Exception("Can't use a gerund phrase yet"); } Symbol ident = CreateSymbolFromNP(forest, visitor.Left(), context); using (Scope.EnterNew("of " + ident.Name)) { CreateSymbol(forest, visitor2.Right(), context); if (whichCase == NonTerminalSymbol.DeVar && context.SignatureBeingDefined.parms.Count == 1) { ident.Type = context.SignatureBeingDefined.parms[0].aNP.Type; } } break; default: visitor.currentType.ToString().Log("isn't known by the big switch statement in CreateSymbol"); return; } }