Gyoji Compiler
Loading...
Searching...
No Matches
tree.hpp
1#ifndef _GYOJI_INTERNAL
2#error "This header is intended to be used internally as a part of the Gyoji front-end. Please include frontend.hpp instead."
3#endif
4#pragma once
5
6
18namespace Gyoji::frontend::tree {
20
31 public:
56
61 TerminalNonSyntax(Type _type, const Gyoji::context::Token & _token);
66
71 const Type &get_type() const;
76 const std::string & get_data() const;
77
78 private:
79 Type type;
80 const Gyoji::context::Token & token;
81 };
82
84
90 public:
127
132 Terminal(const Gyoji::context::Token & _token);
136 ~Terminal();
137
142 const Gyoji::context::TokenID & get_type() const;
147 const std::string & get_value() const;
148
154
162
166 std::string get_name() const;
167
168 const IdentifierType & get_identifier_type() const;
169 void set_identifier_type(IdentifierType _identifier_type);
170
171 // The terminal "owns" uniquely all of the non-syntax data
172 // in this vector. It may be returned to access it,
173 // but these are owned pointers, so they must only
174 // be de-referenced and never assigned to
176
177 void set_ns2_entity(Gyoji::frontend::namespaces::NS2Entity *_ns_entity);
178 Gyoji::frontend::namespaces::NS2Entity *get_ns2_entity() const;
179
180
181 private:
182 const Gyoji::context::Token & token;
183 std::string fully_qualified_name;
184 IdentifierType identifier_type;
185 // Tells us whether this is a namespace name, an entity, or what.
187 };
188
189
204 public:
205 typedef std::variant<
214 Gyoji::owned<FileStatementUsing>> FileStatementType;
215
216 FileStatement(FileStatementType _statement, const Gyoji::frontend::ast::SyntaxNode & _sn);
218
233 const FileStatementType & get_statement() const;
234
235 private:
236 FileStatementType statement;
237 };
238
240
298
300
308 public:
343 const AccessModifierType & get_type() const;
344 private:
346 Gyoji::owned<Terminal> modifier;
347 };
348
350
363 public:
383 bool is_unsafe() const;
384 private:
385 Gyoji::owned<Terminal> unsafe_token;
386 };
387
389
418 public:
424
430 TypeName(Gyoji::owned<Terminal> _typeof_token,
431 Gyoji::owned<Terminal> _paren_l_token,
432 Gyoji::owned<Expression> _expression,
433 Gyoji::owned<Terminal> _paren_r_token
434 );
438 ~TypeName();
459 bool is_expression() const;
465 std::string get_name() const;
466 const Gyoji::context::SourceReference & get_name_source_ref() const;
472 const Expression & get_expression() const;
473 private:
474 bool m_is_expression;
475 // For raw names
476 Gyoji::owned<Terminal> type_name;
477 // for typeof expressions
478 Gyoji::owned<Terminal> typeof_token;
479 Gyoji::owned<Terminal> paren_l_token;
480 Gyoji::owned<Expression> expression;
481 Gyoji::owned<Terminal> paren_r_token;
482 };
483
485
524
526
532 public:
537 Gyoji::owned<AccessQualifier> _access_qualifier,
538 Gyoji::owned<TypeName> _type_name
539 );
551 const TypeName & get_type_name() const;
552 private:
553 Gyoji::owned<AccessQualifier> access_qualifier;
554 Gyoji::owned<TypeName> type_name;
555 };
556
558
582 public:
584 Gyoji::owned<TypeSpecifier> _type_specifier,
585 Gyoji::owned<Terminal> _paren_l_token,
586 Gyoji::owned<TypeSpecifierCallArgs> _type_specifier_call_args,
587 Gyoji::owned<Terminal> _paren_r_token
588 );
596 const TypeSpecifier & get_type() const;
601 const TypeSpecifierCallArgs & get_args() const;
602
603 private:
604 Gyoji::owned<TypeSpecifier> type_specifier;
605 Gyoji::owned<Terminal> paren_l_token;
606 Gyoji::owned<TypeSpecifierCallArgs> type_specifier_call_args;
607 Gyoji::owned<Terminal> paren_r_token;
608 };
609
611
618 public:
632 Gyoji::owned<TypeSpecifier> _type_specifier,
633 Gyoji::owned<Terminal> _paren_l1_token,
634 Gyoji::owned<Terminal> _star_token,
635 Gyoji::owned<Terminal> _identifier_token,
636 Gyoji::owned<Terminal> _paren_r1_token,
637 Gyoji::owned<Terminal> _paren_l2_token,
638 Gyoji::owned<FunctionDefinitionArgList> _function_definition_arg_list,
639 Gyoji::owned<Terminal> _paren_r2_token
640 );
648 const TypeSpecifier & get_return_type() const;
652 const std::string & get_name() const;
653 const Gyoji::context::SourceReference & get_name_source_ref() const;
657 const FunctionDefinitionArgList & get_args() const;
658 private:
659 Gyoji::owned<TypeSpecifier> type_specifier;
660 Gyoji::owned<Terminal> paren_l1_token;
661 Gyoji::owned<Terminal> star_token;
662 Gyoji::owned<Terminal> identifier_token;
663 Gyoji::owned<Terminal> paren_r1_token;
664 Gyoji::owned<Terminal> paren_l2_token;
665 Gyoji::owned<FunctionDefinitionArgList> function_definition_arg_list;
666 Gyoji::owned<Terminal> paren_r2_token;
667 };
668
695 public:
701 Gyoji::owned<TypeSpecifier> _type_specifier,
702 Gyoji::owned<Terminal> _star_token,
703 Gyoji::owned<AccessQualifier> _access_qualifier
704 );
709
713 const TypeSpecifier & get_type_specifier() const;
719 private:
720 Gyoji::owned<TypeSpecifier> type_specifier;
721 Gyoji::owned<Terminal> star_token;
722 Gyoji::owned<AccessQualifier> access_qualifier;
723 };
724
725 class TypeSpecifierArray : public Gyoji::frontend::ast::SyntaxNode {
726 public:
731 TypeSpecifierArray(
732 Gyoji::owned<TypeSpecifier> _type_specifier,
733 Gyoji::owned<Terminal> _bracket_l_token,
734 Gyoji::owned<Terminal> _literal_int_token,
735 Gyoji::owned<Terminal> _bracket_r_token
736 );
740 ~TypeSpecifierArray();
741
745 const TypeSpecifier & get_type_specifier() const;
746
751 const Terminal & get_literal_int_token() const;
752 private:
753 Gyoji::owned<TypeSpecifier> type_specifier;
754 Gyoji::owned<Terminal> bracket_l_token;
755 Gyoji::owned<Terminal> literal_int_token;
756 Gyoji::owned<Terminal> bracket_r_token;
757 };
758
786 public:
792 Gyoji::owned<TypeSpecifier> _type_specifier,
793 Gyoji::owned<Terminal> _andpersand_token,
794 Gyoji::owned<AccessQualifier> _access_qualifier
795 );
803 const TypeSpecifier & get_type_specifier() const;
810 private:
811 Gyoji::owned<TypeSpecifier> type_specifier;
812 Gyoji::owned<Terminal> andpersand_token;
813 Gyoji::owned<AccessQualifier> access_qualifier;
814 };
815
817
849 public:
850 typedef std::variant<
857 > TypeSpecifierType;
858 TypeSpecifier(TypeSpecifier::TypeSpecifierType _type, const Gyoji::frontend::ast::SyntaxNode & _sn);
866 const TypeSpecifier::TypeSpecifierType & get_type() const;
867 private:
868 TypeSpecifier::TypeSpecifierType type;
869 };
870
872
880 public:
882 Gyoji::owned<Terminal> _identifier_token
883 );
891 const TypeSpecifier & get_type_specifier() const;
895 const Terminal & get_identifier() const;
896 private:
897 Gyoji::owned<TypeSpecifier> type_specifier;
898 Gyoji::owned<Terminal> identifier_token;
899 };
900
902
932
934
943 public:
946 Gyoji::owned<Terminal> _paren_l,
948 Gyoji::owned<Terminal> _paren_r,
949 Gyoji::owned<Terminal> _semicolon
950 );
958 const AccessModifier & get_access_modifier() const;
963 const UnsafeModifier & get_unsafe_modifier() const;
967 const TypeSpecifier & get_return_type() const;
971 const Terminal & get_name() const;
977
978 private:
980 Gyoji::owned<Terminal> paren_l; // argument list delimiter PAREN_L
982 Gyoji::owned<Terminal> paren_r; // argument list delimiter PAREN_R
983 Gyoji::owned<Terminal> semicolon; // argument list delimiter SEMICOLON
984 };
985
986 class InitializerExpression : public Gyoji::frontend::ast::SyntaxNode {
987 public:
988 InitializerExpression(
989 const Gyoji::context::SourceReference & _src_ref
990 );
991 InitializerExpression(
992 Gyoji::owned<Terminal> _equals_token,
993 Gyoji::owned<Expression> _expression
994 );
995 ~InitializerExpression();
996 bool has_expression() const;
997 const Expression & get_expression() const;
998 private:
999 Gyoji::owned<Terminal> equals_token;
1000 Gyoji::owned<Expression> expression;
1001 };
1002
1004
1019 public:
1025 Gyoji::owned<TypeSpecifier> _type_specifier,
1026 Gyoji::owned<Terminal> _identifier_token,
1028 Gyoji::owned<Terminal> _semicolon_token
1029 );
1037 const TypeSpecifier & get_type_specifier() const;
1041 const Terminal & get_identifier() const;
1046 const InitializerExpression & get_initializer_expression() const;
1047 private:
1048 Gyoji::owned<TypeSpecifier> type_specifier;
1049 Gyoji::owned<Terminal> identifier_token;
1050 Gyoji::owned<ArrayLength> array_length;
1052 Gyoji::owned<Terminal> semicolon_token;
1053 };
1054
1056
1078 public:
1084 Gyoji::owned<UnsafeModifier> _unsafe_modifier,
1085 Gyoji::owned<ScopeBody> _scope_body
1086 );
1095 const UnsafeModifier & get_unsafe_modifier() const;
1100 const ScopeBody & get_scope_body() const;
1101 private:
1102 Gyoji::owned<UnsafeModifier> unsafe_modifier;
1103 Gyoji::owned<ScopeBody> scope_body;
1104 };
1105
1107
1122 public:
1124 Gyoji::owned<Expression> _expression,
1125 Gyoji::owned<Terminal> _semicolon_token
1126 );
1131 const Expression & get_expression() const;
1132 private:
1133 Gyoji::owned<Expression> expression;
1134 Gyoji::owned<Terminal> semicolon_token;
1135 };
1136
1138
1193 public:
1199 Gyoji::owned<Terminal> _if_token,
1200 Gyoji::owned<Terminal> _paren_l_token,
1201 Gyoji::owned<Expression> _expression,
1202 Gyoji::owned<Terminal> _paren_r_token,
1203 Gyoji::owned<ScopeBody> _if_scope_body
1204 );
1211 Gyoji::owned<Terminal> _if_token,
1212 Gyoji::owned<Terminal> _paren_l_token,
1213 Gyoji::owned<Expression> _expression,
1214 Gyoji::owned<Terminal> _paren_r_token,
1215 Gyoji::owned<ScopeBody> _if_scope_body,
1216 Gyoji::owned<Terminal> _else_token,
1217 Gyoji::owned<ScopeBody> _else_scope_body
1218 );
1225 Gyoji::owned<Terminal> _if_token,
1226 Gyoji::owned<Terminal> _paren_l_token,
1227 Gyoji::owned<Expression> _expression,
1228 Gyoji::owned<Terminal> _paren_r_token,
1229 Gyoji::owned<ScopeBody> _if_scope_body,
1230 Gyoji::owned<Terminal> _else_token,
1231 Gyoji::owned<StatementIfElse> _statement_if_else
1232 );
1243 const Expression & get_expression() const;
1244
1249 const ScopeBody & get_if_scope_body() const;
1250
1257 const StatementIfElse & get_else_if() const;
1263 const ScopeBody & get_else_scope_body() const;
1264 bool has_else() const;
1265 bool has_else_if() const;
1266 private:
1267 bool m_has_else;
1268 bool m_has_else_if;
1269 Gyoji::owned<Terminal> if_token;
1270 Gyoji::owned<Terminal> paren_l_token;
1271 Gyoji::owned<Expression> expression;
1272 Gyoji::owned<Terminal> paren_r_token;
1273 Gyoji::owned<ScopeBody> if_scope_body;
1274 Gyoji::owned<Terminal> else_token;
1275 Gyoji::owned<ScopeBody> else_scope_body;
1277 };
1278
1280
1296 public:
1298 Gyoji::owned<Terminal> _while_token,
1299 Gyoji::owned<Terminal> _paren_l_token,
1300 Gyoji::owned<Expression> _expression,
1301 Gyoji::owned<Terminal> _paren_r_token,
1302 Gyoji::owned<ScopeBody> _scope_body
1303 );
1314 const Expression & get_expression() const;
1315 const ScopeBody & get_scope_body() const;
1316 private:
1317 Gyoji::owned<Terminal> while_token;
1318 Gyoji::owned<Terminal> paren_l_token;
1319 Gyoji::owned<Expression> expression;
1320 Gyoji::owned<Terminal> paren_r_token;
1321 Gyoji::owned<ScopeBody> scope_body;
1322 };
1323
1324 class StatementFor : public Gyoji::frontend::ast::SyntaxNode {
1325 public:
1326 StatementFor(
1327 Gyoji::owned<Terminal> _for_token,
1328 Gyoji::owned<Terminal> _paren_l_token,
1329 Gyoji::owned<Expression> _expression_initial,
1330 Gyoji::owned<Terminal> _semicolon_initial,
1331 Gyoji::owned<Expression> _expression_termination,
1332 Gyoji::owned<Terminal> _semicolon_termination,
1333 Gyoji::owned<Expression> _expression_increment,
1334 Gyoji::owned<Terminal> _paren_r_token,
1335 Gyoji::owned<ScopeBody> _scope_body
1336 );
1337 StatementFor(
1338 Gyoji::owned<Terminal> _for_token,
1339 Gyoji::owned<Terminal> _paren_l_token,
1340 Gyoji::owned<TypeSpecifier> _type_specifier,
1341 Gyoji::owned<Terminal> _identifier_token,
1342 Gyoji::owned<Terminal> _assignment_token,
1343 Gyoji::owned<Expression> _expression_initial,
1344 Gyoji::owned<Terminal> _semicolon_initial,
1345 Gyoji::owned<Expression> _expression_termination,
1346 Gyoji::owned<Terminal> _semicolon_termination,
1347 Gyoji::owned<Expression> _expression_increment,
1348 Gyoji::owned<Terminal> _paren_r_token,
1349 Gyoji::owned<ScopeBody> _scope_body
1350 );
1354 ~StatementFor();
1355 bool is_declaration() const;
1356
1360 const TypeSpecifier & get_type_specifier() const;
1361
1365 const Terminal & get_identifier() const;
1366
1367 const Expression & get_expression_initial() const;
1368 const Expression & get_expression_termination() const;
1369 const Expression & get_expression_increment() const;
1370 const ScopeBody & get_scope_body() const;
1371 private:
1372 bool is_declaration_initializer;
1373 Gyoji::owned<Terminal> for_token;
1374 Gyoji::owned<Terminal> paren_l_token;
1375 Gyoji::owned<TypeSpecifier> type_specifier;
1376 Gyoji::owned<Terminal> identifier_token;
1377 Gyoji::owned<Terminal> assignment_token;
1378 Gyoji::owned<Expression> expression_initial;
1379 Gyoji::owned<Terminal> semicolon_initial;
1380 Gyoji::owned<Expression> expression_termination;
1381 Gyoji::owned<Terminal> semicolon_termination;
1382 Gyoji::owned<Expression> expression_increment;
1383 Gyoji::owned<Terminal> paren_r_token;
1384 Gyoji::owned<ScopeBody> scope_body;
1385 };
1386
1387 class StatementSwitchBlock : public Gyoji::frontend::ast::SyntaxNode {
1388 public:
1389 StatementSwitchBlock(
1390 Gyoji::owned<Terminal> _default_token,
1391 Gyoji::owned<Terminal> _colon_token,
1392 Gyoji::owned<ScopeBody> _scope_body
1393 );
1394 StatementSwitchBlock(
1395 Gyoji::owned<Terminal> _case_token,
1396 Gyoji::owned<Expression> _expression,
1397 Gyoji::owned<Terminal> _colon_token,
1398 Gyoji::owned<ScopeBody> _scope_body
1399 );
1403 ~StatementSwitchBlock();
1404 bool is_default() const;
1405 const Expression & get_expression();
1406 const ScopeBody & get_scope_body();
1407 private:
1408 bool m_is_default;
1409 // For the default case
1410 Gyoji::owned<Terminal> default_token;
1411 // For the expression case
1412 Gyoji::owned<Terminal> case_token;
1413 Gyoji::owned<Expression> expression;
1414 // Common:
1415 Gyoji::owned<Terminal> colon_token;
1416 Gyoji::owned<ScopeBody> scope_body;
1417 };
1418
1419 class StatementSwitchContent : public Gyoji::frontend::ast::SyntaxNode {
1420 public:
1421 StatementSwitchContent(const Gyoji::context::SourceReference & _source_ref);
1425 ~StatementSwitchContent();
1426 const std::vector<Gyoji::owned<StatementSwitchBlock>> & get_blocks() const;
1427 void add_block(Gyoji::owned<StatementSwitchBlock> _block);
1428 private:
1430 };
1431
1432 class StatementSwitch : public Gyoji::frontend::ast::SyntaxNode {
1433 public:
1434 StatementSwitch(
1435 Gyoji::owned<Terminal> _switch_token,
1436 Gyoji::owned<Terminal> _paren_l_token,
1437 Gyoji::owned<Expression> expression,
1438 Gyoji::owned<Terminal> _paren_r_token,
1439 Gyoji::owned<Terminal> _brace_l_token,
1441 Gyoji::owned<Terminal> _brace_r_token
1442 );
1446 ~StatementSwitch();
1447 const Expression & get_expression() const;
1448 const StatementSwitchContent & get_switch_content() const;
1449 private:
1450 Gyoji::owned<Terminal> switch_token;
1451 Gyoji::owned<Terminal> paren_l_token;
1452 Gyoji::owned<Expression> expression;
1453 Gyoji::owned<Terminal> paren_r_token;
1454 Gyoji::owned<Terminal> brace_l_token;
1456 Gyoji::owned<Terminal> brace_r_token;
1457 };
1458 class StatementLabel : public Gyoji::frontend::ast::SyntaxNode {
1459 public:
1460 StatementLabel(
1461 Gyoji::owned<Terminal> _label_token,
1462 Gyoji::owned<Terminal> _identifier_token,
1463 Gyoji::owned<Terminal> _colon_token
1464 );
1468 ~StatementLabel();
1469 const std::string & get_name() const;
1470 const Gyoji::context::SourceReference & get_name_source_ref() const;
1471 private:
1472 Gyoji::owned<Terminal> label_token;
1473 Gyoji::owned<Terminal> identifier_token;
1474 Gyoji::owned<Terminal> colon_token;
1475 };
1476 class StatementGoto : public Gyoji::frontend::ast::SyntaxNode {
1477 public:
1478 StatementGoto(
1479 Gyoji::owned<Terminal> _goto_token,
1480 Gyoji::owned<Terminal> _identifier_token,
1481 Gyoji::owned<Terminal> _semicolon_token
1482 );
1486 ~StatementGoto();
1487 const std::string & get_label() const;
1488 const Gyoji::context::SourceReference & get_label_source_ref() const;
1489 private:
1490 Gyoji::owned<Terminal> goto_token;
1491 Gyoji::owned<Terminal> identifier_token;
1492 Gyoji::owned<Terminal> semicolon_token;
1493 };
1494 class StatementBreak : public Gyoji::frontend::ast::SyntaxNode {
1495 public:
1496 StatementBreak(
1497 Gyoji::owned<Terminal> _break_token,
1498 Gyoji::owned<Terminal> _semicolon_token
1499 );
1503 ~StatementBreak();
1504 private:
1505 Gyoji::owned<Terminal> break_token;
1506 Gyoji::owned<Terminal> semicolon_token;
1507 };
1508 class StatementContinue : public Gyoji::frontend::ast::SyntaxNode {
1509 public:
1510 StatementContinue(
1511 Gyoji::owned<Terminal> _continue_token,
1512 Gyoji::owned<Terminal> _semicolon_token
1513 );
1517 ~StatementContinue();
1518 private:
1519 Gyoji::owned<Terminal> continue_token;
1520 Gyoji::owned<Terminal> semicolon_token;
1521 };
1522 class StatementReturn : public Gyoji::frontend::ast::SyntaxNode {
1523 public:
1527 StatementReturn(
1528 Gyoji::owned<Terminal> _return_token,
1529 Gyoji::owned<Expression> _expression,
1530 Gyoji::owned<Terminal> _semicolon_token
1531 );
1535 StatementReturn(
1536 Gyoji::owned<Terminal> _return_token,
1537 Gyoji::owned<Terminal> _semicolon_token
1538 );
1542 ~StatementReturn();
1543 bool is_void() const;
1544 const Expression & get_expression() const;
1545 private:
1546 Gyoji::owned<Terminal> return_token;
1547 bool void_return;
1548 Gyoji::owned<Expression> expression;
1549 Gyoji::owned<Terminal> semicolon_token;
1550 };
1551
1552 class Statement : public Gyoji::frontend::ast::SyntaxNode {
1553 public:
1554 typedef std::variant<
1567 > StatementType;
1568
1569 Statement(StatementType _statement, const SyntaxNode & _sn);
1573 ~Statement();
1574 const StatementType & get_statement() const;
1575 private:
1576 StatementType statement;
1577 };
1578
1579 class StatementList : public Gyoji::frontend::ast::SyntaxNode {
1580 public:
1581 StatementList(const Gyoji::context::SourceReference & _source_ref);
1585 ~StatementList();
1586 void add_statement(Gyoji::owned<Statement> _statement);
1587 const std::vector<Gyoji::owned<Statement>> &get_statements() const;
1588 private:
1590 };
1591
1592 class ScopeBody : public Gyoji::frontend::ast::SyntaxNode {
1593 public:
1594 ScopeBody(
1595 Gyoji::owned<Terminal> brace_l_token,
1596 Gyoji::owned<StatementList> statement_list,
1597 Gyoji::owned<Terminal> brace_r_token
1598 );
1602 ~ScopeBody();
1603 const StatementList & get_statements() const;
1604 private:
1605 Gyoji::owned<Terminal> brace_l_token;
1606 Gyoji::owned<StatementList> statement_list;
1607 Gyoji::owned<Terminal> brace_r_token;
1608 };
1609
1610 class FileStatementFunctionDeclStart : public Gyoji::frontend::ast::SyntaxNode {
1611 public:
1612 FileStatementFunctionDeclStart(
1613 Gyoji::owned<AccessModifier> _access_modifier,
1614 Gyoji::owned<UnsafeModifier> _unsafe_modifier,
1615 Gyoji::owned<TypeSpecifier> _type_specifier,
1617 );
1618 ~FileStatementFunctionDeclStart();
1619
1620 const AccessModifier & get_access_modifier() const;
1621 const UnsafeModifier & get_unsafe_modifier() const;
1622 const TypeSpecifier & get_type_specifier() const;
1623 const Terminal & get_name() const;
1624 private:
1625 Gyoji::owned<AccessModifier> access_modifier;
1626 Gyoji::owned<UnsafeModifier> unsafe_modifier;
1627 Gyoji::owned<TypeSpecifier> type_specifier;
1628 Gyoji::owned<Terminal> name; // function name (IDENTIFIER)
1629 };
1630
1631 class FileStatementFunctionDefinition : public Gyoji::frontend::ast::SyntaxNode {
1632 public:
1633 FileStatementFunctionDefinition(
1635 Gyoji::owned<Terminal> _paren_l,
1637 Gyoji::owned<Terminal> _paren_r,
1638 Gyoji::owned<ScopeBody> _scope_body
1639 );
1643 ~FileStatementFunctionDefinition();
1644 const AccessModifier & get_access_modifier() const;
1645 const UnsafeModifier & get_unsafe_modifier() const;
1646 const TypeSpecifier & get_return_type() const;
1647 const Terminal & get_name() const;
1648 const FunctionDefinitionArgList & get_arguments() const;
1649 const ScopeBody & get_scope_body() const;
1650
1651 private:
1653 Gyoji::owned<Terminal> paren_l; // argument list delimiter PAREN_L
1655 Gyoji::owned<Terminal> paren_r; // argument list delimiter PAREN_R
1656 Gyoji::owned<ScopeBody> scope_body; // argument list delimiter SEMICOLON
1657 };
1658
1659 class ArrayLength : public Gyoji::frontend::ast::SyntaxNode {
1660 public:
1661 ArrayLength(const Gyoji::context::SourceReference & _source_ref);
1662 ArrayLength(
1663 Gyoji::owned<Terminal> _bracket_l_token,
1664 Gyoji::owned<Terminal> _literal_int_token,
1665 Gyoji::owned<Terminal> _bracket_r_token
1666 );
1670 ~ArrayLength();
1671 bool is_array() const;
1672 size_t get_size() const;
1673 const Gyoji::context::SourceReference & get_size_source_ref() const;
1674 private:
1675 Gyoji::owned<Terminal> bracket_l_token;
1676 Gyoji::owned<Terminal> literal_int_token;
1677 Gyoji::owned<Terminal> bracket_r_token;
1678 };
1679
1680 class ClassDeclStart : public Gyoji::frontend::ast::SyntaxNode {
1681 public:
1682 ClassDeclStart(
1683 Gyoji::owned<AccessModifier> _access_modifier,
1684 Gyoji::owned<Terminal> _class_token,
1685 Gyoji::owned<Terminal> _identifier_token,
1686 Gyoji::owned<ClassArgumentList> _class_argument_list,
1687 bool is_identifier
1688 );
1689
1693 ~ClassDeclStart();
1694 const AccessModifier & get_access_modifier() const;
1695 const std::string & get_name() const;
1696 const Gyoji::context::SourceReference & get_name_source_ref() const;
1697
1698 const ClassArgumentList & get_argument_list() const;
1699 private:
1700 Gyoji::owned<AccessModifier> access_modifier;
1701 Gyoji::owned<Terminal> class_token;
1702 Gyoji::owned<Terminal> identifier_token;
1703 Gyoji::owned<ClassArgumentList> class_argument_list;
1704 std::string name;
1705 };
1706 class ClassArgumentList : public Gyoji::frontend::ast::SyntaxNode {
1707 public:
1708 ClassArgumentList(const Gyoji::context::SourceReference & _source_ref);
1709 ClassArgumentList(Gyoji::owned<Terminal> _argument);
1713 ~ClassArgumentList();
1714 void add_argument(Gyoji::owned<Terminal> _comma, Gyoji::owned<Terminal> _argument);
1715 void add_parens(Gyoji::owned<Terminal> _paren_l, Gyoji::owned<Terminal> _paren_r);
1716 const std::vector<Gyoji::owned<Terminal>> & get_arguments() const;
1717 private:
1718 Gyoji::owned<Terminal> paren_l;
1721 Gyoji::owned<Terminal> paren_r;
1722 };
1723
1724 class ClassMemberDeclarationVariable : public Gyoji::frontend::ast::SyntaxNode {
1725 public:
1726 ClassMemberDeclarationVariable(
1727 Gyoji::owned<AccessModifier> _access_modifier,
1728 Gyoji::owned<TypeSpecifier> _type_specifier,
1729 Gyoji::owned<Terminal> _identifier_token,
1730 Gyoji::owned<Terminal> _semicolon_token
1731 );
1735 ~ClassMemberDeclarationVariable();
1736 const AccessModifier & get_access_modifier() const;
1737 const TypeSpecifier & get_type_specifier() const;
1738 const std::string & get_name() const;
1739 const Gyoji::context::SourceReference & get_name_source_ref() const;
1740 private:
1741 Gyoji::owned<AccessModifier> access_modifier;
1742 Gyoji::owned<TypeSpecifier> type_specifier;
1743 Gyoji::owned<Terminal> identifier_token;
1744 Gyoji::owned<Terminal> semicolon_token;
1745 };
1746 class ClassMemberDeclarationMethod : public Gyoji::frontend::ast::SyntaxNode {
1747 public:
1748 ClassMemberDeclarationMethod(
1749 Gyoji::owned<AccessModifier> _access_modifier,
1750 Gyoji::owned<TypeSpecifier> _type_specifier,
1751 Gyoji::owned<Terminal> _identifier_token,
1752 Gyoji::owned<Terminal> _paren_l_token,
1753 Gyoji::owned<FunctionDefinitionArgList> _function_definition_arg_list,
1754 Gyoji::owned<Terminal> _paren_r_token,
1755 Gyoji::owned<Terminal> _semicolon_token
1756 );
1760 ~ClassMemberDeclarationMethod();
1761 const AccessModifier & get_access_modifier() const;
1762 const TypeSpecifier & get_type_specifier() const;
1763 const Terminal & get_identifier() const;
1764 const FunctionDefinitionArgList & get_arguments() const;
1765 private:
1766 Gyoji::owned<AccessModifier> access_modifier;
1767 Gyoji::owned<TypeSpecifier> type_specifier;
1768 Gyoji::owned<Terminal> identifier_token;
1769 Gyoji::owned<Terminal> paren_l_token;
1770 Gyoji::owned<FunctionDefinitionArgList> function_definition_arg_list;
1771 Gyoji::owned<Terminal> paren_r_token;
1772 Gyoji::owned<Terminal> semicolon_token;
1773 };
1774 class ClassMemberDeclarationConstructor : public Gyoji::frontend::ast::SyntaxNode {
1775 public:
1776 ClassMemberDeclarationConstructor(
1777 Gyoji::owned<AccessModifier> _access_modifier,
1778 Gyoji::owned<TypeSpecifier> _type_specifier,
1779 Gyoji::owned<Terminal> _paren_l_token,
1780 Gyoji::owned<FunctionDefinitionArgList> _function_definition_arg_list,
1781 Gyoji::owned<Terminal> _paren_r_token,
1782 Gyoji::owned<Terminal> _semicolon_token
1783 );
1787 ~ClassMemberDeclarationConstructor();
1788 const AccessModifier & get_access_modifier() const;
1789 const TypeSpecifier & get_type_specifier() const;
1790 const FunctionDefinitionArgList & get_arguments() const;
1791 private:
1792 Gyoji::owned<AccessModifier> access_modifier;
1793 Gyoji::owned<TypeSpecifier> type_specifier;
1794 Gyoji::owned<Terminal> paren_l_token;
1795 Gyoji::owned<FunctionDefinitionArgList> function_definition_arg_list;
1796 Gyoji::owned<Terminal> paren_r_token;
1797 Gyoji::owned<Terminal> semicolon_token;
1798 };
1799 class ClassMemberDeclarationDestructor : public Gyoji::frontend::ast::SyntaxNode {
1800 public:
1801 ClassMemberDeclarationDestructor(
1802 Gyoji::owned<AccessModifier> _access_modifier,
1803 Gyoji::owned<Terminal> _tilde_token,
1804 Gyoji::owned<TypeSpecifier> _type_specifier,
1805 Gyoji::owned<Terminal> _paren_l_token,
1806 Gyoji::owned<FunctionDefinitionArgList> _function_definition_arg_list,
1807 Gyoji::owned<Terminal> _paren_r_token,
1808 Gyoji::owned<Terminal> _semicolon_token
1809 );
1813 ~ClassMemberDeclarationDestructor();
1814 const AccessModifier & get_access_modifier() const;
1815 const TypeSpecifier & get_type_specifier() const;
1816 const FunctionDefinitionArgList & get_arguments() const;
1817 private:
1818 Gyoji::owned<AccessModifier> access_modifier;
1819 Gyoji::owned<Terminal> tilde_token;
1820 Gyoji::owned<TypeSpecifier> type_specifier;
1821 Gyoji::owned<Terminal> paren_l_token;
1822 Gyoji::owned<FunctionDefinitionArgList> function_definition_arg_list;
1823 Gyoji::owned<Terminal> paren_r_token;
1824 Gyoji::owned<Terminal> semicolon_token;
1825 };
1826
1827 class ClassMemberDeclaration : public Gyoji::frontend::ast::SyntaxNode {
1828 public:
1829 typedef std::variant<
1838 > MemberType;
1839 ClassMemberDeclaration(
1840 MemberType _member,
1842 );
1846 ~ClassMemberDeclaration();
1847 const ClassMemberDeclaration::MemberType & get_member();
1848 private:
1849 MemberType member;
1850 };
1851
1852 class ClassMemberDeclarationList : public Gyoji::frontend::ast::SyntaxNode {
1853 public:
1854 ClassMemberDeclarationList(const Gyoji::context::SourceReference & _source_ref);
1858 ~ClassMemberDeclarationList();
1859 const std::vector<Gyoji::owned<ClassMemberDeclaration>> & get_members() const;
1860 void add_member(Gyoji::owned<ClassMemberDeclaration> _member);
1861 private:
1863 };
1864
1870 public:
1872 Gyoji::owned<ClassDeclStart> _class_decl_start,
1873 Gyoji::owned<Terminal> _semicolon_token
1874 );
1879 const AccessModifier & get_access_modifier() const;
1880
1881 const std::string & get_name() const;
1882 const Gyoji::context::SourceReference & get_name_source_ref() const;
1883
1884 const ClassArgumentList & get_argument_list() const;
1885 private:
1886 Gyoji::owned<ClassDeclStart> class_decl_start;
1887 Gyoji::owned<Terminal> semicolon_token;
1888 };
1889
1890 class ClassDefinition : public Gyoji::frontend::ast::SyntaxNode {
1891 public:
1892 ClassDefinition(
1893 Gyoji::owned<ClassDeclStart> _class_decl_start,
1894 Gyoji::owned<Terminal> _brace_l_token,
1895 Gyoji::owned<ClassMemberDeclarationList> _class_member_declaration_list,
1896 Gyoji::owned<Terminal> _brace_r_token,
1897 Gyoji::owned<Terminal> _semicolon_token
1898 );
1902 ~ClassDefinition();
1903 const AccessModifier & get_access_modifier() const;
1904 const std::string & get_name() const;
1905 const Gyoji::context::SourceReference & get_name_source_ref() const;
1906 const ClassArgumentList & get_argument_list() const;
1907 const std::vector<Gyoji::owned<ClassMemberDeclaration>> & get_members() const;
1908 private:
1909 Gyoji::owned<ClassDeclStart> class_decl_start;
1910 Gyoji::owned<Terminal> brace_l_token;
1911 Gyoji::owned<ClassMemberDeclarationList> class_member_declaration_list;
1912 Gyoji::owned<Terminal> brace_r_token;
1913 Gyoji::owned<Terminal> semicolon_token;
1914 };
1915
1916 class TypeDefinition : public Gyoji::frontend::ast::SyntaxNode {
1917 public:
1918 TypeDefinition(
1919 Gyoji::owned<AccessModifier> _access_modifier,
1920 Gyoji::owned<Terminal> _typedef_token,
1921 Gyoji::owned<TypeSpecifier> _type_specifier,
1922 Gyoji::owned<Terminal> _identifier_token,
1923 Gyoji::owned<Terminal> _semicolon_token
1924 );
1928 ~TypeDefinition();
1929 const AccessModifier & get_access_modifier() const;
1930 const std::string & get_name() const;
1931 const Gyoji::context::SourceReference & get_name_source_ref() const;
1932 const TypeSpecifier & get_type_specifier() const;
1933 private:
1934 Gyoji::owned<AccessModifier> access_modifier;
1935 Gyoji::owned<Terminal> typedef_token;
1936 Gyoji::owned<TypeSpecifier> type_specifier;
1937 Gyoji::owned<Terminal> identifier_token;
1938 Gyoji::owned<Terminal> semicolon_token;
1939 };
1940
1941 class EnumDefinitionValue : public Gyoji::frontend::ast::SyntaxNode {
1942 public:
1943 EnumDefinitionValue(
1944 Gyoji::owned<Terminal> _identifier_token,
1945 Gyoji::owned<Terminal> _equals_token,
1946 Gyoji::owned<Expression> _expression_primary,
1947 Gyoji::owned<Terminal> _semicolon_token
1948 );
1952 ~EnumDefinitionValue();
1953 const std::string & get_name() const;
1954 const Gyoji::context::SourceReference & get_name_source_ref() const;
1955 const Expression & get_expression() const;
1956 private:
1957 Gyoji::owned<Terminal> identifier_token;
1958 Gyoji::owned<Terminal> equals_token;
1959 Gyoji::owned<Expression> expression_primary;
1960 Gyoji::owned<Terminal> semicolon_token;
1961 };
1962
1963 class EnumDefinitionValueList : public Gyoji::frontend::ast::SyntaxNode {
1964 public:
1965 EnumDefinitionValueList(const Gyoji::context::SourceReference & _source_ref);
1969 ~EnumDefinitionValueList();
1970 void add_value(Gyoji::owned<EnumDefinitionValue>);
1971 const std::vector<Gyoji::owned<EnumDefinitionValue>> &get_values() const;
1972 private:
1974 };
1975
1976 class EnumDefinition : public Gyoji::frontend::ast::SyntaxNode {
1977 public:
1978 EnumDefinition(
1979 Gyoji::owned<AccessModifier> _access_modifier,
1980 Gyoji::owned<Terminal> _enum_token,
1981 Gyoji::owned<Terminal> _type_name_token,
1982 Gyoji::owned<Terminal> _identifier_token,
1983 Gyoji::owned<Terminal> _brace_l_token,
1985 Gyoji::owned<Terminal> _brace_r_token,
1986 Gyoji::owned<Terminal> _semicolon_token
1987 );
1991 ~EnumDefinition();
1992 const AccessModifier & get_access_modifier() const;
1993 const std::string & get_type_name() const;
1994 const Gyoji::context::SourceReference & get_type_name_source_ref() const;
1995
1996 const std::string & get_name() const;
1997 const Gyoji::context::SourceReference & get_name_source_ref() const;
1998
1999 const EnumDefinitionValueList & get_value_list() const;
2000 private:
2001 Gyoji::owned<AccessModifier> access_modifier;
2002 Gyoji::owned<Terminal> enum_token;
2003 Gyoji::owned<Terminal> type_name_token;
2004 Gyoji::owned<Terminal> identifier_token;
2005 Gyoji::owned<Terminal> brace_l_token;
2007 Gyoji::owned<Terminal> brace_r_token;
2008 Gyoji::owned<Terminal> semicolon_token;
2009
2010 };
2011
2012 class ExpressionPrimaryIdentifier : public Gyoji::frontend::ast::SyntaxNode {
2013 public:
2014 ExpressionPrimaryIdentifier(Gyoji::owned<Terminal> _identifier_token);
2018 ~ExpressionPrimaryIdentifier();
2019 const Terminal & get_identifier() const;
2020 private:
2021 Gyoji::owned<Terminal> identifier_token;
2022 };
2023 class ExpressionPrimaryNested : public Gyoji::frontend::ast::SyntaxNode {
2024 public:
2025 ExpressionPrimaryNested(
2026 Gyoji::owned<Terminal> _paren_l_token,
2027 Gyoji::owned<Expression> _expression,
2028 Gyoji::owned<Terminal> _paren_r_token
2029 );
2033 ~ExpressionPrimaryNested();
2034 const Expression & get_expression() const;
2035 private:
2036 Gyoji::owned<Terminal> paren_l_token;
2037 Gyoji::owned<Expression> expression;
2038 Gyoji::owned<Terminal> paren_r_token;
2039 };
2040
2041 class ExpressionPrimaryLiteralInt : public Gyoji::frontend::ast::SyntaxNode {
2042 public:
2043 ExpressionPrimaryLiteralInt(
2044 Gyoji::owned<Terminal> literal_token
2045 );
2049 ~ExpressionPrimaryLiteralInt();
2053 const std::string & get_value() const;
2054 const Terminal & get_literal_int_token() const;
2055 const Gyoji::context::SourceReference & get_value_source_ref() const;
2056 private:
2057 Gyoji::owned<Terminal> literal_token;
2058 };
2059 class ExpressionPrimaryLiteralChar : public Gyoji::frontend::ast::SyntaxNode {
2060 public:
2061 ExpressionPrimaryLiteralChar(
2062 Gyoji::owned<Terminal> _literal_token
2063 );
2067 ~ExpressionPrimaryLiteralChar();
2068 std::string get_value() const;
2069 const Gyoji::context::SourceReference & get_value_source_ref() const;
2070 private:
2071 Gyoji::owned<Terminal> literal_token;
2072 };
2073 class ExpressionPrimaryLiteralString : public Gyoji::frontend::ast::SyntaxNode {
2074 public:
2075 ExpressionPrimaryLiteralString(
2076 Gyoji::owned<Terminal> _literal_token
2077 );
2081 ~ExpressionPrimaryLiteralString();
2082 std::string get_value() const;
2083 const Gyoji::context::SourceReference & get_value_source_ref() const;
2084 void add_string(Gyoji::owned<Terminal> _added);
2085 private:
2086 Gyoji::owned<Terminal> literal_token;
2087 std::vector<Gyoji::owned<Terminal>> additional_strings;
2088 };
2089 class ExpressionPrimaryLiteralFloat : public Gyoji::frontend::ast::SyntaxNode {
2090 public:
2091 ExpressionPrimaryLiteralFloat(
2092 Gyoji::owned<Terminal> _literal_token
2093 );
2097 ~ExpressionPrimaryLiteralFloat();
2098
2106 const std::string & get_value() const;
2116 const std::string & get_type() const;
2117 const Gyoji::context::SourceReference & get_value_source_ref() const;
2118 private:
2119 Gyoji::owned<Terminal> literal_token;
2120 std::string float_part;
2121 std::string type_part;
2122 };
2123
2124 class ExpressionPrimaryLiteralBool : public Gyoji::frontend::ast::SyntaxNode {
2125 public:
2126 ExpressionPrimaryLiteralBool(
2127 Gyoji::owned<Terminal> _literal_token
2128 );
2132 ~ExpressionPrimaryLiteralBool();
2133
2138 bool get_value() const;
2139 private:
2140 Gyoji::owned<Terminal> literal_token;
2141 bool value;
2142 };
2143 class ExpressionPrimaryLiteralNull : public Gyoji::frontend::ast::SyntaxNode {
2144 public:
2145 ExpressionPrimaryLiteralNull(
2146 Gyoji::owned<Terminal> _literal_token
2147 );
2151 ~ExpressionPrimaryLiteralNull();
2152 private:
2153 Gyoji::owned<Terminal> literal_token;
2154 };
2155
2156 class ExpressionPostfixArrayIndex : public Gyoji::frontend::ast::SyntaxNode {
2157 public:
2158 ExpressionPostfixArrayIndex(
2159 Gyoji::owned<Expression> _array_expression,
2160 Gyoji::owned<Terminal> _bracket_l_token,
2161 Gyoji::owned<Expression> _index_expression,
2162 Gyoji::owned<Terminal> _bracket_r_token
2163 );
2167 ~ExpressionPostfixArrayIndex();
2168 const Expression & get_array() const;
2169 const Expression & get_index() const;
2170 private:
2171 Gyoji::owned<Expression> array_expression;
2172 Gyoji::owned<Terminal> bracket_l_token;
2173 Gyoji::owned<Expression> index_expression;
2174 Gyoji::owned<Terminal> bracket_r_token;
2175 };
2176
2177 class ArgumentExpressionList : public Gyoji::frontend::ast::SyntaxNode {
2178 public:
2179 ArgumentExpressionList(const Gyoji::context::SourceReference & _source_ref);
2183 ~ArgumentExpressionList();
2184 const std::vector<Gyoji::owned<Expression>> & get_arguments() const;
2185 void add_argument(Gyoji::owned<Expression> _argument);
2186 void add_argument(Gyoji::owned<Terminal> _comma_token, Gyoji::owned<Expression> _argument);
2187 private:
2190 };
2191
2192 class ExpressionPostfixFunctionCall : public Gyoji::frontend::ast::SyntaxNode {
2193 public:
2194 ExpressionPostfixFunctionCall(
2195 Gyoji::owned<Expression> _function_expression,
2196 Gyoji::owned<Terminal> _paren_l_token,
2198 Gyoji::owned<Terminal> _paren_r_token
2199 );
2203 ~ExpressionPostfixFunctionCall();
2204 const Expression & get_function() const;
2205 const ArgumentExpressionList & get_arguments() const;
2206 private:
2207 Gyoji::owned<Expression> function_expression;
2208 Gyoji::owned<Terminal> paren_l_token;
2210 Gyoji::owned<Terminal> paren_r_token;
2211 };
2212
2213 class ExpressionPostfixDot : public Gyoji::frontend::ast::SyntaxNode {
2214 public:
2215 ExpressionPostfixDot(
2216 Gyoji::owned<Expression> _expression,
2217 Gyoji::owned<Terminal> _dot_token,
2218 Gyoji::owned<Terminal> _identifier_token
2219 );
2223 ~ExpressionPostfixDot();
2224 const Expression & get_expression() const;
2225 const Terminal & get_identifier() const;
2226 private:
2227 Gyoji::owned<Expression> expression;
2228 Gyoji::owned<Terminal> dot_token;
2229 Gyoji::owned<Terminal> identifier_token;
2230 };
2231
2232 class ExpressionPostfixArrow : public Gyoji::frontend::ast::SyntaxNode {
2233 public:
2234 ExpressionPostfixArrow(
2235 Gyoji::owned<Expression> _expression,
2236 Gyoji::owned<Terminal> _arrow_token,
2237 Gyoji::owned<Terminal> _identifier_token
2238 );
2242 ~ExpressionPostfixArrow();
2243 const Expression & get_expression() const;
2244 const Terminal & get_identifier() const;
2245 private:
2246 Gyoji::owned<Expression> expression;
2247 Gyoji::owned<Terminal> arrow_token;
2248 Gyoji::owned<Terminal> identifier_token;
2249 };
2250
2251 class ExpressionPostfixIncDec : public Gyoji::frontend::ast::SyntaxNode {
2252 public:
2253 typedef enum {
2254 INCREMENT,
2255 DECREMENT
2256 } OperationType;
2257 ExpressionPostfixIncDec(
2258 Gyoji::owned<Expression> _expression,
2259 Gyoji::owned<Terminal> _operator_token,
2260 ExpressionPostfixIncDec::OperationType _type
2261 );
2265 ~ExpressionPostfixIncDec();
2266 const ExpressionPostfixIncDec::OperationType & get_type() const;
2267 const Expression & get_expression() const;
2268 private:
2269 ExpressionPostfixIncDec::OperationType type;
2270 Gyoji::owned<Terminal> operator_token;
2271 Gyoji::owned<Expression> expression;
2272 };
2273
2274 class ExpressionUnaryPrefix : public Gyoji::frontend::ast::SyntaxNode {
2275 public:
2276 typedef enum {
2277 INCREMENT,
2278 DECREMENT,
2279 ADDRESSOF,
2280 DEREFERENCE,
2281 PLUS,
2282 MINUS,
2283 BITWISE_NOT,
2284 LOGICAL_NOT
2285 } OperationType;
2286 ExpressionUnaryPrefix(
2287 Gyoji::owned<Terminal> _operator_token,
2288 Gyoji::owned<Expression> _expression,
2289 ExpressionUnaryPrefix::OperationType _type
2290 );
2294 ~ExpressionUnaryPrefix();
2295 const ExpressionUnaryPrefix::OperationType & get_type() const;
2296 const Gyoji::context::SourceReference & get_operator_source_ref() const;
2297 const Expression & get_expression() const;
2298 private:
2299 ExpressionUnaryPrefix::OperationType type;
2300 Gyoji::owned<Terminal> operator_token;
2301 Gyoji::owned<Expression> expression;
2302 };
2303
2304 class ExpressionUnarySizeofType : public Gyoji::frontend::ast::SyntaxNode {
2305 public:
2306 ExpressionUnarySizeofType(
2307 Gyoji::owned<Terminal> _sizeof_token,
2308 Gyoji::owned<Terminal> _paren_l_token,
2309 Gyoji::owned<TypeSpecifier> _type_specifier,
2310 Gyoji::owned<Terminal> _paren_r_token
2311 );
2315 ~ExpressionUnarySizeofType();
2316 const TypeSpecifier & get_type_specifier() const;
2317 private:
2318 Gyoji::owned<Terminal> sizeof_token;
2319 Gyoji::owned<Terminal> paren_l_token;
2320 Gyoji::owned<TypeSpecifier> type_specifier;
2321 Gyoji::owned<Terminal> paren_r_token;
2322 };
2323
2324 class ExpressionCast : public Gyoji::frontend::ast::SyntaxNode {
2325 public:
2326 ExpressionCast(
2327 Gyoji::owned<Terminal> _cast_token,
2328 Gyoji::owned<Terminal> _paren_l_token,
2329 Gyoji::owned<TypeSpecifier> _type_specifier,
2330 Gyoji::owned<Terminal> _comma_token,
2331 Gyoji::owned<Expression> _expression,
2332 Gyoji::owned<Terminal> _paren_r_token
2333 );
2337 ~ExpressionCast();
2338 const TypeSpecifier & get_type() const;
2339 const Expression & get_expression() const;
2340 private:
2341 Gyoji::owned<Terminal> cast_token;
2342 Gyoji::owned<Terminal> paren_l_token;
2343 Gyoji::owned<TypeSpecifier> type_specifier;
2344 Gyoji::owned<Terminal> comma_token;
2345 Gyoji::owned<Expression> expression;
2346 Gyoji::owned<Terminal> paren_r_token;
2347 };
2348
2349 class ExpressionBinary : public Gyoji::frontend::ast::SyntaxNode {
2350 public:
2351 typedef enum {
2352 // Arithmetic
2353 ADD,
2354 SUBTRACT,
2355 MULTIPLY,
2356 DIVIDE,
2357 MODULO,
2358 // Logical
2359 LOGICAL_AND,
2360 LOGICAL_OR,
2361
2362 // Bitwise
2363 BITWISE_AND,
2364 BITWISE_OR,
2365 BITWISE_XOR,
2366 SHIFT_LEFT,
2367 SHIFT_RIGHT,
2368
2369 // Relational
2370 COMPARE_LESS,
2371 COMPARE_GREATER,
2372 COMPARE_LESS_EQUAL,
2373 COMPARE_GREATER_EQUAL,
2374 COMPARE_EQUAL,
2375 COMPARE_NOT_EQUAL,
2376
2377 // Assignment
2378 ASSIGNMENT,
2379 MUL_ASSIGNMENT,
2380 DIV_ASSIGNMENT,
2381 MOD_ASSIGNMENT,
2382 ADD_ASSIGNMENT,
2383 SUB_ASSIGNMENT,
2384 LEFT_ASSIGNMENT,
2385 RIGHT_ASSIGNMENT,
2386 AND_ASSIGNMENT,
2387 XOR_ASSIGNMENT,
2388 OR_ASSIGNMENT
2389 } OperationType;
2390 ExpressionBinary(
2391 Gyoji::owned<Expression> _expression_a,
2392 Gyoji::owned<Terminal> _operator_token,
2393 Gyoji::owned<Expression> _expression_b,
2394 ExpressionBinary::OperationType _type
2395 );
2408 ExpressionBinary(
2409 Gyoji::owned<Expression> _expression_a,
2410 Gyoji::owned<Terminal> _operator_token,
2411 Gyoji::owned<Terminal> _operator_token2,
2412 Gyoji::owned<Expression> _expression_b,
2413 ExpressionBinary::OperationType _type
2414 );
2418 ~ExpressionBinary();
2419 const Expression & get_a() const;
2420 const ExpressionBinary::OperationType & get_operator() const;
2421 const Gyoji::context::SourceReference & get_operator_source_ref() const;
2422 const Expression & get_b() const;
2423
2424 private:
2425 OperationType type;
2426 Gyoji::owned<Expression> expression_a;
2427 Gyoji::owned<Terminal> operator_token;
2428 Gyoji::owned<Terminal> operator_token2;
2429 Gyoji::owned<Expression> expression_b;
2430 };
2431
2432 class ExpressionTrinary : public Gyoji::frontend::ast::SyntaxNode {
2433 public:
2434 ExpressionTrinary(
2435 Gyoji::owned<Expression> _condition,
2436 Gyoji::owned<Terminal> _questionmark_token,
2437 Gyoji::owned<Expression> _if_expression,
2438 Gyoji::owned<Terminal> _colon_token,
2439 Gyoji::owned<Expression> _else_expression
2440 );
2444 ~ExpressionTrinary();
2445 const Expression & get_condition() const;
2446 const Expression & get_if() const;
2447 const Expression & get_else() const;
2448 private:
2449 Gyoji::owned<Expression> condition;
2450 Gyoji::owned<Terminal> questionmark_token;
2451 Gyoji::owned<Expression> if_expression;
2452 Gyoji::owned<Terminal> colon_token;
2453 Gyoji::owned<Expression> else_expression;
2454 };
2455
2456 class Expression : public Gyoji::frontend::ast::SyntaxNode {
2457 public:
2458 typedef std::variant<
2477 > ExpressionType;
2478 Expression(Expression::ExpressionType _expression_type, const SyntaxNode & _sn);
2482 ~Expression();
2483 const Expression::ExpressionType & get_expression() const;
2484 private:
2485 Expression::ExpressionType expression_type;
2486 };
2487
2488 class GlobalInitializerExpressionPrimary : public Gyoji::frontend::ast::SyntaxNode {
2489 public:
2490 GlobalInitializerExpressionPrimary(
2491 Gyoji::owned<Terminal> _equals_token,
2492 Gyoji::owned<Expression> _expression
2493 );
2497 ~GlobalInitializerExpressionPrimary();
2498 const Expression & get_expression() const;
2499 private:
2500 Gyoji::owned<Terminal> equals_token;
2501 Gyoji::owned<Expression> expression;
2502
2503 };
2504 class GlobalInitializerAddressofExpressionPrimary : public Gyoji::frontend::ast::SyntaxNode {
2505 public:
2506 GlobalInitializerAddressofExpressionPrimary(
2507 Gyoji::owned<Terminal> _equals_token,
2508 Gyoji::owned<Terminal> _addressof_token,
2509 Gyoji::owned<Expression> _expression
2510 );
2514 ~GlobalInitializerAddressofExpressionPrimary();
2515 const Expression & get_expression() const;
2516 private:
2517 Gyoji::owned<Terminal> equals_token;
2518 Gyoji::owned<Terminal> addressof_token;
2519 Gyoji::owned<Expression> expression;
2520 };
2521
2522 class StructInitializer : public Gyoji::frontend::ast::SyntaxNode {
2523 public:
2524 StructInitializer(
2525 Gyoji::owned<Terminal> _dot_token,
2526 Gyoji::owned<Terminal> _identifier_token,
2527 Gyoji::owned<GlobalInitializer> _global_initializer,
2528 Gyoji::owned<Terminal> _semicolon_token
2529 );
2533 ~StructInitializer();
2534 const GlobalInitializer & get_initializer() const;
2535 private:
2536 Gyoji::owned<Terminal> dot_token;
2537 Gyoji::owned<Terminal> identifier_token;
2538 Gyoji::owned<GlobalInitializer> global_initializer;
2539 Gyoji::owned<Terminal> semicolon_token;
2540 };
2541
2542 class StructInitializerList : public Gyoji::frontend::ast::SyntaxNode {
2543 public:
2544 StructInitializerList(const Gyoji::context::SourceReference & _source_ref);
2548 ~StructInitializerList();
2549 void add_initializer(Gyoji::owned<StructInitializer> initializer);
2550 const std::vector<Gyoji::owned<StructInitializer>> & get_initializers() const;
2551 private:
2553 };
2554
2555 class GlobalInitializerStructInitializerList : public Gyoji::frontend::ast::SyntaxNode {
2556 public:
2557 GlobalInitializerStructInitializerList(
2558 Gyoji::owned<Terminal> _equals_token,
2559 Gyoji::owned<Terminal> _brace_l_token,
2560 Gyoji::owned<StructInitializerList> _struct_initializer,
2561 Gyoji::owned<Terminal> _brace_r_token
2562 );
2563
2567 ~GlobalInitializerStructInitializerList();
2568 const StructInitializerList & get_struct_initializer() const;
2569 private:
2570 Gyoji::owned<Terminal> equals_token;
2571 Gyoji::owned<Terminal> brace_l_token;
2572 Gyoji::owned<StructInitializerList> struct_initializer;
2573 Gyoji::owned<Terminal> brace_r_token;
2574 };
2575
2576 class GlobalInitializer : public Gyoji::frontend::ast::SyntaxNode {
2577 public:
2578 typedef std::variant<
2582 nullptr_t> GlobalInitializerType;
2583 GlobalInitializer(const Gyoji::context::SourceReference & _source_ref);
2584 GlobalInitializer(GlobalInitializerType initializer, const Gyoji::frontend::ast::SyntaxNode & _sn);
2588 ~GlobalInitializer();
2589 const GlobalInitializerType & get_initializer() const;
2590 private:
2591 GlobalInitializerType initializer;
2592 };
2593
2594 class FileStatementGlobalDefinition : public Gyoji::frontend::ast::SyntaxNode {
2595 public:
2596 FileStatementGlobalDefinition(
2597 Gyoji::owned<AccessModifier> _access_modifier,
2598 Gyoji::owned<UnsafeModifier> _unsafe_modifier,
2599 Gyoji::owned<TypeSpecifier> _type_specifier,
2601 Gyoji::owned<GlobalInitializer> _global_initializer,
2602 Gyoji::owned<Terminal> _semicolon
2603 );
2607 ~FileStatementGlobalDefinition();
2608 const AccessModifier & get_access_modifier() const;
2609 const UnsafeModifier & get_unsafe_modifier() const;
2610 const TypeSpecifier & get_type_specifier() const;
2611 const std::string & get_name() const;
2612 const Gyoji::context::SourceReference & get_name_source_ref() const;
2613 const GlobalInitializer & get_global_initializer() const;
2614 private:
2615 Gyoji::owned<AccessModifier> access_modifier;
2616 Gyoji::owned<UnsafeModifier> unsafe_modifier;
2617 Gyoji::owned<TypeSpecifier> type_specifier;
2618 Gyoji::owned<Terminal> name; // function name (IDENTIFIER)
2619 Gyoji::owned<GlobalInitializer> global_initializer;
2620 Gyoji::owned<Terminal> semicolon;
2621 };
2622
2623 class NamespaceDeclaration : public Gyoji::frontend::ast::SyntaxNode {
2624 public:
2625 NamespaceDeclaration(
2626 Gyoji::owned<AccessModifier> _access_modifier,
2627 Gyoji::owned<Terminal> _namespace_token,
2628 Gyoji::owned<Terminal> _identifier_token
2629 );
2633 ~NamespaceDeclaration();
2634 const AccessModifier & get_access_modifier() const;
2635 const Terminal & get_name() const;
2636 private:
2637 Gyoji::owned<AccessModifier> access_modifier;
2638 Gyoji::owned<Terminal> namespace_token;
2639 Gyoji::owned<Terminal> identifier_token;
2640 };
2641
2642 class FileStatementNamespace : public Gyoji::frontend::ast::SyntaxNode {
2643 public:
2644 FileStatementNamespace(
2645 Gyoji::owned<NamespaceDeclaration> _namespace_declaration,
2646 Gyoji::owned<Terminal> _brace_l_token,
2647 Gyoji::owned<FileStatementList> _file_statement_list,
2648 Gyoji::owned<Terminal> _brace_r_token,
2649 Gyoji::owned<Terminal> _semicolon_token
2650 );
2654 ~FileStatementNamespace();
2655 const NamespaceDeclaration & get_declaration() const;
2656 const FileStatementList & get_statement_list() const;
2657 private:
2658 Gyoji::owned<NamespaceDeclaration> namespace_declaration;
2659 Gyoji::owned<Terminal> brace_l_token;
2660 Gyoji::owned<FileStatementList> file_statement_list;
2661 Gyoji::owned<Terminal> brace_r_token;
2662 Gyoji::owned<Terminal> semicolon_token;
2663 };
2664
2665 class UsingAs : public Gyoji::frontend::ast::SyntaxNode {
2666 public:
2667 UsingAs(
2668 Gyoji::owned<Terminal> _as_token,
2669 Gyoji::owned<Terminal> _identifier_token
2670 );
2671 UsingAs(const Gyoji::context::SourceReference & _source_ref);
2675 ~UsingAs();
2676 bool is_as() const;
2677 const std::string & get_using_name() const;
2678 const Gyoji::context::SourceReference & get_using_name_source_ref() const;
2679 private:
2680 bool aas;
2681 std::string using_name;
2682 Gyoji::owned<Terminal> as_token;
2683 Gyoji::owned<Terminal> identifier_token;
2684 };
2685
2686 class FileStatementUsing : public Gyoji::frontend::ast::SyntaxNode {
2687 public:
2688 FileStatementUsing(
2689 Gyoji::owned<AccessModifier> _access_modifier,
2691 Gyoji::owned<Terminal> _namespace,
2692 Gyoji::owned<Terminal> _namespace_name,
2693 Gyoji::owned<UsingAs> _using_as,
2694 Gyoji::owned<Terminal> _semicolon);
2698 ~FileStatementUsing();
2699 private:
2700 const AccessModifier & get_access_modifier() const;
2701 std::string get_namespace() const;
2702 const Gyoji::context::SourceReference & get_namespace_source_ref() const;
2703 const UsingAs &get_using_as() const;
2704
2705 Gyoji::owned<AccessModifier> access_modifier;
2706 Gyoji::owned<Terminal> using_token;
2707 Gyoji::owned<Terminal> namespace_token;
2708 Gyoji::owned<Terminal> namespace_name_token;
2709 Gyoji::owned<UsingAs> using_as;
2710 Gyoji::owned<Terminal> semicolon_token;
2711 };
2712
2721 public:
2728 const std::vector<Gyoji::owned<FileStatement>> & get_statements() const;
2729 void add_statement(Gyoji::owned<FileStatement> statement);
2730 private:
2733 };
2734
2736
2760 public:
2762 Gyoji::owned<FileStatementList> file_statement_list,
2763 Gyoji::owned<Terminal> yyeof_token
2764 );
2774 private:
2775 Gyoji::owned<FileStatementList> file_statement_list;
2776 Gyoji::owned<Terminal> yyeof_token;
2777
2778 };
2779
2780};
2781
size_t start() const
References a location in the source-file.
Definition source-reference.hpp:16
Represents a token read from the input stream.
Definition token-stream.hpp:41
Weakly-typed syntax node.
Definition syntax-node.hpp:55
SyntaxNode(Gyoji::context::TokenID _type, specific_type_t _data, const Gyoji::context::SourceReference &_source_ref)
Definition syntax-node.cpp:8
Entity living inside a namespace.
Definition ns2.hpp:26
Declares PUBLIC, PROTECTED, or PRIVATE access to functions and members.
Definition tree.hpp:307
~AccessModifier()
Definition tree.cpp:143
const AccessModifierType & get_type() const
Definition tree.cpp:146
AccessModifierType
Definition tree.hpp:309
@ PRIVATE
Definition tree.hpp:323
@ PROTECTED
Definition tree.hpp:318
@ PUBLIC
Definition tree.hpp:313
This indicates the type of access that may be permitted as UNSPECIFIED, CONST, or VOLATILE.
Definition tree.hpp:248
~AccessQualifier()
Definition tree.cpp:111
AccessQualifierType
Definition tree.hpp:250
@ CONST
Definition tree.hpp:274
@ VOLATILE
Definition tree.hpp:267
@ UNSPECIFIED
Definition tree.hpp:258
const AccessQualifier::AccessQualifierType & get_type() const
Definition tree.cpp:114
~ClassDeclaration()
Definition tree.cpp:1488
Represents the declaration of a function.
Definition tree.hpp:942
const AccessModifier & get_access_modifier() const
Definition tree.cpp:532
const FunctionDefinitionArgList & get_arguments() const
Definition tree.cpp:544
const Terminal & get_name() const
Definition tree.cpp:541
const TypeSpecifier & get_return_type() const
Definition tree.cpp:538
const UnsafeModifier & get_unsafe_modifier() const
Definition tree.cpp:535
~FileStatementList()
Definition tree.cpp:2531
const FileStatementType & get_statement() const
Definition tree.cpp:2515
Represents the list of arguments to a function definition.
Definition tree.hpp:906
void add_argument(Gyoji::owned< FunctionDefinitionArg > _argument)
Definition tree.cpp:456
void add_comma(Gyoji::owned< Terminal > _comma)
Definition tree.cpp:462
~FunctionDefinitionArgList()
Definition tree.cpp:450
const std::vector< Gyoji::owned< FunctionDefinitionArg > > & get_arguments() const
Definition tree.cpp:453
Represents an argument in a function definition.
Definition tree.hpp:879
~FunctionDefinitionArg()
Definition tree.cpp:437
const TypeSpecifier & get_type_specifier() const
Definition tree.cpp:440
const Terminal & get_identifier() const
Definition tree.cpp:443
Represents a block of statements in a particular scope.
Definition tree.hpp:1077
const ScopeBody & get_scope_body() const
Definition tree.cpp:626
const UnsafeModifier & get_unsafe_modifier() const
Definition tree.cpp:623
~StatementBlock()
Definition tree.cpp:620
This represents a statement in a function or scope that computes an expression.
Definition tree.hpp:1121
~StatementExpression()
Definition tree.cpp:640
This represents an if condition in one of several forms.
Definition tree.hpp:1192
const ScopeBody & get_if_scope_body() const
Definition tree.cpp:739
const Expression & get_expression() const
Definition tree.cpp:736
~StatementIfElse()
Definition tree.cpp:727
const StatementIfElse & get_else_if() const
Definition tree.cpp:745
const ScopeBody & get_else_scope_body() const
Definition tree.cpp:742
Represents the declaration of a variable inside the scope of a function or block.
Definition tree.hpp:1018
const Terminal & get_identifier() const
Definition tree.cpp:603
const InitializerExpression & get_initializer_expression() const
Definition tree.cpp:606
const TypeSpecifier & get_type_specifier() const
Definition tree.cpp:600
Represents a 'while' statement in a function or scope.
Definition tree.hpp:1295
const Expression & get_expression() const
Definition tree.cpp:771
~StatementWhile()
Definition tree.cpp:768
Represents whitespace, comments, and metadata for the source file.
Definition tree.hpp:30
~TerminalNonSyntax()
Definition tree.cpp:75
@ EXTRA_FILE_METADATA
Definition tree.hpp:54
@ EXTRA_WHITESPACE
Definition tree.hpp:47
@ EXTRA_COMMENT_MULTI_LINE
Definition tree.hpp:42
@ EXTRA_COMMENT_SINGLE_LINE
Definition tree.hpp:37
const std::string & get_data() const
Definition tree.cpp:83
const Type & get_type() const
Definition tree.cpp:78
Represents tokens from the lexer used to represent keywords and identifiers found in the source.
Definition tree.hpp:89
std::string get_fully_qualified_name() const
Definition tree.cpp:32
std::string get_name() const
Definition tree.cpp:40
const std::string & get_value() const
Definition tree.cpp:25
const Gyoji::context::TokenID & get_type() const
Definition tree.cpp:22
IdentifierType
Definition tree.hpp:104
@ IDENTIFIER_GLOBAL_SCOPE
Definition tree.hpp:111
@ IDENTIFIER_UNCATEGORIZED
Definition tree.hpp:125
@ IDENTIFIER_LOCAL_SCOPE
Definition tree.hpp:117
const Gyoji::context::SourceReference & get_terminal_source_ref() const
Definition tree.cpp:28
~Terminal()
Definition tree.cpp:19
Represents the top-level syntax unit for a source file.
Definition tree.hpp:2759
const std::vector< Gyoji::owned< FileStatement > > & get_statements() const
Definition tree.cpp:2557
~TranslationUnit()
Definition tree.cpp:2553
Represents the name of a type.
Definition tree.hpp:417
~TypeName()
Definition tree.cpp:203
bool is_expression() const
Definition tree.cpp:206
std::string get_name() const
Definition tree.cpp:209
const Expression & get_expression() const
Definition tree.cpp:215
Represents arguments to a template type.
Definition tree.hpp:493
~TypeSpecifierCallArgs()
Definition tree.cpp:223
const std::vector< Gyoji::owned< TypeSpecifier > > & get_arguments() const
Definition tree.cpp:240
void add_argument(Gyoji::owned< TypeSpecifier > _argument)
Definition tree.cpp:226
Represents a pointer to a function.
Definition tree.hpp:617
const TypeSpecifier & get_return_type() const
Definition tree.cpp:321
const FunctionDefinitionArgList & get_args() const
Definition tree.cpp:330
const std::string & get_name() const
Definition tree.cpp:324
Represents an unsafe poniter to a specific type.
Definition tree.hpp:694
~TypeSpecifierPointerTo()
Definition tree.cpp:347
const AccessQualifier & get_access_qualifier() const
Definition tree.cpp:353
const TypeSpecifier & get_type_specifier() const
Definition tree.cpp:350
Represents a safe reference to a specific type.
Definition tree.hpp:785
const AccessQualifier & get_access_qualifier() const
Definition tree.cpp:376
~TypeSpecifierReferenceTo()
Definition tree.cpp:370
const TypeSpecifier & get_type_specifier() const
Definition tree.cpp:373
Represents a simple type.
Definition tree.hpp:531
const AccessQualifier & get_access_qualifier() const
Definition tree.cpp:258
const TypeName & get_type_name() const
Definition tree.cpp:261
~TypeSpecifierSimple()
Definition tree.cpp:255
Represents a type with type-arguments modifying the type's definition.
Definition tree.hpp:581
~TypeSpecifierTemplate()
Definition tree.cpp:281
const TypeSpecifierCallArgs & get_args() const
Definition tree.cpp:287
const TypeSpecifier & get_type() const
Definition tree.cpp:284
Represents a type being specified.
Definition tree.hpp:848
~TypeSpecifier()
Definition tree.cpp:419
const TypeSpecifier::TypeSpecifierType & get_type() const
Definition tree.cpp:422
Represents the safety/borrow check semantics for a function or block.
Definition tree.hpp:362
~UnsafeModifier()
Definition tree.cpp:163
bool is_unsafe() const
Definition tree.cpp:166
Strongly-typed syntax tree.
Definition forward.hpp:30