SandboXP

Форк
0
/
rust_ast.js 
83 строки · 2.2 Кб
1
"use strict";
2

3
const assert = require("assert").strict;
4

5
function indent(lines, how_much)
6
{
7
    return lines.map(line => " ".repeat(how_much) + line);
8
}
9

10
function print_syntax_tree(statements)
11
{
12
    let code = [];
13

14
    for(let statement of statements)
15
    {
16
        if(typeof statement === "string")
17
        {
18
            code.push(statement);
19
        }
20
        else if(statement.type === "switch")
21
        {
22
            assert(statement.condition);
23

24
            const cases = [];
25

26
            for(let case_ of statement.cases)
27
            {
28
                assert(case_.conditions.length >= 1);
29

30
                cases.push(case_.conditions.join(" | ") + " => {");
31
                cases.push.apply(cases, indent(print_syntax_tree(case_.body), 4));
32
                cases.push(`},`);
33
            }
34

35
            if(statement.default_case)
36
            {
37
                cases.push(`_ => {`);
38
                cases.push.apply(cases, indent(print_syntax_tree(statement.default_case.body), 4));
39
                cases.push(`}`);
40
            }
41

42
            code.push(`match ${statement.condition} {`);
43
            code.push.apply(code, indent(cases, 4));
44
            code.push(`}`);
45
        }
46
        else if(statement.type === "if-else")
47
        {
48
            assert(statement.if_blocks.length >= 1);
49

50
            let first_if_block = statement.if_blocks[0];
51

52
            code.push(`if ${first_if_block.condition} {`);
53
            code.push.apply(code, indent(print_syntax_tree(first_if_block.body), 4));
54
            code.push(`}`);
55

56
            for(let i = 1; i < statement.if_blocks.length; i++)
57
            {
58
                let if_block = statement.if_blocks[i];
59

60
                code.push(`else if ${if_block.condition} {`);
61
                code.push.apply(code, indent(print_syntax_tree(if_block.body), 4));
62
                code.push(`}`);
63
            }
64

65
            if(statement.else_block)
66
            {
67
                code.push(`else {`);
68
                code.push.apply(code, indent(print_syntax_tree(statement.else_block.body), 4));
69
                code.push(`}`);
70
            }
71
        }
72
        else
73
        {
74
            assert(false, "Unexpected type: " + statement.type, "In:", statement);
75
        }
76
    }
77

78
    return code;
79
}
80

81
module.exports = {
82
    print_syntax_tree,
83
};
84

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.