示例#1
0
        /// PRINT keyword
        ParseNode KPrint()
        {
            WriteParseNode node = new WriteParseNode();

            InitFunctionNodes();

            ControlList cilist = new ControlList();
            cilist["FMT"] = ParseFormatSpecifier();
            cilist["UNIT"] = new NumberParseNode(new Variant(IOConstant.Stdout));

            // First column is special for F77 only
            node.FirstColumnSpecial = (_opts.F77);

            if (!IsAtEndOfLine()) {
                SimpleToken token;

                ExpectToken(TokenID.COMMA);
                VarArgParseNode varargs = new VarArgParseNode();
                do {
                    varargs.Add(ParseExpressionWithImpliedDo());
                    token = _ls.GetToken();
                } while (token.ID == TokenID.COMMA);
                _ls.BackToken();
                node.ArgList = varargs;
            }

            node.WriteParamsNode = _ioCoreFunctions.ParametersNode(cilist);
            node.WriteManagerParamsNode = _writeFunctions.ParametersNode(cilist);
            return node;
        }
示例#2
0
 /// <summary>
 /// Returns a ParametersParseNode object that represents the parameters defined
 /// for this external function using the values specified in the given control
 /// list dictionary. For parameters where no value is given, a default of 0 or
 /// NULL is substituted.
 /// </summary>
 /// <param name="cilist">A dictionary of control list values</param>
 /// <returns>A ParametersParseNode object.</returns>
 public ParametersParseNode ParametersNode(ControlList cilist)
 {
     if (cilist == null) {
         throw new ArgumentNullException("cilist");
     }
     ParametersParseNode paramList = new ParametersParseNode();
     foreach (FunctionDefinition def in _definitions) {
         if (def.Include) {
             ParseNode exprNode;
             if (!cilist.Has(def.Name)) {
                 if (Symbol.IsNumberType(def.Symbol.Type)) {
                     exprNode = new NumberParseNode(0);
                 } else if (Symbol.IsLogicalType(def.Symbol.Type)) {
                     exprNode = new NumberParseNode(new Variant(false));
                 } else {
                     exprNode = new NullParseNode();
                     exprNode.Type = def.Symbol.Type;
                 }
             } else {
                 exprNode = cilist[def.Name];
             }
             paramList.Add(exprNode, def.Symbol);
         }
     }
     return paramList;
 }
示例#3
0
        // Parse a control list.
        // The return value is a dictionary of parsenodes where the key value is
        // the parameter name. The parse node may either be an expression or a
        // literal value depending on context.
        ControlList ParseCIList(Collection<string> allowedSpecifiers)
        {
            ControlList cilist = new ControlList();
            ParseNode node = null;
            int index = 0;

            // Check for the simple format first
            if (_ls.PeekToken().ID != TokenID.LPAREN) {
                if (allowedSpecifiers.Contains("FMT")) {
                    cilist["FMT"] = ParseFormatSpecifier();
                } else if (allowedSpecifiers.Contains("UNIT")) {
                    cilist["UNIT"] = ParseUnitSpecifier();
                }
            } else {
                ExpectToken(TokenID.LPAREN);
                SimpleToken token;
                do {
                    string paramName;

                    token = _ls.GetToken();
                    if (token.ID == TokenID.IDENT && _ls.PeekToken().ID == TokenID.EQUOP) {
                        IdentifierToken identToken = (IdentifierToken)token;
                        paramName = identToken.Name;
                        ExpectToken(TokenID.EQUOP);
                    } else {
                        _ls.BackToken();
                        if (index == 0) {
                            paramName = "UNIT";
                        } else if (index == 1) {
                            paramName = "FMT";
                        } else {
                            _messages.Error(MessageCode.CILISTERROR, String.Format("Parameter at position {0} must be named", index));
                            return null;
                        }
                    }
                    if (cilist.Has(paramName)) {
                        _messages.Error(MessageCode.CILISTSPECIFIED, String.Format("Parameter {0} already specified", paramName));
                        return null;
                    }
                    if (!allowedSpecifiers.Contains(paramName)) {
                        _messages.Error(MessageCode.CILISTNOTALLOWED, String.Format("Parameter {0} not allowed here", paramName));
                        return null;
                    }
                    switch (paramName) {
                        case "UNIT":
                            if (_ls.PeekToken().ID != TokenID.STAR) {
                                node = Expression();
                            } else {
                                _ls.GetToken();
                            }
                            break;

                        case "FMT":
                            node = ParseFormatSpecifier();
                            break;

                        case "ACCESS":
                        case "FILE":
                        case "FORM":
                        case "STATUS":
                        case "BLANK":
                            node = ParseExpressionOfTypes(new [] { SymType.FIXEDCHAR, SymType.CHAR});
                            break;

                        case "END":
                        case "ERR":
                            node = ParseLabel();
                            break;

                        case "REC":
                        case "RECL":
                            node = ParseExpressionOfTypes(new [] { SymType.INTEGER });
                            break;

                        case "IOSTAT":
                        case "EXIST":
                        case "OPENED":
                        case "NUMBER":
                        case "NAMED":
                        case "NAME":
                        case "SEQUENTIAL":
                        case "DIRECT":
                        case "FORMATTED":
                        case "UNFORMATTED":
                        case "NEXTREC":
                            node = ParseIdentifier();
                            break;
                    }
                    if (node != null) {
                        cilist[paramName] = node;
                    }
                    ++index;
                    token = _ls.GetToken();
                } while (token.ID == TokenID.COMMA);
                _ls.BackToken();
                ExpectToken(TokenID.RPAREN);
            }

            // Add FMT default
            if (!cilist.Has("FMT")) {
                cilist["FMT"] = new StringParseNode(string.Empty);
            }
            return cilist;
        }