Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Lexer.h"
- #include "Parser.h"
- #include "Attributes.h"
- namespace Calculator {
- ATTRIBUTES(E) {
- ATTRIBUTE_AND_GETTER(int, val)
- };
- ATTRIBUTES(EPrime) {
- ATTRIBUTE_AND_GETTER(int, val)
- ATTRIBUTE_AND_GETTER(int, acc)
- };
- ATTRIBUTES(T) {
- ATTRIBUTE_AND_GETTER(int, val)
- };
- ATTRIBUTES(TPrime) {
- ATTRIBUTE_AND_GETTER(int, val)
- ATTRIBUTE_AND_GETTER(int, acc)
- };
- ATTRIBUTES(F) {
- ATTRIBUTE_AND_GETTER(int, val)
- };
- START(E)
- TRANSLATING(ADD) {
- ATTRIBUTE(int, x)
- ATTRIBUTE(int, y)
- ATTRIBUTE(int, res)
- CODE {
- LOCAL_ATTR(x)
- LOCAL_ATTR(y)
- LOCAL_ATTR(res)
- // user code begin
- res = x + y;
- // user code end
- }
- };
- TRANSLATING(SUB) {
- ATTRIBUTE(int, x)
- ATTRIBUTE(int, y)
- ATTRIBUTE(int, res)
- CODE {
- LOCAL_ATTR(x)
- LOCAL_ATTR(y)
- LOCAL_ATTR(res)
- // user code begin
- res = x - y;
- // user code end
- }
- };
- TRANSLATING(MUL) {
- ATTRIBUTE(int, x)
- ATTRIBUTE(int, y)
- ATTRIBUTE(int, res)
- CODE {
- LOCAL_ATTR(x)
- LOCAL_ATTR(y)
- LOCAL_ATTR(res)
- // user code begin
- res = x * y;
- // user code end
- }
- };
- TRANSLATING(DIV) {
- ATTRIBUTE(int, x)
- ATTRIBUTE(int, y)
- ATTRIBUTE(int, res)
- CODE {
- LOCAL_ATTR(x)
- LOCAL_ATTR(y)
- LOCAL_ATTR(res)
- // user code begin
- res = x / y;
- // user code end
- }
- };
- TRANSLATING(MEDIAN) {
- ATTRIBUTE(int, x)
- ATTRIBUTE(int, y)
- ATTRIBUTE(int, z)
- ATTRIBUTE(int, res)
- CODE {
- LOCAL_ATTR(x)
- LOCAL_ATTR(y)
- LOCAL_ATTR(z)
- LOCAL_ATTR(res)
- // user code begin
- if (y <= x && x <= z) {res = x;} else if (x <= y && y <= z) {res = y;} else {res = z;}
- // user code end
- }
- };
- TRANSLATING(TOINT) {
- ATTRIBUTE(std::string, x)
- ATTRIBUTE(int, res)
- CODE {
- LOCAL_ATTR(x)
- LOCAL_ATTR(res)
- // user code begin
- res = std::stoi(x);
- // user code end
- }
- };
- GET_PARSER_INFO {
- return
- {{
- { 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, },
- { 0, 0, 4, 2, 3, 0, 0, 0, 4, 4, 4, },
- { 5, 5, 0, 0, 0, 0, 0, 5, 0, 0, 0, },
- { 0, 0, 8, 8, 8, 6, 7, 0, 8, 8, 8, },
- { 9, 10, 0, 0, 0, 0, 0, 11, 0, 0, 0, },
- }
- ,
- {
- { },
- { 14, 13, },
- { 3, 14, 17, 13, },
- { 4, 14, 18, 13, },
- { 11, },
- { 16, 15, },
- { 5, 16, 19, 15, },
- { 6, 16, 20, 15, },
- { 11, },
- { 0, 22, },
- { 1, 12, 2, },
- { 7, 12, 9, 12, 9, 12, 8, 21, },
- }
- ,
- {
- ASSIGNER {},
- ASSIGNER {
- NT0(E, 3)
- NT(T, 1)
- NT(EPrime, 2)
- CONNECT(0, val, 2, val)
- CONNECT(2, acc, 1, val)
- },
- ASSIGNER {
- NT0(EPrime, 5)
- T(1)
- NT(T, 2)
- NT(ADD, 3)
- NT(EPrime, 4)
- CONNECT(0, val, 4, val)
- CONNECT(4, acc, 3, res)
- CONNECT(3, y, 2, val)
- CONNECT(3, x, 0, acc)
- },
- ASSIGNER {
- NT0(EPrime, 5)
- T(1)
- NT(T, 2)
- NT(SUB, 3)
- NT(EPrime, 4)
- CONNECT(0, val, 4, val)
- CONNECT(4, acc, 3, res)
- CONNECT(3, y, 2, val)
- CONNECT(3, x, 0, acc)
- },
- ASSIGNER {
- NT0(EPrime, 2)
- T(1)
- CONNECT(0, val, 0, acc)
- },
- ASSIGNER {
- NT0(T, 3)
- NT(F, 1)
- NT(TPrime, 2)
- CONNECT(0, val, 2, val)
- CONNECT(2, acc, 1, val)
- },
- ASSIGNER {
- NT0(TPrime, 5)
- T(1)
- NT(F, 2)
- NT(MUL, 3)
- NT(TPrime, 4)
- CONNECT(0, val, 4, val)
- CONNECT(4, acc, 3, res)
- CONNECT(3, y, 2, val)
- CONNECT(3, x, 0, acc)
- },
- ASSIGNER {
- NT0(TPrime, 5)
- T(1)
- NT(F, 2)
- NT(DIV, 3)
- NT(TPrime, 4)
- CONNECT(0, val, 4, val)
- CONNECT(4, acc, 3, res)
- CONNECT(3, y, 2, val)
- CONNECT(3, x, 0, acc)
- },
- ASSIGNER {
- NT0(TPrime, 2)
- T(1)
- CONNECT(0, val, 0, acc)
- },
- ASSIGNER {
- NT0(F, 3)
- T(1)
- NT(TOINT, 2)
- CONNECT(0, val, 2, res)
- CONNECT(2, x, 1, value)
- },
- ASSIGNER {
- NT0(F, 4)
- T(1)
- NT(E, 2)
- T(3)
- CONNECT(0, val, 2, val)
- },
- ASSIGNER {
- NT0(F, 9)
- T(1)
- NT(E, 2)
- T(3)
- NT(E, 4)
- T(5)
- NT(E, 6)
- T(7)
- NT(MEDIAN, 8)
- CONNECT(0, val, 8, res)
- CONNECT(8, x, 2, val)
- CONNECT(8, y, 4, val)
- CONNECT(8, z, 6, val)
- },
- },
- ATTRIBUTE_FABRIC {
- switch (id) {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- case 10:
- case 11:
- RET_T
- case 12: RET_NT(E)
- case 13: RET_NT(EPrime)
- case 14: RET_NT(T)
- case 15: RET_NT(TPrime)
- case 16: RET_NT(F)
- case 17: RET_NT(ADD)
- case 18: RET_NT(SUB)
- case 19: RET_NT(MUL)
- case 20: RET_NT(DIV)
- case 21: RET_NT(MEDIAN)
- case 22: RET_NT(TOINT)
- default: IMPOSSIBLE}
- }
- };
- }
- GET_LEXER_INFO {
- return
- {{
- "[0-9]+",
- "\\(",
- "\\)",
- "\\+",
- "\\-",
- "\\*",
- "/",
- "\\{",
- "\\}",
- ",",
- }};
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement