2024-03-17 07:58:28 +00:00
# include "syntax_novel.h"
# include <tokens_novel.h>
2024-06-18 03:54:36 +00:00
# include "ast_novel.h"
2024-03-17 07:58:28 +00:00
using namespace lib_syntax ;
using namespace example_novel ;
using namespace lib_token ;
using namespace ast_basic ;
// token-avaliable ==========================================================================
auto leftb = std : : make_shared < LeftBracket > ( ) ; // {
auto rightb = std : : make_shared < RightBracket > ( ) ; // }
auto refers = std : : make_shared < ReferMark > ( ) ; // @
2024-06-20 13:36:46 +00:00
auto declare = std : : make_shared < DeclareSymbo > ( ) ; // #
2025-02-07 15:26:20 +00:00
auto split_mark = std : : make_shared < Split > ( ) ; // &
2024-03-17 07:58:28 +00:00
2024-07-12 22:16:11 +00:00
auto rank_key = std : : make_shared < Keywords > ( u8 " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> " , 0xAEu ) ; // <20> <> <EFBFBD> <EFBFBD>
2025-02-07 15:26:20 +00:00
auto story_key = std : : make_shared < Keywords > ( u8 " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> " , 0xAAu ) ; // <20> <> <EFBFBD> <EFBFBD>
auto numbers = std : : make_shared < Numbers > ( ) ; // [0-9]+
auto slice_key = std : : make_shared < Keywords > ( u8 " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> " , 0xAFu ) ; // <20> <> <EFBFBD> <EFBFBD>
auto point_key = std : : make_shared < Keywords > ( u8 " <EFBFBD> ڵ<EFBFBD> " , 0xABu ) ; // <20> ڵ<EFBFBD>
2024-07-12 22:16:11 +00:00
auto volume_key = std : : make_shared < Keywords > ( u8 " <EFBFBD> ־<EFBFBD> " , 0xACu ) ; // <20> ־<EFBFBD>
2025-02-07 15:26:20 +00:00
auto article_key = std : : make_shared < Keywords > ( u8 " <EFBFBD> ½<EFBFBD> " , 0xADu ) ; // <20> ½<EFBFBD>
2024-09-22 01:57:38 +00:00
auto vtext = std : : make_shared < VTextSection > ( ) ; // ^([^\\{\\}@&]+)
2025-02-07 15:26:20 +00:00
auto name_text = std : : make_shared < NameSection > ( ) ; // ^([^\\{\\}@&]+)
2024-03-17 07:58:28 +00:00
// rule-parts ===============================================================================
2025-02-07 15:26:20 +00:00
template < typename ExprT >
void apntk ( std : : shared_ptr < ExprT > expr , std : : shared_ptr < const lib_token : : IToken > t ) {
expr - > addToken ( t ) ;
}
2024-03-17 07:58:28 +00:00
// MatchRule
2025-02-07 15:26:20 +00:00
# define MER(E, XProc, t) std::make_shared<const TokenMatch<E, XProc>>(t)
# define MR(E, t) MER(E, apntk<E>, t)
2024-03-17 07:58:28 +00:00
// Buffer
2024-07-12 21:52:32 +00:00
# define Rules QList<std::shared_ptr<const IBasicRule>>
2024-03-17 07:58:28 +00:00
// Option
# define OptMulT(token) std::make_shared<const Rept>(MR(token), 0, INT_MAX)
# define OptMulR(rule) std::make_shared<const Rept>(rule, 0, INT_MAX)
// multi+
# define MultiR(rule) std::make_shared<const Rept>(rule, 1, INT_MAX)
2024-07-26 08:22:34 +00:00
// opt?
# define OptR(rule) std::make_shared<const Rept>(rule, 0, 1)
2024-03-17 07:58:28 +00:00
2024-05-02 11:11:03 +00:00
2024-03-17 07:58:28 +00:00
2025-02-07 15:26:20 +00:00
auto decl_expr = ElementRule < TextSection > ( u8 " decl_section " , ( int ) NovelNode : : TextSection ) . reloadRule (
2024-07-28 08:37:31 +00:00
MultiR ( std : : make_shared < const Any > ( Rules {
MR ( TextSection , numbers ) , MR ( TextSection , vtext ) , MR ( TextSection , refers ) , MR ( TextSection , split_mark )
2025-02-07 15:26:20 +00:00
} ) )
2024-07-26 08:22:34 +00:00
) ;
2024-07-12 09:35:35 +00:00
2025-02-07 15:26:20 +00:00
void point_nmset ( std : : shared_ptr < PointDefines > inst , std : : shared_ptr < const lib_token : : IToken > token ) {
inst - > addToken ( token ) ;
2024-07-28 08:37:31 +00:00
inst - > setName ( token - > content ( ) ) ;
}
2025-02-07 15:26:20 +00:00
auto point_decl = ElementRule < PointDefines > ( u8 " point_define " , ( int ) NovelNode : : PointDefines ) . reloadRule (
2024-07-28 08:37:31 +00:00
std : : make_shared < const Seqs > ( Rules {
2025-02-07 15:26:20 +00:00
MR ( PointDefines , leftb ) , MR ( PointDefines , point_key ) , MER ( PointDefines , point_nmset , name_text ) } < <
2024-07-26 08:22:34 +00:00
OptR ( decl_expr ) < <
2025-02-07 15:26:20 +00:00
MR ( PointDefines , rightb )
) ) ;
2024-05-02 11:11:03 +00:00
2025-02-07 15:26:20 +00:00
void point_ref_story_set ( std : : shared_ptr < PointRefers > inst , std : : shared_ptr < const lib_token : : IToken > token ) {
inst - > addToken ( token ) ;
2024-07-28 08:37:31 +00:00
inst - > setStoryRefer ( token - > content ( ) ) ;
}
2025-02-07 15:26:20 +00:00
void point_ref_slice_set ( std : : shared_ptr < PointRefers > inst , std : : shared_ptr < const lib_token : : IToken > token ) {
inst - > addToken ( token ) ;
inst - > setSliceRefer ( token - > content ( ) ) ;
}
void point_ref_point_set ( std : : shared_ptr < PointRefers > inst , std : : shared_ptr < const lib_token : : IToken > token ) {
inst - > addToken ( token ) ;
inst - > setPointRefer ( token - > content ( ) ) ;
2024-07-28 08:37:31 +00:00
}
2025-02-07 15:26:20 +00:00
auto point_refer = ElementRule < PointRefers > ( u8 " point_refer " , ( int ) NovelNode : : PointRefers ) . reloadRule (
2024-07-28 08:37:31 +00:00
std : : make_shared < const Seqs > ( Rules {
2025-02-07 15:26:20 +00:00
MR ( PointRefers , leftb ) , MR ( PointRefers , refers ) , MR ( PointRefers , point_key ) ,
MER ( PointRefers , point_ref_story_set , name_text ) ,
MR ( PointRefers , split_mark ) ,
MER ( PointRefers , point_ref_slice_set , name_text ) ,
MR ( PointRefers , split_mark ) ,
MER ( PointRefers , point_ref_point_set , name_text ) } < <
2024-07-26 08:22:34 +00:00
OptR ( decl_expr ) < <
2025-02-07 15:26:20 +00:00
MR ( PointRefers , rightb )
) ) ;
void slice_nm_set ( std : : shared_ptr < FragmentSlice > inst , std : : shared_ptr < const lib_token : : IToken > token ) {
inst - > addToken ( token ) ;
inst - > setName ( token - > content ( ) ) ;
}
auto slice_define = ElementRule < FragmentSlice > ( u8 " slice_define " , ( int ) NovelNode : : FragmentSlice ) . reloadRule (
std : : make_shared < const Seqs > ( Rules {
MR ( FragmentSlice , leftb ) , MR ( FragmentSlice , slice_key ) , MER ( FragmentSlice , slice_nm_set , name_text ) } < <
OptMulR ( std : : make_shared < const Any > ( Rules { point_decl , point_refer , decl_expr } ) ) < <
MR ( FragmentSlice , rightb )
) ) ;
2024-05-02 11:11:03 +00:00
2024-07-28 08:37:31 +00:00
void story_nmset ( std : : shared_ptr < StoryDefine > inst , std : : shared_ptr < const lib_token : : IToken > token ) {
2025-02-07 15:26:20 +00:00
inst - > addToken ( token ) ;
2024-07-28 08:37:31 +00:00
inst - > setName ( token - > content ( ) ) ;
}
2025-02-07 15:26:20 +00:00
auto story_define = ElementRule < StoryDefine > ( u8 " story_define " , ( int ) NovelNode : : StoryDefine ) . reloadRule (
2024-07-28 08:37:31 +00:00
std : : make_shared < const Seqs > ( Rules {
MR ( StoryDefine , leftb ) , MR ( StoryDefine , story_key ) , MER ( StoryDefine , story_nmset , name_text ) } < <
2025-02-07 15:26:20 +00:00
OptMulR ( std : : make_shared < const Any > ( Rules { slice_define , decl_expr } ) ) < <
MR ( StoryDefine , rightb )
) ) ;
2024-03-17 07:58:28 +00:00
// ===================================================================
2024-07-28 08:37:31 +00:00
void article_nset ( std : : shared_ptr < ArticleDefine > inst , std : : shared_ptr < const lib_token : : IToken > token ) {
2025-02-07 15:26:20 +00:00
inst - > addToken ( token ) ;
2024-07-28 08:37:31 +00:00
inst - > setName ( token - > content ( ) ) ;
}
2025-02-07 15:26:20 +00:00
auto article_decl = ElementRule < ArticleDefine > ( u8 " article_define " , ( int ) NovelNode : : ArticleDefine ) . reloadRule (
2024-07-28 08:37:31 +00:00
std : : make_shared < const Seqs > ( Rules {
MR ( ArticleDefine , leftb ) , MR ( ArticleDefine , article_key ) , MER ( ArticleDefine , article_nset , name_text ) } < <
2025-02-07 15:26:20 +00:00
OptMulR ( std : : make_shared < const Any > ( Rules { point_refer , decl_expr } ) ) < <
MR ( ArticleDefine , rightb )
) ) ;
2024-07-12 09:35:35 +00:00
2024-07-28 08:37:31 +00:00
void volume_nset ( std : : shared_ptr < VolumeDefine > inst , std : : shared_ptr < const lib_token : : IToken > token ) {
2025-02-07 15:26:20 +00:00
inst - > addToken ( token ) ;
2024-07-28 08:37:31 +00:00
inst - > setName ( token - > content ( ) ) ;
}
2025-02-07 15:26:20 +00:00
auto volume_decl = ElementRule < VolumeDefine > ( u8 " volume_define " , ( int ) NovelNode : : VolumeDefine ) . reloadRule (
2024-07-28 08:37:31 +00:00
std : : make_shared < const Seqs > ( Rules {
MR ( VolumeDefine , leftb ) , MR ( VolumeDefine , volume_key ) , MER ( VolumeDefine , volume_nset , name_text ) } < <
2024-07-12 09:35:35 +00:00
OptMulR ( std : : make_shared < const Any > ( Rules { decl_expr , article_decl } ) ) < <
2025-02-07 15:26:20 +00:00
MR ( VolumeDefine , rightb )
) ) ;
2024-07-12 09:35:35 +00:00
2024-07-28 08:37:31 +00:00
void rank_set ( std : : shared_ptr < RankDeclare > inst , std : : shared_ptr < const lib_token : : IToken > token ) {
2025-02-07 15:26:20 +00:00
inst - > addToken ( token ) ;
2024-07-28 08:37:31 +00:00
inst - > setRank ( token - > content ( ) . toInt ( ) ) ;
}
2025-02-07 15:26:20 +00:00
auto rank_define = ElementRule < RankDeclare > ( u8 " rank_define " , ( int ) NovelNode : : RankDeclaration ) . reloadRule (
2024-07-28 08:37:31 +00:00
std : : make_shared < const Seqs > ( Rules {
MR ( RankDeclare , declare ) , MR ( RankDeclare , rank_key ) , MER ( RankDeclare , rank_set , numbers ) }
) ) ;
2024-07-12 09:35:35 +00:00
2025-02-07 15:26:20 +00:00
auto document_define = ElementRule < Document > ( u8 " decls-doc " , ( int ) NovelNode : : Document ) . reloadRule (
2024-07-12 09:35:35 +00:00
std : : make_shared < const Seqs > (
2025-02-07 15:26:20 +00:00
Rules {
std : : make_shared < const Rept > ( rank_define , 0 , 1 ) ,
MultiR ( std : : make_shared < const Any > ( Rules { story_define , volume_decl } ) )
2024-06-18 04:44:18 +00:00
}
2025-02-07 15:26:20 +00:00
) ) ;
//
//std::shared_ptr<const ExprRule> NovalSyntax::getParseTree() { return document_define; }
//std::shared_ptr<const ast_gen::SyntaxElement> NovalSyntax::tidy(std::shared_ptr<ast_gen::SyntaxElement> root, QList<std::shared_ptr<ast_gen::SyntaxElement>> children)
//{
// build_objecttree(root, children);
// node_register(root, children);
// return root;
//}
//void NovalSyntax::build_objecttree(std::shared_ptr<ast_gen::SyntaxElement> root, QList<std::shared_ptr<ast_gen::SyntaxElement>> children)
//{
// for (auto& cinst : children) {
// cinst->setParent(root);
//
// QList<std::shared_ptr<ast_gen::SyntaxElement>> child_items;
// for (auto& it : cinst->bindExpression()->children()) {
// auto const_it = std::dynamic_pointer_cast<const ast_gen::SyntaxElement>(it);
// child_items.append(std::const_pointer_cast<ast_gen::SyntaxElement>(const_it));
// }
//
// build_objecttree(cinst, child_items);
// }
//}
//void NovalSyntax::node_register(std::shared_ptr<const ast_gen::SyntaxElement> root, QList<std::shared_ptr<ast_gen::SyntaxElement>> children)
//{
// for (auto& child : children) {
// if (!child->isAnonymous()) {
// auto check_result = ast_gen::GlobalElement::UniquePtr->appendToCache(child);
// if (check_result)
// throw new SyntaxException(QString(u8"SyntaxError[0x0004]ϵͳ<CFB5> а <EFBFBD> <D0B0> <EFBFBD> ͬ<EFBFBD> <CDAC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڵ㣺%1<type<70> <65> %2>(%3,%4)")
// .arg(child->signature()).arg(child->typeMark()).arg(child->path()).arg(check_result->path()));
// }
//
// QList<std::shared_ptr<ast_gen::SyntaxElement>> next_child_items;
// for (auto& it : child->bindExpression()->children()) {
// auto const_it = std::dynamic_pointer_cast<const ast_gen::SyntaxElement>(it);
// next_child_items.append(std::const_pointer_cast<ast_gen::SyntaxElement>(const_it));
// }
//
// node_register(child, next_child_items);
// }
//}