loom

Форк
0
/
diff.fuze 
106 строк · 3.5 Кб
1
/*  Описание грамматики ПОЯ системы дифференциальных уравнений
2
*/
3
lex {
4
    lex.addMarkup("/*", "*/", "", lex.LexemeType.Comment);
5
    lex.addMarkup("//", "", "", lex.LexemeType.Comment);
6
}
7

8
on_Start {
9
    ast.setMode(ast.Mode.Diff);
10
    ast.addNode(ast.op.Statement_Using, "math");
11
}
12

13
//include "useastype";
14
include "expression";
15

16
main список_уравнений;
17

18
список_уравнений
19
    = оператор_use
20
    = оператор_using
21
    = уравнение
22
    = список_уравнений уравнение
23
    ;
24

25
оператор_use
26
    = use_as_type_выражение ";"
27
    ;
28

29
оператор_using
30
    = "using" ID ";" {
31
                    ast.addNode(ast.op.Statement_Using, 1);
32
                }
33
    ;
34

35
уравнение
36
    = простое_уравнение ";"
37
    = дифференциальное_уравнение ";"
38
    ;
39

40
простое_уравнение
41
    = левая_часть_простого_уравнения выражение {
42
                    ast.goParent();
43
                    ast.goParent();
44
                    ast.setStream(ast.Stream.Default);
45
                }
46
    ;
47

48
левая_часть_простого_уравнения
49
    = ID символ_равно {
50
                    ast.addNode(ast.op.Push_Id, 0);
51
                    ast.addNode_StepInto(ast.op.Statement_Assign, 1);
52
                }
53
    ;
54

55
символ_равно
56
    = "=" {
57
                    ast.setStream(ast.Stream.Equation);
58
                    ast.addNode_StepInto(ast.op.Statement_Assign, 0);
59
                }
60
    ;
61

62
дифференциальное_уравнение
63
    = левая_часть_дифференциального_уравнения выражение {
64
                    ast.goParent();
65
                    ast.goParent();
66
                    ast.setStream(ast.Stream.Default);
67
                }
68
    ;
69

70
левая_часть_дифференциального_уравнения
71
    = ID символ_производной "=" {
72
                    ast.setPrefix("__dt_");
73
                    ast.addNode(ast.op.Push_Id, 0);
74
                    ast.setPrefix("");
75
                    ast.addNode_StepInto(ast.op.Statement_Assign, 2);
76
                }
77
    ;
78

79
символ_производной
80
    = "'" {
81
                    ast.setStream(ast.Stream.Diff);
82
                    ast.addNode_StepInto(ast.op.Statement_Assign, 0);
83
                }
84
    ;
85

86

87
use_as_type_выражение
88
    = use_as_type_часть_с_типом
89
                                { ast.goParent(); }
90

91
// приводит к ошибке при определённой последовательности расположении операторов use as type
92
    = use_as_type_часть_с_типом ID
93
                                { ast.addNode(ast.op.Statement_Id, 1); ast.goParent(); }
94
    ;
95
    use_as_type_часть_с_типом
96
        = начало_оператора_use имя_модуля "as" "type" ID
97
                                { ast.addNode(ast.op.Statement_Type, 4); }
98
        ;
99
        начало_оператора_use
100
            = "use"             { ast.addNode_StepInto(ast.op.Statement_UseAsType, 0); }
101
            ;
102
        имя_модуля
103
            = ANNOTATION        { ast.addNode(ast.op.None, 0); }
104
            = ANNOTATION "(" ANNOTATION ")"
105
                                { ast.addNode_StepInto(ast.op.None, 0); ast.addNode(ast.op.None, 2); ast.goParent(); }
106
            ;
107

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

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

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

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