Add YAML parser to Support.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153977 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Michael J. Spencer 2012-04-03 23:09:22 +00:00
parent 2ce63c7352
commit 93210e847a
182 changed files with 4586 additions and 0 deletions

View File

@ -397,6 +397,7 @@ add_subdirectory(utils/count)
add_subdirectory(utils/not)
add_subdirectory(utils/llvm-lit)
add_subdirectory(utils/json-bench)
add_subdirectory(utils/yaml-bench)
add_subdirectory(projects)

View File

@ -67,3 +67,4 @@ Autoconf llvm/autoconf
CellSPU backend llvm/lib/Target/CellSPU/README.txt
Google Test llvm/utils/unittest/googletest
OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex}
pyyaml tests llvm/test/YAMLParser/{*.data, LICENSE.TXT}

View File

@ -0,0 +1,564 @@
//===--- YAMLParser.h - Simple YAML parser --------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This is a YAML 1.2 parser.
//
// See http://www.yaml.org/spec/1.2/spec.html for the full standard.
//
// This currently does not implement the following:
// * Multi-line literal folding.
// * Tag resolution.
// * UTF-16.
// * BOMs anywhere other than the first Unicode scalar value in the file.
//
// The most important class here is Stream. This represents a YAML stream with
// 0, 1, or many documents.
//
// SourceMgr sm;
// StringRef input = getInput();
// yaml::Stream stream(input, sm);
//
// for (yaml::document_iterator di = stream.begin(), de = stream.end();
// di != de; ++di) {
// yaml::Node *n = di->getRoot();
// if (n) {
// // Do something with n...
// } else
// break;
// }
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_SUPPORT_YAML_PARSER_H
#define LLVM_SUPPORT_YAML_PARSER_H
#include "llvm/ADT/OwningPtr.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Support/SMLoc.h"
#include <limits>
#include <utility>
namespace llvm {
class MemoryBuffer;
class SourceMgr;
class raw_ostream;
class Twine;
namespace yaml {
class document_iterator;
class Document;
class Node;
class Scanner;
struct Token;
/// @brief Dump all the tokens in this stream to OS.
/// @returns true if there was an error, false otherwise.
bool dumpTokens(StringRef Input, raw_ostream &);
/// @brief Scans all tokens in input without outputting anything. This is used
/// for benchmarking the tokenizer.
/// @returns true if there was an error, false otherwise.
bool scanTokens(StringRef Input);
/// @brief Escape \a Input for a double quoted scalar.
std::string escape(StringRef Input);
/// @brief This class represents a YAML stream potentially containing multiple
/// documents.
class Stream {
public:
Stream(StringRef Input, SourceMgr &);
document_iterator begin();
document_iterator end();
void skip();
bool failed();
bool validate() {
skip();
return !failed();
}
void printError(Node *N, const Twine &Msg);
private:
OwningPtr<Scanner> scanner;
OwningPtr<Document> CurrentDoc;
friend class Document;
/// @brief Validate a %YAML x.x directive.
void handleYAMLDirective(const Token &);
};
/// @brief Abstract base class for all Nodes.
class Node {
public:
enum NodeKind {
NK_Null,
NK_Scalar,
NK_KeyValue,
NK_Mapping,
NK_Sequence,
NK_Alias
};
Node(unsigned int Type, OwningPtr<Document>&, StringRef Anchor);
virtual ~Node();
/// @brief Get the value of the anchor attached to this node. If it does not
/// have one, getAnchor().size() will be 0.
StringRef getAnchor() const { return Anchor; }
SMRange getSourceRange() const { return SourceRange; }
void setSourceRange(SMRange SR) { SourceRange = SR; }
// These functions forward to Document and Scanner.
Token &peekNext();
Token getNext();
Node *parseBlockNode();
BumpPtrAllocator &getAllocator();
void setError(const Twine &Message, Token &Location) const;
bool failed() const;
virtual void skip() {};
unsigned int getType() const { return TypeID; }
static inline bool classof(const Node *) { return true; }
void *operator new ( size_t Size
, BumpPtrAllocator &Alloc
, size_t Alignment = 16) throw() {
return Alloc.Allocate(Size, Alignment);
}
void operator delete(void *Ptr, BumpPtrAllocator &Alloc, size_t) throw() {
Alloc.Deallocate(Ptr);
}
protected:
OwningPtr<Document> &Doc;
SMRange SourceRange;
private:
unsigned int TypeID;
StringRef Anchor;
};
/// @brief A null value.
///
/// Example:
/// !!null null
class NullNode : public Node {
public:
NullNode(OwningPtr<Document> &D) : Node(NK_Null, D, StringRef()) {}
static inline bool classof(const NullNode *) { return true; }
static inline bool classof(const Node *N) {
return N->getType() == NK_Null;
}
};
/// @brief A scalar node is an opaque datum that can be presented as a
/// series of zero or more Unicode scalar values.
///
/// Example:
/// Adena
class ScalarNode : public Node {
public:
ScalarNode(OwningPtr<Document> &D, StringRef Anchor, StringRef Val)
: Node(NK_Scalar, D, Anchor)
, Value(Val) {
SMLoc Start = SMLoc::getFromPointer(Val.begin());
SMLoc End = SMLoc::getFromPointer(Val.end() - 1);
SourceRange = SMRange(Start, End);
}
// Return Value without any escaping or folding or other fun YAML stuff. This
// is the exact bytes that are contained in the file (after conversion to
// utf8).
StringRef getRawValue() const { return Value; }
/// @brief Gets the value of this node as a StringRef.
///
/// @param Storage is used to store the content of the returned StringRef iff
/// it requires any modification from how it appeared in the source.
/// This happens with escaped characters and multi-line literals.
StringRef getValue(SmallVectorImpl<char> &Storage) const;
static inline bool classof(const ScalarNode *) { return true; }
static inline bool classof(const Node *N) {
return N->getType() == NK_Scalar;
}
private:
StringRef Value;
StringRef unescapeDoubleQuoted( StringRef UnquotedValue
, StringRef::size_type Start
, SmallVectorImpl<char> &Storage) const;
};
static bool getAs(const ScalarNode *SN, bool &Result) {
SmallString<4> Storage;
StringRef Value = SN->getValue(Storage);
if (Value == "true")
Result = true;
else if (Value == "false")
Result = false;
else
return false;
return true;
}
template<class T>
typename enable_if_c<std::numeric_limits<T>::is_integer, bool>::type
getAs(const ScalarNode *SN, T &Result) {
SmallString<4> Storage;
return !SN->getValue(Storage).getAsInteger(0, Result);
}
/// @brief A key and value pair. While not technically a Node under the YAML
/// representation graph, it is easier to treat them this way.
///
/// TODO: Consider making this not a child of Node.
///
/// Example:
/// Section: .text
class KeyValueNode : public Node {
public:
KeyValueNode(OwningPtr<Document> &D)
: Node(NK_KeyValue, D, StringRef())
, Key(0)
, Value(0)
{}
/// @brief Parse and return the key.
///
/// This may be called multiple times.
///
/// @returns The key, or nullptr if failed() == true.
Node *getKey();
/// @brief Parse and return the value.
///
/// This may be called multiple times.
///
/// @returns The value, or nullptr if failed() == true.
Node *getValue();
virtual void skip() {
getKey()->skip();
getValue()->skip();
}
static inline bool classof(const KeyValueNode *) { return true; }
static inline bool classof(const Node *N) {
return N->getType() == NK_KeyValue;
}
private:
Node *Key;
Node *Value;
};
/// @brief This is an iterator abstraction over YAML collections shared by both
/// sequences and maps.
///
/// BaseT must have a ValueT* member named CurrentEntry and a member function
/// increment() which must set CurrentEntry to 0 to create an end iterator.
template <class BaseT, class ValueT>
class basic_collection_iterator
: public std::iterator<std::forward_iterator_tag, ValueT> {
public:
basic_collection_iterator() : Base(0) {}
basic_collection_iterator(BaseT *B) : Base(B) {}
ValueT *operator ->() const {
assert(Base && Base->CurrentEntry && "Attempted to access end iterator!");
return Base->CurrentEntry;
}
ValueT &operator *() const {
assert(Base && Base->CurrentEntry &&
"Attempted to dereference end iterator!");
return *Base->CurrentEntry;
}
operator ValueT*() const {
assert(Base && Base->CurrentEntry && "Attempted to access end iterator!");
return Base->CurrentEntry;
}
bool operator !=(const basic_collection_iterator &Other) const {
if(Base != Other.Base)
return true;
return (Base && Other.Base) && Base->CurrentEntry
!= Other.Base->CurrentEntry;
}
basic_collection_iterator &operator++() {
assert(Base && "Attempted to advance iterator past end!");
Base->increment();
// Create an end iterator.
if (Base->CurrentEntry == 0)
Base = 0;
return *this;
}
private:
BaseT *Base;
};
// The following two templates are used for both MappingNode and Sequence Node.
template <class CollectionType>
typename CollectionType::iterator begin(CollectionType &C) {
assert(C.IsAtBeginning && "You may only iterate over a collection once!");
C.IsAtBeginning = false;
typename CollectionType::iterator ret(&C);
++ret;
return ret;
}
template <class CollectionType>
void skip(CollectionType &C) {
// TODO: support skipping from the middle of a parsed collection ;/
assert((C.IsAtBeginning || C.IsAtEnd) && "Cannot skip mid parse!");
if (C.IsAtBeginning)
for (typename CollectionType::iterator i = begin(C), e = C.end();
i != e; ++i)
i->skip();
}
/// @brief Represents a YAML map created from either a block map for a flow map.
///
/// This parses the YAML stream as increment() is called.
///
/// Example:
/// Name: _main
/// Scope: Global
class MappingNode : public Node {
public:
enum MappingType {
MT_Block,
MT_Flow,
MT_Inline //< An inline mapping node is used for "[key: value]".
};
MappingNode(OwningPtr<Document> &D, StringRef Anchor, MappingType MT)
: Node(NK_Mapping, D, Anchor)
, Type(MT)
, IsAtBeginning(true)
, IsAtEnd(false)
, CurrentEntry(0)
{}
friend class basic_collection_iterator<MappingNode, KeyValueNode>;
typedef basic_collection_iterator<MappingNode, KeyValueNode> iterator;
template <class T> friend typename T::iterator yaml::begin(T &);
template <class T> friend void yaml::skip(T &);
iterator begin() {
return yaml::begin(*this);
}
iterator end() { return iterator(); }
virtual void skip() {
yaml::skip(*this);
}
static inline bool classof(const MappingNode *) { return true; }
static inline bool classof(const Node *N) {
return N->getType() == NK_Mapping;
}
private:
MappingType Type;
bool IsAtBeginning;
bool IsAtEnd;
KeyValueNode *CurrentEntry;
void increment();
};
/// @brief Represents a YAML sequence created from either a block sequence for a
/// flow sequence.
///
/// This parses the YAML stream as increment() is called.
///
/// Example:
/// - Hello
/// - World
class SequenceNode : public Node {
public:
enum SequenceType {
ST_Block,
ST_Flow,
// Use for:
//
// key:
// - val1
// - val2
//
// As a BlockMappingEntry and BlockEnd are not created in this case.
ST_Indentless
};
SequenceNode(OwningPtr<Document> &D, StringRef Anchor, SequenceType ST)
: Node(NK_Sequence, D, Anchor)
, SeqType(ST)
, IsAtBeginning(true)
, IsAtEnd(false)
, WasPreviousTokenFlowEntry(true) // Start with an imaginary ','.
, CurrentEntry(0)
{}
friend class basic_collection_iterator<SequenceNode, Node>;
typedef basic_collection_iterator<SequenceNode, Node> iterator;
template <class T> friend typename T::iterator yaml::begin(T &);
template <class T> friend void yaml::skip(T &);
void increment();
iterator begin() {
return yaml::begin(*this);
}
iterator end() { return iterator(); }
virtual void skip() {
yaml::skip(*this);
}
static inline bool classof(const SequenceNode *) { return true; }
static inline bool classof(const Node *N) {
return N->getType() == NK_Sequence;
}
private:
SequenceType SeqType;
bool IsAtBeginning;
bool IsAtEnd;
bool WasPreviousTokenFlowEntry;
Node *CurrentEntry;
};
/// @brief Represents an alias to a Node with an anchor.
///
/// Example:
/// *AnchorName
class AliasNode : public Node {
public:
AliasNode(OwningPtr<Document> &D, StringRef Val)
: Node(NK_Alias, D, StringRef()), Name(Val) {}
StringRef getName() const { return Name; }
Node *getTarget();
static inline bool classof(const ScalarNode *) { return true; }
static inline bool classof(const Node *N) {
return N->getType() == NK_Alias;
}
private:
StringRef Name;
};
/// @brief A YAML Stream is a sequence of Documents. A document contains a root
/// node.
class Document {
public:
/// @brief Root for parsing a node. Returns a single node.
Node *parseBlockNode();
Document(Stream &ParentStream);
/// @brief Finish parsing the current document and return true if there are
/// more. Return false otherwise.
bool skip();
/// @brief Parse and return the root level node.
Node *getRoot() {
if (Root)
return Root;
return Root = parseBlockNode();
}
private:
friend class Node;
friend class document_iterator;
/// @brief Stream to read tokens from.
Stream &stream;
/// @brief Used to allocate nodes to. All are destroyed without calling their
/// destructor when the document is destroyed.
BumpPtrAllocator NodeAllocator;
/// @brief The root node. Used to support skipping a partially parsed
/// document.
Node *Root;
Token &peekNext();
Token getNext();
void setError(const Twine &Message, Token &Location) const;
bool failed() const;
void handleTagDirective(const Token &Tag) {
// TODO: Track tags.
}
/// @brief Parse %BLAH directives and return true if any were encountered.
bool parseDirectives();
/// @brief Consume the next token and error if it is not \a TK.
bool expectToken(int TK);
};
/// @brief Iterator abstraction for Documents over a Stream.
class document_iterator {
public:
document_iterator() : Doc(NullDoc) {}
document_iterator(OwningPtr<Document> &D) : Doc(D) {}
bool operator !=(const document_iterator &Other) {
return Doc != Other.Doc;
}
document_iterator operator ++() {
if (!Doc->skip()) {
Doc.reset(0);
} else {
Stream &S = Doc->stream;
Doc.reset(new Document(S));
}
return *this;
}
Document &operator *() {
return *Doc;
}
OwningPtr<Document> &operator ->() {
return Doc;
}
private:
static OwningPtr<Document> NullDoc;
OwningPtr<Document> &Doc;
};
}
}
#endif

