MXVM 1.8.1
Virtual Machine, Compiler, and Pascal Frontend
Loading...
Searching...
No Matches
parser.hpp
Go to the documentation of this file.
1
6#ifndef _PARSER_H_X
7#define _PARSER_H_X
8
9#include "mxvm/instruct.hpp"
10#include "mxvm/valid.hpp"
11#include "scanner/scanner.hpp"
12#include <cstdint>
13#include <iostream>
14#include <memory>
15#include <string>
16#include <unordered_map>
17
18namespace mxvm {
19 class ProgramNode;
20 class SectionNode;
21 class InstructionNode;
22 class VariableNode;
23 class CommentNode;
24 class LabelNode;
25 class Program;
26 class ModuleNode;
27 class ObjectNode;
28 struct Variable;
29 struct Operand;
30
31 extern bool debug_mode;
32 extern bool instruct_mode;
33 extern bool html_mode;
34
40
42 enum class Platform {
46 };
47
48 class ModuleParser;
49
57 class Parser {
58
59 public:
60 friend class ModuleParser;
65 explicit Parser(const std::string &source);
67 Parser(const Parser &other)
68 : source_file(other.source_file),
69 scanner(other.scanner),
70 validator(other.validator),
77 platform{other.platform} {}
78
80 Parser &operator=(const Parser &other) {
81 if (this != &other) {
83 scanner = other.scanner;
84 validator = other.validator;
91 platform = other.platform;
92 }
93 return *this;
94 }
95
97 uint64_t scan();
98
100 void parse();
102 auto operator[](size_t pos);
103
109 std::unique_ptr<ProgramNode> parseProgramOrObject(uint64_t &index);
114 std::unique_ptr<ProgramNode> parseAST();
121 bool generateProgramCode(const Mode &m, std::unique_ptr<Program> &program);
123 bool generateDebugHTML(std::ostream &out, std::unique_ptr<Program> &program);
125 void generateObjectAssemblyFile(std::unique_ptr<Program> &objProgram);
127 void registerObjectExterns(std::unique_ptr<Program> &mainProgram, const std::unique_ptr<Program> &objProgram);
128 std::string source_file;
132 std::string module_path = ".";
133 std::string object_path = ".";
134 std::string include_path = "/usr/local/include/mxvm/modules";
135 bool object_mode = false;
136 std::string object_name;
138
139 private:
140 std::unique_ptr<SectionNode> parseSection(uint64_t &index);
141 std::unique_ptr<VariableNode> parseDataVariable(uint64_t &index);
142 std::unique_ptr<InstructionNode> parseCodeInstruction(uint64_t &index);
143 std::unique_ptr<CommentNode> parseComment(uint64_t &index);
144 std::unique_ptr<LabelNode> parseLabel(uint64_t &index);
145 std::unique_ptr<ModuleNode> parseModule(uint64_t &index);
146 std::unique_ptr<ObjectNode> parseObject(uint64_t &index);
147
148 void processDataSection(SectionNode *sectionNode, std::unique_ptr<Program> &program);
149 void processCodeSection(SectionNode *sectionNode, std::unique_ptr<Program> &program);
150 void processModuleSection(SectionNode *sectionNode, std::unique_ptr<Program> &program);
151 void processObjectSection(SectionNode *sectionNode, std::unique_ptr<Program> &program);
152 void processModuleFile(const std::string &src, std::unique_ptr<Program> &program);
153 void processObjectFile(const std::string &src, std::unique_ptr<Program> &program);
154 void setVariableValue(Variable &var, VarType type, const std::string &value, size_t buf_size = 0);
156 void resolveLabelReference(Operand &operand, const std::unordered_map<std::string, size_t> &labelMap);
157 void collectObjectNames(std::vector<std::pair<std::string, std::string>> &names, const std::unique_ptr<Program> &program);
158 void printObjectHTML(std::ostream &out, const std::unique_ptr<Program> &objPtr);
159 };
160
163 std::string name;
164 std::string mod;
165 bool module;
168 return (name == f.name && mod == f.mod);
169 }
170
172 bool ret_owned = false;
173 };
174
182 public:
189 ModuleParser(const Mode &m, const std::string &mod_name, const std::string &source);
190
193 : functions(other.functions),
194 mod_name(other.mod_name),
195 scanner(other.scanner),
196 index(other.index),
197 token(other.token ? new scan::TToken(*other.token) : nullptr) {}
198
201 if (this != &other) {
202 functions = other.functions;
203 mod_name = other.mod_name;
204 scanner = other.scanner;
205 index = other.index;
206 if (token)
207 delete token;
208 token = other.token ? new scan::TToken(*other.token) : nullptr;
209 }
210 return *this;
211 }
212
214 uint64_t scan();
216 bool parse();
220 scan::TToken at(size_t pos);
229 bool generateProgramCode(const Mode &m, const std::string &mod_id, const std::string &mod_name, std::unique_ptr<Program> &program);
231 bool next();
233 bool match(const std::string &s);
235 bool match(const types::TokenType &t);
237 void require(const std::string &s);
239 void require(const types::TokenType &t);
240
241 protected:
242 std::vector<ExternalFunction> functions;
243 std::string mod_name;
245 uint64_t index = 0;
246 scan::TToken *token = nullptr;
248 };
249} // namespace mxvm
250
251#endif
AST node for a source-level comment.
Definition ast.hpp:156
AST node representing a single MXVM instruction with its operands.
Definition ast.hpp:113
AST node for a label (or function entry point) in the code section.
Definition ast.hpp:132
AST node for a module import declaration.
Definition ast.hpp:95
bool parse()
Parse the module declarations.
Definition parser.cpp:107
Mode parser_mode
interpret or compile
Definition parser.hpp:247
scan::TToken * token
current token pointer
Definition parser.hpp:246
uint64_t index
current token index
Definition parser.hpp:245
void require(const std::string &s)
Require the current token value to match, or throw.
Definition parser.cpp:170
ModuleParser(const Mode &m, const std::string &mod_name, const std::string &source)
Construct a module parser.
Definition parser.cpp:100
ModuleParser(const ModuleParser &other)
Copy constructor.
Definition parser.hpp:192
bool match(const std::string &s)
Check if the current token value matches and advance.
Definition parser.cpp:162
bool next()
Advance to the next token.
Definition parser.cpp:151
std::string mod_name
module name
Definition parser.hpp:243
scan::Scanner scanner
underlying scanner
Definition parser.hpp:244
scan::TToken operator[](size_t pos)
Access a token by position.
Definition parser.cpp:129
uint64_t scan()
Tokenize the module source.
Definition parser.cpp:102
bool generateProgramCode(const Mode &m, const std::string &mod_id, const std::string &mod_name, std::unique_ptr< Program > &program)
Register the module's external functions in a Program.
Definition parser.cpp:141
std::vector< ExternalFunction > functions
parsed external function declarations
Definition parser.hpp:242
scan::TToken at(size_t pos)
Access a token by position (bounds-checked).
Definition parser.cpp:133
ModuleParser & operator=(const ModuleParser &other)
Copy assignment.
Definition parser.hpp:200
AST node for an object import declaration.
Definition ast.hpp:104
std::string object_path
search path for .mxvm object files
Definition parser.hpp:133
std::unique_ptr< ModuleNode > parseModule(uint64_t &index)
Definition parser.cpp:449
Parser & operator=(const Parser &other)
Copy assignment.
Definition parser.hpp:80
scan::Scanner scanner
Definition parser.hpp:129
Parser(const std::string &source)
Construct a parser from MXVM source text.
Definition parser.cpp:181
std::unique_ptr< ObjectNode > parseObject(uint64_t &index)
Definition parser.cpp:245
bool generateDebugHTML(std::ostream &out, std::unique_ptr< Program > &program)
Generate debug HTML output for the program.
Definition parser.cpp:987
void generateObjectAssemblyFile(std::unique_ptr< Program > &objProgram)
Generate a native assembly file for an object.
Definition parser.cpp:1394
std::unique_ptr< CommentNode > parseComment(uint64_t &index)
Definition parser.cpp:688
auto operator[](size_t pos)
Access a token by position.
Definition parser.cpp:193
void collectObjectNames(std::vector< std::pair< std::string, std::string > > &names, const std::unique_ptr< Program > &program)
Definition parser.cpp:842
std::string source_file
Definition parser.hpp:128
std::unique_ptr< ProgramNode > parseProgramOrObject(uint64_t &index)
Parse a top-level program or object node.
Definition parser.cpp:1353
void registerObjectExterns(std::unique_ptr< Program > &mainProgram, const std::unique_ptr< Program > &objProgram)
Register external functions from an object into the main program.
Definition parser.cpp:1415
void processObjectFile(const std::string &src, std::unique_ptr< Program > &program)
Definition parser.cpp:267
void processModuleFile(const std::string &src, std::unique_ptr< Program > &program)
Definition parser.cpp:1170
void resolveLabelReference(Operand &operand, const std::unordered_map< std::string, size_t > &labelMap)
Definition parser.cpp:1344
void setDefaultVariableValue(Variable &var, VarType type)
Definition parser.cpp:1311
std::unique_ptr< LabelNode > parseLabel(uint64_t &index)
Definition parser.cpp:709
void processDataSection(SectionNode *sectionNode, std::unique_ptr< Program > &program)
Definition parser.cpp:1140
std::unique_ptr< SectionNode > parseSection(uint64_t &index)
Definition parser.cpp:347
Parser(const Parser &other)
Copy constructor.
Definition parser.hpp:67
uint64_t scan()
Tokenize the source and return the token count.
Definition parser.cpp:184
std::string include_path
system module include path
Definition parser.hpp:134
void parse()
Parse all tokens into the internal AST.
Definition parser.cpp:730
void processModuleSection(SectionNode *sectionNode, std::unique_ptr< Program > &program)
Definition parser.cpp:1160
std::string object_name
Definition parser.hpp:136
Platform platform
Definition parser.hpp:137
void printObjectHTML(std::ostream &out, const std::unique_ptr< Program > &objPtr)
Definition parser.cpp:854
void setVariableValue(Variable &var, VarType type, const std::string &value, size_t buf_size=0)
Definition parser.cpp:1269
std::string module_path
search path for .mxvm module files
Definition parser.hpp:132
std::unique_ptr< ProgramNode > parseAST()
Build the full AST from tokens.
Definition parser.cpp:201
Validator validator
Definition parser.hpp:130
bool generateProgramCode(const Mode &m, std::unique_ptr< Program > &program)
Walk the AST and populate a Program with instructions and variables.
Definition parser.cpp:737
Mode parser_mode
Definition parser.hpp:131
friend class ModuleParser
Definition parser.hpp:60
void processObjectSection(SectionNode *sectionNode, std::unique_ptr< Program > &program)
Definition parser.cpp:257
std::unique_ptr< VariableNode > parseDataVariable(uint64_t &index)
Definition parser.cpp:461
void processCodeSection(SectionNode *sectionNode, std::unique_ptr< Program > &program)
Definition parser.cpp:1228
bool object_mode
true when parsing an object definition
Definition parser.hpp:135
std::unique_ptr< InstructionNode > parseCodeInstruction(uint64_t &index)
Definition parser.cpp:579
Root AST node representing an entire program or object.
Definition ast.hpp:50
Complete MXVM program: instruction interpreter and native x64 code generator.
Definition icode.hpp:212
Represents a program section (.data, .code, .module, .object).
Definition ast.hpp:27
Validates MXVM source for correct variable/label usage and instruction operands.
Definition valid.hpp:69
AST node for a variable declaration in a .data section.
Definition ast.hpp:71
Lexical scanner that tokenizes source text.
Definition scanner.hpp:28
int64_t pos(const char *substr, const char *s)
Definition cstring.c:51
Instruction set enum, operand/instruction structs, variable types, and Variable/Variable_Value defini...
Definition ast.hpp:14
bool instruct_mode
enable instruction trace mode
Definition parser.cpp:97
Platform
Target platform for native code generation.
Definition parser.hpp:42
bool debug_mode
enable verbose debug output during parsing
Definition parser.cpp:96
VarType
MXVM variable type discriminator.
Definition instruct.hpp:180
bool html_mode
enable HTML debug output
Definition parser.cpp:98
Mode
Execution mode: interpretation or native compilation.
Definition parser.hpp:36
@ MODE_INTERPRET
Definition parser.hpp:37
@ MODE_COMPILE
Definition parser.hpp:38
token::Token< char > TToken
Default token type.
Definition scanner.hpp:19
TokenType
Classification of scanned tokens.
Definition types.hpp:16
Lexical scanner that tokenizes source text into typed tokens.
Describes an external function imported from a module or object.
Definition parser.hpp:162
bool operator==(const ExternalFunction &f)
Equality comparison by name and module.
Definition parser.hpp:167
bool ret_owned
true if the return value is an owned pointer
Definition parser.hpp:172
VarType ret_type
return type of the external function
Definition parser.hpp:171
std::string name
function symbol name
Definition parser.hpp:163
std::string mod
module or object name
Definition parser.hpp:164
bool module
true if from a module, false if from an object
Definition parser.hpp:165
A single instruction operand (constant value or variable reference).
Definition instruct.hpp:159
A named variable with type, value, and optional object association.
Definition instruct.hpp:292
Validator for MXVM programs — checks variable/label usage and instruction operand specifications.