mirror of
https://codeberg.org/ProgramSnail/lang_2023.git
synced 2025-12-05 22:48:42 +00:00
65 lines
1.1 KiB
C++
65 lines
1.1 KiB
C++
|
|
#pragma once
|
||
|
|
|
||
|
|
#include <string>
|
||
|
|
|
||
|
|
// for clangd
|
||
|
|
#include "tree_sitter/api.h"
|
||
|
|
|
||
|
|
|
||
|
|
namespace parser {
|
||
|
|
|
||
|
|
class ParseTree {
|
||
|
|
public:
|
||
|
|
class Node {
|
||
|
|
public:
|
||
|
|
Node() = delete;
|
||
|
|
|
||
|
|
std::string GetType();
|
||
|
|
std::pair<size_t, size_t> GetStartPoint();
|
||
|
|
std::pair<size_t, size_t> GetEndPoint();
|
||
|
|
std::string GetAsSExpression();
|
||
|
|
|
||
|
|
bool IsNull();
|
||
|
|
bool IsNamed();
|
||
|
|
bool IsMissing();
|
||
|
|
bool IsExtra(); // comments, etc.
|
||
|
|
bool HasError();
|
||
|
|
|
||
|
|
Node NthChild(size_t n);
|
||
|
|
size_t ChildCount();
|
||
|
|
|
||
|
|
Node NthNamedChild(size_t n);
|
||
|
|
size_t NamedChildCount();
|
||
|
|
|
||
|
|
Node ChildByName(const std::string& name);
|
||
|
|
|
||
|
|
// ?? use field id instaed of name ??
|
||
|
|
// ?? node equality check needed ??
|
||
|
|
private:
|
||
|
|
TSNode node_;
|
||
|
|
};
|
||
|
|
class Cursor {
|
||
|
|
public:
|
||
|
|
Cursor(const Node& node);
|
||
|
|
|
||
|
|
void ResetTo(const Node& node);
|
||
|
|
|
||
|
|
Node GetCurrentNode();
|
||
|
|
std::string GetCurrentNodeName();
|
||
|
|
|
||
|
|
bool GoToParent();
|
||
|
|
bool GoToNextSibling();
|
||
|
|
bool GoToFirstChild();
|
||
|
|
private:
|
||
|
|
TSTreeCursor cursor_;
|
||
|
|
};
|
||
|
|
|
||
|
|
ParseTree(const std::string& input);
|
||
|
|
|
||
|
|
Node GetRoot();
|
||
|
|
private:
|
||
|
|
TSTree* tree_;
|
||
|
|
};
|
||
|
|
|
||
|
|
} // namespace parser
|