示例#1
0
        private void MaybeCreateVariableFor(Pred pred, Symbol varName, LNode primType)
        {
            if (pred.ResultSaver != null)
            {
                return;
            }
            if (primType == null)
            {
                primType = F.Object;
                _sink.Write(Severity.Error, pred, Localize.Localized("The type of this expression is unknown (did you set LLLPG's 'terminalType'  option?)"));
            }
            LNode type = primType, oldType;

            if (pred.VarIsList)
            {
                type = _codeGen.GetListType(primType);
            }
            if (!_newVarInitializers.ContainsKey(varName))
            {
                _newVarInitializers[varName] = Pair.Create(type, _codeGen.MakeInitializedVarDecl(primType, pred.VarIsList, varName));
            }
            else if (!(oldType = _newVarInitializers[varName].A).Equals(type))
            {
                _sink.Write(Severity.Error, pred, Localize.Localized(
                                "Type mismatch: Variable '{0}' was generated earlier with type {1}, but this predicate expects {2}.",
                                varName, oldType, type));
            }
            pred.ResultSaver = Pred.GetStandardResultSaver(F.Id(varName),
                                                           pred.VarIsList ? S.AddSet : S.Assign);
        }