leafParser.hpp
Go to the documentation of this file.
1
2#pragma once
3
4#include "leaf/ast.hpp"
9
10namespace by {
11 class leafTokenScan;
12
17 class _nout leafParser: public leafTokenScanable {
18 BY(ME(leafParser))
19
20 public:
21 leafParser();
22
23 public:
24 tstr<leaf> parse(const std::string& codes);
25 tstr<leaf> parse(const nchar* codes);
26 tstr<leaf> parseFromFile(const std::string& path);
27 tstr<leaf> parseFromFile(const nchar* path);
28
29 leafTokenDispatcher& getDispatcher();
30 std::vector<ncnt>& getIndents();
31
32 nbool isInit() const;
33
34 template <typename T> void setScan() { _mode = T::_instance; }
35
36 void rel();
37
38 int pushState(int newState);
39 int popState();
40
41 // events:
42 // scan:
43 using leafTokenScanable::onScan;
44 nint onScan(leafParser& ps, ZZSTYPE* val, ZZLTYPE* loc, zzscan_t scanner, nbool& isBypass) override;
45 nint onTokenEndOfFile();
46 nint onTokenColon(nint tok);
47 nint onTokenNewLine(nint tok);
48 nint onTokenComma(nint tok);
49 nint onIndent(ncnt col, nint tok);
50 nint onDedent(ncnt col, nint tok);
51 nint onIgnoreIndent(nint tok);
52 nchar onScanUnexpected(const nchar* token);
53
54 // keyword:
55 leaf* onDefBlock(leaf* stmt);
56 leaf* onDefBlock(leaf* blk, leaf* stmt);
57 leaf* onDefBlock();
58
59 // expr:
60 // def:
61 // var:
62 template <typename T> leaf* onPrimitive(const T& arg) { return new valLeaf(arg); }
63
64 verLeaf* onVer(const std::string& version);
65
66 leaf* onDefProp(const std::string& name, leaf& rhs);
67 leaf* onDefAssign(const std::string& name, leaf* rhs);
68 // obj:
69 leaf* onDefOrigin(const std::string& name, leaf& blk);
70 // container:
71 leaf* onDefArray(const leaf& elem);
72 leaf* onDefArray(leaf& as, const leaf& elem);
73 // file:
74 leaf* onCompilationUnit(leaf* blk);
75
76 void onParseErr(const std::string& msg, const nchar* symbolName);
77 void report(const std::string& msg);
78
79 private:
80 void _prepare();
81 void* _scanString(const nchar* src, void* scanner);
82 nint _onTokenEndOfInlineBlock(nint tok);
83 nint _onScan(ZZSTYPE* val, ZZLTYPE* loc, zzscan_t scanner);
84 tstr<leaf> _finalize();
85
86 private:
87 leafTokenScan* _mode;
88 nbool _isIgnoreWhitespace;
89 leafTokenDispatcher _dispatcher;
90 std::vector<ncnt> _indents;
91 tstr<leaf> _root;
92 std::vector<nint> _states;
93 leafSmartDedent _dedent;
94 std::vector<std::string> _errs;
95 };
96} // namespace by
Core AST node for leaf configuration language.
Definition: leaf.hpp:12
Parser for leaf configuration language.
Definition: leafParser.hpp:17
Smart dedent handler for indentation-based parsing.
Definition: leafSmartDedent.hpp:11
Token dispatcher for managing token queue during parsing.
Definition: leafTokenDispatcher.hpp:13
Base class for token scanning strategies.
Definition: leafTokenScan.hpp:19
Interface for token scanning during leaf parsing.
Definition: leafTokenScanable.hpp:18
Source location information.
Definition: src.hpp:11
Strong reference smart pointer with strict type checking.
Definition: tstr.hpp:13
Value leaf node for storing primitive values.
Definition: valLeaf.hpp:12
Version leaf node for semantic version handling.
Definition: verLeaf.hpp:12