mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
[Tolk] Rewrite lexer, spaces are not mandatory anymore
A new lexer is noticeably faster and memory efficient (although splitting a file to tokens is negligible in a whole pipeline). But the purpose of rewriting lexer was not just to speed up, but to allow writing code without spaces: `2+2` is now 4, not a valid identifier as earlier. The variety of symbols allowed in identifier has greatly reduced and is now similar to other languages. SrcLocation became 8 bytes on stack everywhere. Command-line flags were also reworked: - the input for Tolk compiler is only a single file now, it's parsed, and parsing continues while new #include are resolved - flags like -A -P and so on are no more needed, actually
This commit is contained in:
parent
0bcc0b3c12
commit
f0e6470d0b
26 changed files with 2042 additions and 2129 deletions
|
@ -211,20 +211,39 @@ td::Result<fift::SourceLookup> create_mem_source_lookup(std::string main, std::s
|
|||
fift_dir);
|
||||
}
|
||||
|
||||
td::Result<td::Ref<vm::Cell>> compile_asm(td::Slice asm_code, std::string fift_dir, bool is_raw) {
|
||||
td::Result<td::Ref<vm::Cell>> compile_asm(td::Slice asm_code) {
|
||||
std::stringstream ss;
|
||||
std::string sb;
|
||||
sb.reserve(asm_code.size() + 100);
|
||||
sb.append("\"Asm.fif\" include\n ");
|
||||
sb.append(is_raw ? "<{" : "");
|
||||
sb.append("\"Asm.fif\" include\n <{\n");
|
||||
sb.append(asm_code.data(), asm_code.size());
|
||||
sb.append(is_raw ? "}>c" : "");
|
||||
sb.append(" boc>B \"res\" B>file");
|
||||
sb.append("\n}>c boc>B \"res\" B>file");
|
||||
|
||||
TRY_RESULT(source_lookup, create_source_lookup(std::move(sb), true, true, true, false, false, false, false, fift_dir));
|
||||
TRY_RESULT(source_lookup, create_source_lookup(std::move(sb), true, true, true, false, false, false, false));
|
||||
TRY_RESULT(res, run_fift(std::move(source_lookup), &ss));
|
||||
TRY_RESULT(boc, res.read_file("res"));
|
||||
return vm::std_boc_deserialize(std::move(boc.data));
|
||||
}
|
||||
|
||||
td::Result<CompiledProgramOutput> compile_asm_program(std::string&& program_code, const std::string& fift_dir) {
|
||||
std::string main_fif;
|
||||
main_fif.reserve(program_code.size() + 100);
|
||||
main_fif.append(program_code.data(), program_code.size());
|
||||
main_fif.append(R"( dup hashB B>X $>B "hex" B>file)"); // write codeHashHex to a file
|
||||
main_fif.append(R"( boc>B B>base64 $>B "boc" B>file)"); // write codeBoc64 to a file
|
||||
|
||||
std::stringstream fift_output_stream;
|
||||
TRY_RESULT(source_lookup, create_source_lookup(std::move(main_fif), true, true, false, false, false, false, false, fift_dir));
|
||||
TRY_RESULT(res, run_fift(std::move(source_lookup), &fift_output_stream));
|
||||
|
||||
TRY_RESULT(boc, res.read_file("boc"));
|
||||
TRY_RESULT(hex, res.read_file("hex"));
|
||||
|
||||
return CompiledProgramOutput{
|
||||
std::move(program_code),
|
||||
std::move(boc.data),
|
||||
std::move(hex.data),
|
||||
};
|
||||
}
|
||||
|
||||
} // namespace fift
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue