ArkScript
A small, lisp-inspired, functional scripting language
Ark::internal::Parser Class Referencefinal

#include <Parser.hpp>

Inheritance diagram for Ark::internal::Parser:
[legend]
Collaboration diagram for Ark::internal::Parser:
[legend]

Public Member Functions

 Parser (unsigned debug, ParserMode mode=ParserMode::Interpret)
 Constructs a new Parser object.
 
void process (const std::string &filename, const std::string &code)
 Parse the given code.
 
const Nodeast () const noexcept
 
const std::vector< Import > & imports () const
 
- Public Member Functions inherited from Ark::internal::BaseParser
 BaseParser ()=default
 

Private Member Functions

Node positioned (Node node, FilePosition cursor) const
 
std::optional< Node > & positioned (std::optional< Node > &node, FilePosition cursor) const
 
std::optional< Nodenode ()
 
std::optional< NodeletMutSet (FilePosition filepos)
 
std::optional< Nodedel (FilePosition filepos)
 
std::optional< Nodecondition (FilePosition filepos)
 
std::optional< Nodeloop (FilePosition filepos)
 
std::optional< Nodeimport_ (FilePosition filepos)
 
std::optional< Nodeblock (FilePosition filepos)
 
std::optional< NodefunctionArgs (FilePosition filepos)
 
std::optional< Nodefunction (FilePosition filepos)
 
std::optional< NodemacroCondition (FilePosition filepos)
 
std::optional< NodemacroArgs (FilePosition filepos)
 
std::optional< Nodemacro (FilePosition filepos)
 
std::optional< NodefunctionCall (FilePosition filepos)
 
std::optional< Nodelist (FilePosition filepos)
 
std::optional< Nodenumber (FilePosition filepos)
 
std::optional< Nodestring (FilePosition filepos)
 
std::optional< Nodefield (FilePosition filepos)
 
std::optional< Nodesymbol (FilePosition filepos)
 
std::optional< Nodespread (FilePosition filepos)
 
std::optional< Nodenil (FilePosition filepos)
 
std::optional< Nodeatom ()
 Try to parse an atom (number, string, spread, field, symbol, nil)
 
std::optional< NodeanyAtomOf (std::initializer_list< NodeType > types)
 Try to parse an atom, if any, match its type against the given list.
 
std::optional< NodenodeOrValue ()
 Try to parse an atom first, if it fails try to parse a node.
 
std::optional< Nodewrapped (std::optional< Node >(Parser::*parser)(FilePosition), const std::string &name)
 Try to parse using a given parser, prefixing and suffixing it with (...), handling comments around the parsed node.
 

Private Attributes

ParserMode m_mode
 
Logger m_logger
 
Node m_ast
 
std::vector< Importm_imports
 
unsigned m_allow_macro_behavior
 Toggled on when inside a macro definition, off afterward.
 
std::size_t m_nested_nodes
 Nested node counter.
 
std::vector< std::function< std::optional< Node >(FilePosition)> > m_parsers
 

Additional Inherited Members

- Protected Member Functions inherited from Ark::internal::BaseParser
void initParser (const std::string &filename, const std::string &code)
 
FilePosition getCursor () const
 
CodeErrorContext generateErrorContextAtCurrentPosition () const
 
void error (const std::string &error, FilePosition start_at, const std::optional< CodeErrorContext > &additional_context=std::nullopt) const
 Create an error context and throw an error containing said context.
 
void errorWithNextToken (const std::string &message, const std::optional< CodeErrorContext > &additional_context=std::nullopt)
 Fetch the next token (space and paren delimited) to generate an error.
 
void expectSuffixOrError (char suffix, const std::string &context, const std::optional< CodeErrorContext > &additional_context=std::nullopt)
 Check for a closing char or generate an error.
 
long getCount ()
 
std::size_t getSize () const
 
bool isEOF () const
 
void backtrack (long n)
 Backtrack to a given position (this is NOT an offset!)
 
bool accept (const CharPred &t, std::string *s=nullptr)
 check if a Character Predicate was able to parse, call next() if matching
 
bool expect (const CharPred &t, std::string *s=nullptr)
 heck if a Character Predicate was able to parse, call next() if matching ; throw a CodeError if it doesn't match
 
std::string peek () const
 
bool space (std::string *s=nullptr)
 
bool inlineSpace (std::string *s=nullptr)
 
bool comment (std::string *s=nullptr)
 
std::string spaceComment ()
 
std::string newlineOrComment ()
 
bool prefix (char c)
 
bool number (std::string *s=nullptr)
 
bool signedNumber (std::string *s=nullptr)
 
bool hexNumber (unsigned length, std::string *s=nullptr)
 
bool name (std::string *s=nullptr)
 
bool sequence (const std::string &s)
 
bool packageName (std::string *s=nullptr)
 
bool anyUntil (const CharPred &delim, std::string *s=nullptr)
 Match any char that do not match the predicate.
 
bool oneOf (std::initializer_list< std::string > words, std::string *s=nullptr)
 Fetch a token and try to match one of the given words.
 
- Protected Attributes inherited from Ark::internal::BaseParser
std::string m_filename
 

Detailed Description

Definition at line 36 of file Parser.hpp.

Constructor & Destructor Documentation

◆ Parser()

Ark::internal::Parser::Parser ( unsigned debug,
ParserMode mode = ParserMode::Interpret )
explicit

Constructs a new Parser object.

Parameters
debugdebug level
modehow the parser should behave regarding certain nodes and errors

Definition at line 7 of file Parser.cpp.

Member Function Documentation

◆ anyAtomOf()

std::optional< Node > Ark::internal::Parser::anyAtomOf ( std::initializer_list< NodeType > types)
private

Try to parse an atom, if any, match its type against the given list.

Parameters
typesauthorized types
Returns
std::optional<Node> std::nullopt if the parsed atom didn't match the given types

Definition at line 993 of file Parser.cpp.

References atom().

Referenced by functionCall().

◆ ast()

const Node & Ark::internal::Parser::ast ( ) const
nodiscardnoexcept
Returns
const Node& resulting AST after processing the given code

Definition at line 92 of file Parser.cpp.

References m_ast.

Referenced by Ark::Welder::computeAST(), Ark::internal::ImportSolver::parseImport(), Formatter::run(), and Formatter::runWithString().

◆ atom()

std::optional< Node > Ark::internal::Parser::atom ( )
private

Try to parse an atom (number, string, spread, field, symbol, nil)

Returns
std::optional<Node> std::nullopt if no atom could be parsed

Definition at line 961 of file Parser.cpp.

References Ark::internal::BaseParser::backtrack(), field(), Ark::internal::BaseParser::getCount(), Ark::internal::BaseParser::getCursor(), m_allow_macro_behavior, nil(), number(), spread(), string(), and symbol().

Referenced by anyAtomOf(), and nodeOrValue().

◆ block()

◆ condition()

◆ del()

◆ field()

◆ function()

◆ functionArgs()

◆ functionCall()

◆ import_()

◆ imports()

const std::vector< Import > & Ark::internal::Parser::imports ( ) const
nodiscard
Returns
const std::vector<Import>& list of imports detected by the parser

Definition at line 97 of file Parser.cpp.

References m_imports.

Referenced by Ark::Welder::computeAST(), and Ark::internal::ImportSolver::parseImport().

◆ letMutSet()

◆ list()

◆ loop()

◆ macro()

◆ macroArgs()

◆ macroCondition()

◆ nil()

◆ node()

◆ nodeOrValue()

std::optional< Node > Ark::internal::Parser::nodeOrValue ( )
private

Try to parse an atom first, if it fails try to parse a node.

Returns
std::optional<Node> std::nullopt if no atom or node could be parsed

Definition at line 1006 of file Parser.cpp.

References atom(), and node().

Referenced by block(), condition(), function(), functionCall(), letMutSet(), list(), loop(), macro(), and macroCondition().

◆ number()

std::optional< Node > Ark::internal::Parser::number ( FilePosition filepos)
private

◆ positioned() [1/2]

◆ positioned() [2/2]

std::optional< Node > & Ark::internal::Parser::positioned ( std::optional< Node > & node,
FilePosition cursor ) const
nodiscardprivate

◆ process()

◆ spread()

std::optional< Node > Ark::internal::Parser::spread ( FilePosition filepos)
private

◆ string()

◆ symbol()

std::optional< Node > Ark::internal::Parser::symbol ( FilePosition filepos)
private

Definition at line 927 of file Parser.cpp.

References Ark::internal::BaseParser::name(), positioned(), and Ark::internal::Symbol.

Referenced by atom().

◆ wrapped()

std::optional< Node > Ark::internal::Parser::wrapped ( std::optional< Node >(Parser::* parser )(FilePosition),
const std::string & name )
private

Try to parse using a given parser, prefixing and suffixing it with (...), handling comments around the parsed node.

Parameters
parserparser method returning a std::optional<Node>
nameconstruction name, eg "let", "condition"
Returns
std::optional<Node> std::nullopt if the parser didn't match

Definition at line 1016 of file Parser.cpp.

References Ark::internal::BaseParser::comment(), Ark::internal::BaseParser::expectSuffixOrError(), Ark::internal::BaseParser::generateErrorContextAtCurrentPosition(), Ark::internal::BaseParser::getCursor(), Ark::internal::BaseParser::name(), Ark::internal::BaseParser::newlineOrComment(), Ark::internal::BaseParser::prefix(), and Ark::internal::BaseParser::spaceComment().

Member Data Documentation

◆ m_allow_macro_behavior

unsigned Ark::internal::Parser::m_allow_macro_behavior
private

Toggled on when inside a macro definition, off afterward.

Definition at line 70 of file Parser.hpp.

Referenced by atom(), function(), letMutSet(), and macro().

◆ m_ast

Node Ark::internal::Parser::m_ast
private

Definition at line 68 of file Parser.hpp.

Referenced by ast(), and process().

◆ m_imports

std::vector<Import> Ark::internal::Parser::m_imports
private

Definition at line 69 of file Parser.hpp.

Referenced by import_(), and imports().

◆ m_logger

Logger Ark::internal::Parser::m_logger
private

Definition at line 67 of file Parser.hpp.

Referenced by process().

◆ m_mode

ParserMode Ark::internal::Parser::m_mode
private

Definition at line 66 of file Parser.hpp.

Referenced by nil(), and string().

◆ m_nested_nodes

std::size_t Ark::internal::Parser::m_nested_nodes
private

Nested node counter.

Definition at line 71 of file Parser.hpp.

Referenced by node().

◆ m_parsers

std::vector<std::function<std::optional<Node>(FilePosition)> > Ark::internal::Parser::m_parsers
private

Definition at line 72 of file Parser.hpp.

Referenced by node().


The documentation for this class was generated from the following files: