Files
fs2open.github.com/code/scripting/ade_doc.h
T
asarium ca27ae16f2 Use Antlr for generating argument list parser
This adds an Antlr grammar for parsing argument lists instead of using a
hand written parser. This allows to write much more complicated syntax
constructs and have all the code being auto-generated. It will also
produce a much more correct parser instead of having all those hacks in
the hand-written one.

This also adds (in addition to supporting the previous syntax) support
for function types along with support for them in HTML and JSON output
formats.

The ANTLR generated parser is included in source form so that it is not
necessary to have an ANTLR installation around if you are not going to
change the grammar. Also includes the necessary runtime code from Antlr.
2020-06-11 21:57:52 +02:00

135 lines
3.1 KiB
C++

#pragma once
#include "globalincs/pstypes.h"
namespace scripting {
enum class ade_type_info_type {
Empty,
Simple,
Tuple,
Array,
Map,
Iterator,
Alternative,
Function,
};
class ade_type_array;
class ade_type_map;
class ade_type_iterator;
class ade_type_alternative;
class ade_type_function;
/**
* @brief A definition of a type used in the ADE system
*/
class ade_type_info {
ade_type_info_type _type = ade_type_info_type::Empty;
SCP_string _identifier;
SCP_vector<ade_type_info> _elements;
SCP_string _name;
public:
ade_type_info() = default;
/*implicit*/ ade_type_info(const char* single_type); // NOLINT(hicpp-explicit-conversions)
/*implicit*/ ade_type_info(SCP_string single_type);
/*implicit*/ ade_type_info(std::initializer_list<ade_type_info> tuple_types);
/*implicit*/ ade_type_info(const ade_type_array& listType);
/*implicit*/ ade_type_info(const ade_type_map& listType);
/*implicit*/ ade_type_info(const ade_type_iterator& iteratorType);
/*implicit*/ ade_type_info(const ade_type_alternative& alternativeType);
/*implicit*/ ade_type_info(const ade_type_function& functionType);
ade_type_info(const ade_type_info&) = default;
ade_type_info& operator=(const ade_type_info&) = default;
ade_type_info(ade_type_info&&) noexcept;
ade_type_info& operator=(ade_type_info&&) noexcept;
ade_type_info_type getType() const;
const SCP_string& getName() const;
void setName(const SCP_string& name);
bool isEmpty() const;
bool isSimple() const;
bool isTuple() const;
bool isArray() const;
bool isAlternative() const;
const char* getIdentifier() const;
const ade_type_info& arrayType() const;
const SCP_vector<ade_type_info>& elements() const;
};
class ade_type_array {
ade_type_info _element_type;
public:
explicit ade_type_array(ade_type_info elementType);
const ade_type_info& getElementType() const;
};
class ade_type_map {
ade_type_info _key_type;
ade_type_info _value_type;
public:
explicit ade_type_map(ade_type_info keyType, ade_type_info valueType);
const ade_type_info& getKeyType() const;
const ade_type_info& getValueType() const;
};
class ade_type_iterator {
ade_type_info _element_type;
public:
explicit ade_type_iterator(ade_type_info elementType);
const ade_type_info& getElementType() const;
};
class ade_type_alternative {
SCP_vector<ade_type_info> _elements;
public:
explicit ade_type_alternative(SCP_vector<ade_type_info> elements);
const SCP_vector<ade_type_info>& getElementTypes() const;
};
class ade_type_function {
ade_type_info _returnType;
SCP_vector<ade_type_info> _argumentTypes;
public:
explicit ade_type_function(ade_type_info returnType, SCP_vector<ade_type_info> argumentTypes);
const ade_type_info& getReturnType() const;
const SCP_vector<scripting::ade_type_info>& getArgumentTypes() const;
};
class ade_overload_list {
SCP_vector<const char*> arg_lists;
public:
/*implicit*/ ade_overload_list();
/*implicit*/ ade_overload_list(const char* arglist);
/*implicit*/ ade_overload_list(std::initializer_list<const char*> overloads);
const SCP_vector<const char*>& overloads();
};
} // namespace scripting