Ejemplo n.º 1
0
        static AstAttributes ParseLocalAttributes(ref TokenParser parser)
        {
            var rv = new AstAttributes();

            if (parser.TryConsume("["))
            {
                while (!parser.TryConsume("]") && !parser.Eof)
                {
                    if (parser.TryConsume(','))
                    {
                        continue;
                    }

                    // Get identifier
                    var ident = parser.ParseIdentifier("-");

                    // No value, end of attribute list
                    if (parser.TryConsume(']'))
                    {
                        rv.Add(new AstAttributeNode(ident, null));
                        return(rv);
                    }
                    // No value, next attribute
                    else if (parser.TryConsume(','))
                    {
                        rv.Add(new AstAttributeNode(ident, null));
                    }
                    // Has value
                    else if (parser.TryConsume('('))
                    {
                        var value = parser.ReadTo(')');
                        parser.Consume(')');
                        rv.Add(new AstAttributeNode(ident, value));
                    }
                    else
                    {
                        throw new ParseException("Unexpected character", ref parser);
                    }
                }

                if (parser.Eof)
                {
                    throw new ParseException("Unexpected EOF", ref parser);
                }
            }

            return(rv);
        }
Ejemplo n.º 2
0
        static AstAttributes ParseGlobalAttributes(ref TokenParser parser)
        {
            var rv = new AstAttributes();

            while (!parser.Eof)
            {
                parser.SkipWhitespace();
                if (parser.TryConsume('@'))
                {
                    var ident = parser.ParseIdentifier("-");
                    var value = parser.ReadToEol().Trim();
                    if (value == "@@")
                    {
                        parser.Advance(1);
                        value = "";
                        while (true)
                        {
                            var l = parser.ReadToEol();
                            if (l == "@@")
                            {
                                break;
                            }
                            else
                            {
                                value = value.Length == 0 ? l : (value + "\n" + l);
                            }
                            parser.Advance(1);
                        }
                    }
                    rv.Add(new AstAttributeNode(ident, value));
                }
                else
                {
                    return(rv);
                }
            }

            return(rv);
        }