Exemple #1
0
        void ParseMacroLines(MmlMacroSource src)
        {
            //Util.DebugWriter.WriteLine ("Parsing Macro: " + src.Name);
            foreach (var line in src.Lines)
                foreach (var entry in aliases)
                    line.Text = line.Text.Replace (entry.Key, entry.Value);
            source.Lexer.SetCurrentInput (src);

            int [] range = null;
            var ch = source.Lexer.Line.PeekChar ();
            if (ch == '#' || source.Lexer.IsNumber ((char) ch)) {
                range = source.Lexer.ReadRange ().ToArray ();
                source.Lexer.SkipWhitespaces (true);
            }

            // get identifier
            var identifier = source.Lexer.ReadNewIdentifier ();
            source.Lexer.SkipWhitespaces (true);

            src.ParsedName = identifier;

            var m = new MmlMacroDefinition (identifier, range, src.Lines [0].Location);
            source.CurrentMacroDefinition = m;
            if (m.Tokens.Count == 0) {
                // get args
                source.Lexer.NewIdentifierMode = true;
                source.Lexer.Advance ();
                ParseVariableList (m.Arguments, false);
            }
            source.Lexer.NewIdentifierMode = false;
            while (source.Lexer.Advance ())
                m.Tokens.Add (source.Lexer.CreateParsedToken ());
            if (m.Tokens.Count == 0 || m.Tokens [m.Tokens.Count - 1].TokenType != MmlTokenType.CloseCurly)
                source.Lexer.LexerError (String.Format ("'{{' is expected at the end of macro definition for '{0}'", identifier));
            m.Tokens.RemoveAt (m.Tokens.Count - 1);
            result.Macros.Add (m);
            source.CurrentMacroDefinition = null;
        }
        MmlSemanticMacro BuildMacroOperationList(MmlMacroDefinition src)
        {
            var ret = new MmlSemanticMacro (src.Name, src.TargetTracks);

            foreach (var arg in src.Arguments)
                ret.Arguments.Add (BuildVariableDeclaration (arg));

            CompileOperationTokens (ret.Data, new TokenStream (src.Tokens, src.Location));

            return ret;
        }