View File

@ -54,6 +54,7 @@ add_llvm_library(LLVMSupport
ToolOutputFile.cpp
Triple.cpp
Twine.cpp
YAMLParser.cpp
raw_os_ostream.cpp
raw_ostream.cpp
regcomp.c

2115
lib/Support/YAMLParser.cpp Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,19 @@
Copyright (c) 2006 Kirill Simonov
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,6 @@
# RUN: yaml-bench -canonical %s
- yes
- NO
- True
- on

View File

@ -0,0 +1,11 @@
# RUN: yaml-bench -canonical %s
canonical: yes
answer: NO
logical: True
option: on
but:
y: is a string
n: is a string

View File

@ -0,0 +1,28 @@
# RUN: yaml-bench -canonical %s
---
- !tag1
x: 1
- !tag1
x: 1
'y': 2
z: 3
- !tag2
10
- !tag2
=: 10
'y': 20
z: 30
- !tag3
x: 1
- !tag3
x: 1
'y': 2
z: 3
- !tag3
=: 1
'y': 2
z: 3
- !foo
my-parameter: foo
my-another-parameter: [1,2,3]

View File

@ -0,0 +1,8 @@
# RUN: yaml-bench -canonical %s
canonical: 6.8523015e+5
exponential: 685.230_15e+03
fixed: 685_230.15
sexagesimal: 190:20:30.15
negative infinity: -.inf
not a number: .NaN

View File

@ -0,0 +1,8 @@
# RUN: yaml-bench -canonical %s
canonical: 685230
decimal: +685_230
octal: 02472256
hexadecimal: 0x_0A_74_AE
binary: 0b1010_0111_0100_1010_1110
sexagesimal: 190:20:30

View File

@ -0,0 +1,8 @@
# RUN: yaml-bench -canonical %s
# Unordered set of key: value pairs.
Block style: !!map
Clark : Evans
Brian : Ingerson
Oren : Ben-Kiki
Flow style: !!map { Clark: Evans, Brian: Ingerson, Oren: Ben-Kiki }

View File

@ -0,0 +1,29 @@
# RUN: yaml-bench -canonical %s
---
- &CENTER { x: 1, 'y': 2 }
- &LEFT { x: 0, 'y': 2 }
- &BIG { r: 10 }
- &SMALL { r: 1 }
# All the following maps are equal:
- # Explicit keys
x: 1
'y': 2
r: 10
label: center/big
- # Merge one map
<< : *CENTER
r: 10
label: center/big
- # Merge multiple maps
<< : [ *CENTER, *BIG ]
label: center/big
- # Override
<< : [ *BIG, *LEFT, *SMALL ]
x: 1
label: center/big

View File

@ -0,0 +1,20 @@
# RUN: yaml-bench -canonical %s
# A document may be null.
---
---
# This mapping has four keys,
# one has a value.
empty:
canonical: ~
english: null
~: null key
---
# This sequence has five
# entries, two have values.
sparse:
- ~
- 2nd entry
-
- 4th entry
- Null

View File

@ -0,0 +1,10 @@
# RUN: yaml-bench -canonical %s
# Explicitly typed ordered map (dictionary).
Bestiary: !!omap
- aardvark: African pig-like ant eater. Ugly.
- anteater: South-American ant eater. Two species.
- anaconda: South-American constrictor snake. Scaly.
# Etc.
# Flow style
Numbers: !!omap [ one: 1, two: 2, three : 3 ]

View File

@ -0,0 +1,9 @@
# RUN: yaml-bench -canonical %s
# Explicitly typed pairs.
Block tasks: !!pairs
- meeting: with team.
- meeting: with boss.
- break: lunch.
- meeting: with client.
Flow tasks: !!pairs [ meeting: with team, meeting: with boss ]

View File

@ -0,0 +1,17 @@
# RUN: yaml-bench -canonical %s
# Ordered sequence of nodes
Block style: !!seq
- Mercury # Rotates - no light/dark sides.
- Venus # Deadliest. Aptly named.
- Earth # Mostly dirt.
- Mars # Seems empty.
- Jupiter # The king.
- Saturn # Pretty.
- Uranus # Where the sun hardly shines.
- Neptune # Boring. No rings.
- Pluto # You call this a planet?
Flow style: !!seq [ Mercury, Venus, Earth, Mars, # Rocks
Jupiter, Saturn, Uranus, Neptune, # Gas
Pluto ] # Overrated

View File

@ -0,0 +1,9 @@
# RUN: yaml-bench -canonical %s
# Explicitly typed set.
baseball players: !!set
? Mark McGwire
? Sammy Sosa
? Ken Griffey
# Flow style
baseball teams: !!set { Boston Red Sox, Detroit Tigers, New York Yankees }

View File

@ -0,0 +1,3 @@
# RUN: yaml-bench -canonical %s
--- !!str "ascii string"

View File

@ -0,0 +1,3 @@
# RUN: yaml-bench -canonical %s
string: abcd

View File

@ -0,0 +1,7 @@
# RUN: yaml-bench -canonical %s
canonical: 2001-12-15T02:59:43.1Z
valid iso8601: 2001-12-14t21:59:43.10-05:00
space separated: 2001-12-14 21:59:43.10 -5
no time zone (Z): 2001-12-15 2:59:43.10
date (00:00:00Z): 2002-12-14

View File

@ -0,0 +1,12 @@
# RUN: yaml-bench -canonical %s
--- # Old schema
link with:
- library1.dll
- library2.dll
--- # New schema
link with:
- = : library1.dll
version: 1.2
- = : library2.dll
version: 2.3

View File

@ -0,0 +1,5 @@
# RUN: yaml-bench -canonical %s
---
foo: bar
foo: baz

View File

@ -0,0 +1,8 @@
# RUN: yaml-bench -canonical %s
---
&anchor foo:
foo: bar
*anchor: duplicate key
baz: bat
*anchor: duplicate key

View File

@ -0,0 +1,6 @@
# RUN: yaml-bench -canonical %s
---
<<: {x: 1, y: 2}
foo: bar
<<: {z: 3, t: 4}

View File

@ -0,0 +1,6 @@
# RUN: yaml-bench -canonical %s
---
=: 1
foo: bar
=: 2

View File

@ -0,0 +1,6 @@
# RUN: yaml-bench -canonical %s
? |-
foo
: |-
bar

View File

@ -0,0 +1,2 @@
# RUN: yaml-bench -canonical %s

View File

@ -0,0 +1,8 @@
# RUN: yaml-bench -canonical %s
- 6.8523015e+5
- 685.230_15e+03
- 685_230.15
- 190:20:30.15
- -.inf
- .NaN

8
test/YAMLParser/int.data Normal file
View File

@ -0,0 +1,8 @@
# RUN: yaml-bench -canonical %s
- 685230
- +685_230
- 02472256
- 0x_0A_74_AE
- 0b1010_0111_0100_1010_1110
- 190:20:30

View File

@ -0,0 +1,4 @@
# RUN: yaml-bench -canonical %s
- "foo 'bar'"
- "foo\n'bar'"

View File

@ -0,0 +1,3 @@
# RUN: yaml-bench -canonical %s
- <<

View File

@ -0,0 +1,3 @@
# RUN: yaml-bench -canonical %s
[0.0, +1.0, -1.0, +.inf, -.inf, .nan, .nan]

View File

@ -0,0 +1,3 @@
# RUN: yaml-bench -canonical %s
-1.0

View File

@ -0,0 +1,5 @@
# RUN: yaml-bench -canonical %s
-
- ~
- null

View File

@ -0,0 +1,32 @@
# RUN: yaml-bench -canonical %s
---
"this scalar should be selected"
---
key11: !foo
key12:
is: [selected]
key22:
key13: [not, selected]
key23: [not, selected]
key32:
key31: [not, selected]
key32: [not, selected]
key33: {not: selected}
key21: !bar
- not selected
- selected
- not selected
key31: !baz
key12:
key13:
key14: {selected}
key23:
key14: [not, selected]
key33:
key14: {selected}
key24: {not: selected}
key22:
- key14: {selected}
key24: {not: selected}
- key14: {selected}

View File

@ -0,0 +1,10 @@
# RUN: yaml-bench -canonical %s
---
- Harry Potter and the Prisoner of Azkaban
- Harry Potter and the Goblet of Fire
- Harry Potter and the Order of the Phoenix
---
- Memoirs Found in a Bathtub
- Snow Crash
- Ghost World

View File

@ -0,0 +1,5 @@
# RUN: yaml-bench -canonical %s
# Ticket #4
---
...

View File

@ -0,0 +1,5 @@
# RUN: yaml-bench -canonical %s
foo:
bar
baz

View File

@ -0,0 +1,3 @@
# RUN: yaml-bench -canonical %s
.

View File

@ -0,0 +1,19 @@
# RUN: yaml-bench -canonical %s
---
in the block context:
indentation should be kept: {
but in the flow context: [
it may be violated]
}
---
the parser does not require scalars
to be indented with at least one space
...
---
"the parser does not require scalars
to be indented with at least one space"
---
foo:
bar: 'quoted scalars
may not adhere indentation'

View File

@ -0,0 +1,5 @@
# RUN: yaml-bench -canonical %s
- Mark McGwire
- Sammy Sosa
- Ken Griffey

View File

@ -0,0 +1,5 @@
# RUN: yaml-bench -canonical %s
hr: 65 # Home runs
avg: 0.278 # Batting average
rbi: 147 # Runs Batted In

View File

@ -0,0 +1,10 @@
# RUN: yaml-bench -canonical %s
american:
- Boston Red Sox
- Detroit Tigers
- New York Yankees
national:
- New York Mets
- Chicago Cubs
- Atlanta Braves

View File

@ -0,0 +1,10 @@
# RUN: yaml-bench -canonical %s
-
name: Mark McGwire
hr: 65
avg: 0.278
-
name: Sammy Sosa
hr: 63
avg: 0.288

View File

@ -0,0 +1,5 @@
# RUN: yaml-bench -canonical %s
- [name , hr, avg ]
- [Mark McGwire, 65, 0.278]
- [Sammy Sosa , 63, 0.288]

View File

@ -0,0 +1,7 @@
# RUN: yaml-bench -canonical %s
Mark McGwire: {hr: 65, avg: 0.278}
Sammy Sosa: {
hr: 63,
avg: 0.288
}

View File

@ -0,0 +1,12 @@
# RUN: yaml-bench -canonical %s
# Ranking of 1998 home runs
---
- Mark McGwire
- Sammy Sosa
- Ken Griffey
# Team ranking
---
- Chicago Cubs
- St Louis Cardinals

View File

@ -0,0 +1,12 @@
# RUN: yaml-bench -canonical %s
---
time: 20:03:20
player: Sammy Sosa
action: strike (miss)
...
---
time: 20:03:47
player: Sammy Sosa
action: grand slam
...

View File

@ -0,0 +1,10 @@
# RUN: yaml-bench -canonical %s
---
hr: # 1998 hr ranking
- Mark McGwire
- Sammy Sosa
rbi:
# 1998 rbi ranking
- Sammy Sosa
- Ken Griffey

View File

@ -0,0 +1,10 @@
# RUN: yaml-bench -canonical %s
---
hr:
- Mark McGwire
# Following node labeled SS
- &SS Sammy Sosa
rbi:
- *SS # Subsequent occurrence
- Ken Griffey

View File

@ -0,0 +1,11 @@
# RUN: yaml-bench -canonical %s
? - Detroit Tigers
- Chicago cubs
:
- 2001-07-23
? [ New York Yankees,
Atlanta Braves ]
: [ 2001-07-02, 2001-08-12,
2001-08-14 ]

View File

@ -0,0 +1,10 @@
# RUN: yaml-bench -canonical %s
---
# products purchased
- item : Super Hoop
quantity: 1
- item : Basketball
quantity: 4
- item : Big Shoes
quantity: 1

View File

@ -0,0 +1,6 @@
# RUN: yaml-bench -canonical %s
# ASCII Art
--- |
\//||\/||
// || ||__

View File

@ -0,0 +1,6 @@
# RUN: yaml-bench -canonical %s
---
Mark McGwire's
year was crippled
by a knee injury.

View File

@ -0,0 +1,10 @@
# RUN: yaml-bench -canonical %s
>
Sammy Sosa completed another
fine season with great stats.
63 Home Runs
0.288 Batting Average
What a year!

View File

@ -0,0 +1,9 @@
# RUN: yaml-bench -canonical %s
name: Mark McGwire
accomplishment: >
Mark set a major league
home run record in 1998.
stats: |
65 Home Runs
0.278 Batting Average

View File

@ -0,0 +1,16 @@
# RUN: yaml-bench -canonical %s
unicode: "Sosa did fine.\u263A"
control: "\b1998\t1999\t2000\n"
hexesc: "\x13\x10 is \r\n"
single: '"Howdy!" he cried.'
quoted: ' # not a ''comment''.'
tie-fighter: '|\-*-/|'
# CHECK: !!str "Sosa did fine.\u263A"
# CHECK: !!str "\b1998\t1999\t2000\n"
# CHECK: !!str "\x13\x10 is \r\n"
# CHECK: !!str "\"Howdy!\" he cried."
# CHECK: !!str " # not a 'comment'."
# CHECK: !!str "|\\-*-/|"

View File

@ -0,0 +1,8 @@
# RUN: yaml-bench -canonical %s
plain:
This unquoted scalar
spans many lines.
quoted: "So does this
quoted scalar.\n"

View File

@ -0,0 +1,7 @@
# RUN: yaml-bench -canonical %s
canonical: 12345
decimal: +12,345
sexagesimal: 3:25:45
octal: 014
hexadecimal: 0xC

View File

@ -0,0 +1,8 @@
# RUN: yaml-bench -canonical %s
canonical: 1.23015e+3
exponential: 12.3015e+02
sexagesimal: 20:30.15
fixed: 1,230.15
negative infinity: -.inf
not a number: .NaN

View File

@ -0,0 +1,6 @@
# RUN: yaml-bench -canonical %s
null: ~
true: y
false: n
string: '12345'

View File

@ -0,0 +1,6 @@
# RUN: yaml-bench -canonical %s
canonical: 2001-12-15T02:59:43.1Z
iso8601: 2001-12-14t21:59:43.10-05:00
spaced: 2001-12-14 21:59:43.10 -5
date: 2002-12-14

View File

@ -0,0 +1,15 @@
# RUN: yaml-bench -canonical %s
---
not-date: !!str 2002-04-28
picture: !!binary |
R0lGODlhDAAMAIQAAP//9/X
17unp5WZmZgAAAOfn515eXv
Pz7Y6OjuDg4J+fn5OTk6enp
56enmleECcgggoBADs=
application specific tag: !something |
The semantics of the tag
above may be different for
different documents.

View File

@ -0,0 +1,16 @@
# RUN: yaml-bench -canonical %s
%TAG ! tag:clarkevans.com,2002:
--- !shape
# Use the ! handle for presenting
# tag:clarkevans.com,2002:circle
- !circle
center: &ORIGIN {x: 73, y: 129}
radius: 7
- !line
start: *ORIGIN
finish: { x: 89, y: 102 }
- !label
start: *ORIGIN
color: 0xFFEEBB
text: Pretty vector drawing.

View File

@ -0,0 +1,9 @@
# RUN: yaml-bench -canonical %s
# sets are represented as a
# mapping where each key is
# associated with the empty string
--- !!set
? Mark McGwire
? Sammy Sosa
? Ken Griff

View File

@ -0,0 +1,9 @@
# RUN: yaml-bench -canonical %s
# ordered maps are represented as
# a sequence of mappings, with
# each mapping having one key
--- !!omap
- Mark McGwire: 65
- Sammy Sosa: 63
- Ken Griffy: 58

View File

@ -0,0 +1,31 @@
# RUN: yaml-bench -canonical %s
--- !<tag:clarkevans.com,2002:invoice>
invoice: 34843
date : 2001-01-23
bill-to: &id001
given : Chris
family : Dumars
address:
lines: |
458 Walkman Dr.
Suite #292
city : Royal Oak
state : MI
postal : 48046
ship-to: *id001
product:
- sku : BL394D
quantity : 4
description : Basketball
price : 450.00
- sku : BL4438H
quantity : 1
description : Super Hoop
price : 2392.00
tax : 251.42
total: 4443.52
comments:
Late afternoon is best.
Backup contact is Nancy
Billsmer @ 338-4338.

View File

@ -0,0 +1,28 @@
# RUN: yaml-bench -canonical %s
---
Time: 2001-11-23 15:01:42 -5
User: ed
Warning:
This is an error message
for the log file
---
Time: 2001-11-23 15:02:31 -5
User: ed
Warning:
A slightly different error
message.
---
Date: 2001-11-23 15:03:17 -5
User: ed
Fatal:
Unknown variable "bar"
Stack:
- file: TopClass.py
line: 23
code: |
x = MoreObject("345\n")
- file: MoreClass.py
line: 58
code: |-
foo = bar

View File

@ -0,0 +1,3 @@
# RUN: yaml-bench -canonical %s
# Comment only.

View File

@ -0,0 +1,7 @@
# RUN: yaml-bench -canonical %s |& FileCheck %s
# Invalid use of BOM
# inside a
# document.
# CHECK: error

View File

@ -0,0 +1,9 @@
# RUN: yaml-bench -canonical %s
sequence:
- one
- two
mapping:
? sky
: blue
? sea : green

View File

@ -0,0 +1,4 @@
# RUN: yaml-bench -canonical %s
sequence: [ one, two, ]
mapping: { sky: blue, sea: green }

View File

@ -0,0 +1,3 @@
# RUN: yaml-bench -canonical %s
# Comment only.

View File

@ -0,0 +1,4 @@
# RUN: yaml-bench -canonical %s
anchored: !local &anchor value
alias: *anchor

View File

@ -0,0 +1,6 @@
# RUN: yaml-bench -canonical %s
literal: |
text
folded: >
text

View File

@ -0,0 +1,4 @@
# RUN: yaml-bench -canonical %s
single: 'text'
double: "text"

View File

@ -0,0 +1,4 @@
# RUN: yaml-bench -canonical %s
%YAML 1.1
--- text

View File

@ -0,0 +1,6 @@
# RUN: yaml-bench -canonical %s |& FileCheck %s
commercial-at: @text
grave-accent: `text
# CHECK: error

View File

@ -0,0 +1,5 @@
# RUN: yaml-bench -canonical %s
|
Generic line break (no glyph)
Generic line break (glyphed)… Line separator Paragraph separator

View File

@ -0,0 +1,16 @@
# RUN: yaml-bench -canonical %s |& FileCheck %s
#
# We don't currently reject tabs as indentation.
# XFAIL: *
# Tabs do's and don'ts:
# comment:
quoted: "Quoted "
block: |
void main() {
printf("Hello, world!\n");
}
elsewhere: # separation
indentation, in plain scalar
# CHECK: error

View File

@ -0,0 +1,5 @@
# RUN: yaml-bench -canonical %s
"Text containing
both space and
tab characters"

View File

@ -0,0 +1,9 @@
# RUN: yaml-bench -canonical %s
"Fun with \\
\" \a \b \e \f \
\n \r \t \v \0 \
\ \_ \N \L \P \
\x41 \u0041 \U00000041"
# CHECK: !!str "Fun with \\\n\" \a \b \e \f \n \r \t \v \0 \_ \N \L \P A A A"

View File

@ -0,0 +1,7 @@
# RUN: yaml-bench -canonical %s |& FileCheck %s
Bad escapes:
"\c
\xq-"
# CHECK: error

View File

@ -0,0 +1,16 @@
# RUN: yaml-bench -canonical %s
# Leading comment line spaces are
# neither content nor indentation.
Not indented:
By one space: |
By four
spaces
Flow style: [ # Leading spaces
By two, # in flow style
Also by two, # are neither
# Tabs are not allowed:
# Still by two # content nor
Still by two # content nor
] # indentation.

View File

@ -0,0 +1,5 @@
# RUN: yaml-bench -canonical %s
# Comment

View File

@ -0,0 +1,4 @@
# RUN: yaml-bench -canonical %s
key: # Comment
value

View File

@ -0,0 +1,6 @@
# RUN: yaml-bench -canonical %s
key: # Comment
# lines
value

View File

@ -0,0 +1,8 @@
# RUN: yaml-bench -canonical %s
{ first: Sammy, last: Sosa }:
# Statistics:
hr: # Home runs
65
avg: # Average
0.278

View File

@ -0,0 +1,9 @@
# RUN: yaml-bench -canonical %s
plain: text
lines
quoted: "text
lines"
block: |
text
lines

View File

@ -0,0 +1,10 @@
# RUN: yaml-bench -canonical %s
- foo
bar
- |-
foo
bar

View File

@ -0,0 +1,4 @@
# RUN: yaml-bench -canonical %s
>-
specific trimmed… … …… as… space

View File

@ -0,0 +1,5 @@
# RUN: yaml-bench -canonical %s
%FOO bar baz # Should be ignored
# with a warning.
--- "foo"

View File

@ -0,0 +1,6 @@
# RUN: yaml-bench -canonical %s
%YAML 1.2 # Attempt parsing
# with a warning
---
"foo"

View File

@ -0,0 +1,7 @@
# RUN: yaml-bench -canonical %s |& FileCheck %s
%YAML 1.1
%YAML 1.1
foo
# CHECK: error

View File

@ -0,0 +1,5 @@
# RUN: yaml-bench -canonical %s
%TAG !yaml! tag:yaml.org,2002:
---
!yaml!str "foo"

View File

@ -0,0 +1,10 @@
# RUN: yaml-bench -canonical %s |& FileCheck %s
#
# We don't currently parse TAG directives.
# XFAIL: *
%TAG ! !foo
%TAG ! !foo
bar
# CHECK: error

View File

@ -0,0 +1,7 @@
# RUN: yaml-bench -canonical %s
%TAG ! !foo
%TAG !yaml! tag:yaml.org,2002:
---
- !bar "baz"
- !yaml!str "string"

View File

@ -0,0 +1,4 @@
# RUN: yaml-bench -canonical %s
# Private application:
!foo "bar"

View File

@ -0,0 +1,6 @@
# RUN: yaml-bench -canonical %s
# Migrated to global:
%TAG ! tag:ben-kiki.org,2000:app/
---
!foo "bar"

Some files were not shown because too many files have changed in this diff Show More