-
- // Copyright Ferdinand Majerech 2011-2014.
- // Distributed under the Boost Software License, Version 1.0.
- // (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
-
- /// YAML tokens.
- /// Code based on PyYAML: http://www.pyyaml.org
- module dyaml.token;
-
-
- import std.conv;
-
- import dyaml.encoding;
- import dyaml.exception;
- import dyaml.reader;
- import dyaml.style;
-
-
- package:
-
- /// Token types.
- enum TokenID : ubyte
- {
- // Invalid (uninitialized) token
- invalid = 0,
- directive,
- documentStart,
- documentEnd,
- streamStart,
- streamEnd,
- blockSequenceStart,
- blockMappingStart,
- blockEnd,
- flowSequenceStart,
- flowMappingStart,
- flowSequenceEnd,
- flowMappingEnd,
- key,
- value,
- blockEntry,
- flowEntry,
- alias_,
- anchor,
- tag,
- scalar
- }
-
- /// Specifies the type of a tag directive token.
- enum DirectiveType : ubyte
- {
- // YAML version directive.
- yaml,
- // Tag directive.
- tag,
- // Any other directive is "reserved" for future YAML versions.
- reserved
- }
-
- /// Token produced by scanner.
- ///
- /// 32 bytes on 64-bit.
- struct Token
- {
- @disable int opCmp(ref Token);
-
- // 16B
- /// Value of the token, if any.
- ///
- /// Values are char[] instead of string, as Parser may still change them in a few
- /// cases. Parser casts values to strings when producing Events.
- char[] value;
- // 4B
- /// Start position of the token in file/stream.
- Mark startMark;
- // 4B
- /// End position of the token in file/stream.
- Mark endMark;
- // 1B
- /// Token type.
- TokenID id;
- // 1B
- /// Style of scalar token, if this is a scalar token.
- ScalarStyle style;
- // 1B
- /// Encoding, if this is a stream start token.
- Encoding encoding;
- // 1B
- /// Type of directive for directiveToken.
- DirectiveType directive;
- // 4B
- /// Used to split value into 2 substrings for tokens that need 2 values (tagToken)
- uint valueDivider;
-
- /// Get string representation of the token ID.
- @property string idString() @safe pure const {return id.to!string;}
- }
-
- /// Construct a directive token.
- ///
- /// Params: start = Start position of the token.
- /// end = End position of the token.
- /// value = Value of the token.
- /// directive = Directive type (YAML or TAG in YAML 1.1).
- /// nameEnd = Position of the end of the name
- Token directiveToken(const Mark start, const Mark end, char[] value,
- DirectiveType directive, const uint nameEnd) @safe pure nothrow @nogc
- {
- return Token(value, start, end, TokenID.directive, ScalarStyle.init, Encoding.init,
- directive, nameEnd);
- }
-
- /// Construct a simple (no value) token with specified type.
- ///
- /// Params: id = Type of the token.
- /// start = Start position of the token.
- /// end = End position of the token.
- Token simpleToken(TokenID id)(const Mark start, const Mark end)
- {
- return Token(null, start, end, id);
- }
-
- /// Construct a stream start token.
- ///
- /// Params: start = Start position of the token.
- /// end = End position of the token.
- /// encoding = Encoding of the stream.
- Token streamStartToken(const Mark start, const Mark end, const Encoding encoding) @safe pure nothrow @nogc
- {
- return Token(null, start, end, TokenID.streamStart, ScalarStyle.invalid, encoding);
- }
-
- /// Aliases for construction of simple token types.
- alias streamEndToken = simpleToken!(TokenID.streamEnd);
- alias blockSequenceStartToken = simpleToken!(TokenID.blockSequenceStart);
- alias blockMappingStartToken = simpleToken!(TokenID.blockMappingStart);
- alias blockEndToken = simpleToken!(TokenID.blockEnd);
- alias keyToken = simpleToken!(TokenID.key);
- alias valueToken = simpleToken!(TokenID.value);
- alias blockEntryToken = simpleToken!(TokenID.blockEntry);
- alias flowEntryToken = simpleToken!(TokenID.flowEntry);
-
- /// Construct a simple token with value with specified type.
- ///
- /// Params: id = Type of the token.
- /// start = Start position of the token.
- /// end = End position of the token.
- /// value = Value of the token.
- /// valueDivider = A hack for TagToken to store 2 values in value; the first
- /// value goes up to valueDivider, the second after it.
- Token simpleValueToken(TokenID id)(const Mark start, const Mark end, char[] value,
- const uint valueDivider = uint.max)
- {
- return Token(value, start, end, id, ScalarStyle.invalid, Encoding.init,
- DirectiveType.init, valueDivider);
- }
-
- /// Alias for construction of tag token.
- alias tagToken = simpleValueToken!(TokenID.tag);
- alias aliasToken = simpleValueToken!(TokenID.alias_);
- alias anchorToken = simpleValueToken!(TokenID.anchor);
-
- /// Construct a scalar token.
- ///
- /// Params: start = Start position of the token.
- /// end = End position of the token.
- /// value = Value of the token.
- /// style = Style of the token.
- Token scalarToken(const Mark start, const Mark end, char[] value, const ScalarStyle style) @safe pure nothrow @nogc
- {
- return Token(value, start, end, TokenID.scalar, style);
- }