From: Ebersold Date: Tue, 12 Apr 2022 21:24:32 +0000 (+0200) Subject: Constant init prototype working X-Git-Url: https://git.ebersold.fr/?a=commitdiff_plain;ds=sidebyside;p=parser%2Flds.git Constant init prototype working --- diff --git a/libgen/gen_lpcm_aac.cpp b/libgen/gen_lpcm_aac.cpp index e831bbe..bddf9c5 100644 --- a/libgen/gen_lpcm_aac.cpp +++ b/libgen/gen_lpcm_aac.cpp @@ -88,8 +88,10 @@ void GenAac::genType(std::ostream &os,const aeb::lds::Type *t) { switch (t->getTypeID()) { - case aeb::lds::Type::IntegerTyID : t->printNative(os); break; case aeb::lds::Type::ArrayTyID : t->printNative(os); break; + os<<"char *"; + break; + case aeb::lds::Type::IntegerTyID : t->printNative(os); break; default: os<<"long"; } @@ -399,6 +401,24 @@ void GenAac::gen_class_impl_ctors(std::ostream &os) ; vit != m_Variables.end() ; ++vit) { + aeb::lds::GlobalVariable *V = vit->second; + if (V->getInitializer() != NULL ) + { + switch (V->getType()->getTypeID()) + { + case aeb::lds::Type::ArrayTyID : + os<<" m_Globals["<first<<"].set_String(\""<getInitializer()->getName().c_str()<<"\");\n"; + break; + case aeb::lds::Type::IntegerTyID : + { + aeb::lds::ConstantInt *c = reinterpret_cast(V->getInitializer()); + os<<" m_Globals["<first<<"].set_Integer("<getValue()<<");\n"; + } + break; + default: + os<<" m_Globals["<first<<"].set_Integer("<getInitializer()<<");\n"; + } + } } os<<"}"<second; + if (V->isConstant()) + { + act<<"/* "<first<<" "<first<<" "<expr = new AST::StringLiteral(yytext,NULL); \ return x; \ } -#define CHAINE_TOK(x) { AST::StringLiteral *s = new AST::StringLiteral(string_begin,NULL); \ - yylval->expr = s; \ +#define CHAINE_TOK(x) { char k = *(yytext ); *(yytext )='\0'; \ + AST::StringLiteral *s = new AST::StringLiteral(string_begin,NULL); \ + yylval->expr = s; \ + *(yytext ) = k; \ s->isConstantArray = true; return x; } #define NUM_TOK(x) { yylval->num = atol(yytext); return x; } #else #define TOK(x) { return x; } #define STR_TOK(x) { yylval->expr = new AST::StringLiteral(yytext,NULL); return x; } -#define CHAINE_TOK(x) { AST::StringLiteral *s = new AST::StringLiteral(string_begin,NULL); \ +#define CHAINE_TOK(x) { char k = *(yytext) ; *(yytext) = '\0'; \ + AST::StringLiteral *s = new AST::StringLiteral(string_begin,NULL); \ yylval->expr = s; \ + *yytext = k; \ s->isConstantArray = true; return x; } #define NUM_TOK(x) { yylval->num = atol(yytext); return x; } #endif @@ -119,7 +123,7 @@ integer_name {digit}* "'" { BEGIN(CHARSTRING); - string_begin = yytext; + string_begin = yytext + 1 ; } %{ /* COMMENT */ diff --git a/libparser/lds.y b/libparser/lds.y index 0c22818..176a7f5 100644 --- a/libparser/lds.y +++ b/libparser/lds.y @@ -372,6 +372,9 @@ void close_log() { %name-prefix="lds_" %pure-parser +// Needs changes if setup +//%define api.prefix {lds_} +//%define api.pure %lex-param {yyscan_t *scanner} %parse-param {yyscan_t scanner} @@ -826,7 +829,7 @@ variables_sort: variable_names sort { | variable_names sort T_ASSIGN expression { AST::Type *sort = dynamic_cast($2); /* Be sure expression is a constant expression or else exit */ - LDS_LOG_INFO("variables_sort: TODO add initExpression"); + //LDS_LOG_ERROR("variables_sort: TODO add initExpression"); if (sort != NULL) { /* IDENTIFIER Is the Type*/ @@ -836,7 +839,7 @@ variables_sort: variable_names sort { for (std::vector::iterator sit = a->begin(); sit != a->end() ; ++sit) { AST::StringLiteral *s = (*sit); - // LDS_LOG_INFO("variables_sort: got 1 variable %s type:%s",s->getString().c_str(),sort->getString().c_str()); + //LDS_LOG_ERROR("variables_sort: got 1 variable %s type:%s",s->getString().c_str(),sort->getTypeClassName()); AST::VarDecl *v =ldsp->create_variable(m_CurrentDC,m_RootTranslationUnit,(*sit),sort); v->setInit($4); m_CurrentDC->addDecl(v); @@ -1083,8 +1086,10 @@ default_initialization: T_DEFAULT T_NUMBER { | T_DEFAULT T_CHARSTRING { LDS_LOG_INFO("default_initialization: string "); AST::Type &Char = m_RootTranslationUnit->getASTContext().CharTy; - AST::Type &CharArray = m_RootTranslationUnit->getASTContext().getConstantArrayType(&Char,strlen($1)+1 ); - $$ = new AST::StringLiteral($1,&CharArray); + AST::Type &CharArray = m_RootTranslationUnit->getASTContext().getConstantArrayType(&Char + ,strlen($2->getString().c_str())+1 ); + $2->setType(&CharArray); + $$ = $2; } ; @@ -1436,6 +1441,7 @@ choice_of_sort: T_IDENTIFIER sort end { operation_signatures: /* Empty*/ | T_OPERATORS operation_list { + LDS_LOG_ERROR("operation_signatures: operator lists TODO"); } ; @@ -1462,6 +1468,7 @@ operation_name: T_IDENTIFIER { op_arguments: T_LPARENTHESES arguments T_RPARENTHESES { /* see 101 Pg 42 this is a */ + $$ = $2; } | T_LPARENTHESES T_RPARENTHESES { $$ = NULL; @@ -1500,10 +1507,6 @@ op_result: T_RESULT sort { LDS_LOG_INFO("op_result: sort %s ",$2->getTypeClassName() ); } ; -opt_task_definition: /**/ - | task_definitions { - } -; task_definitions: task { LDS_LOG_DEBUG("task_definitions: begin Stack size: " F_SIZE,m_StackDC.size()); @@ -2544,8 +2547,9 @@ primary: T_LPARENTHESES expression T_RPARENTHESES { } | T_CHARSTRING { LDS_LOG_DEBUG("primary: Constant string %s",$1->getString().c_str()); - AST::Type &Char = m_RootTranslationUnit->getASTContext().CharTy; - AST::Type &CharArray = m_RootTranslationUnit->getASTContext().getConstantArrayType(&Char,strlen($1)+1 ); + AST::Type &Char = m_RootTranslationUnit->getASTContext().StringTy; + AST::Type &CharArray = m_RootTranslationUnit->getASTContext().getConstantArrayType(&Char,strlen($1->getString().c_str())+1 ); + $1->setType(&CharArray); $$ = $1; } | imperative_expression { @@ -2684,7 +2688,7 @@ value_returning_proc_call: action_name actual_parameters { //$$ = act; //m_StackDC.pop(); - //* NEW */ + /* NEW */ if (fct->isNew() && args) { @@ -2756,12 +2760,12 @@ conditional_expression: T_TEST primary { ; primary_list: primary { - LDS_LOG_INFO("primary_list : TODO"); + LDS_LOG_INFO("primary_list : Create ExprArray"); $$ = new ExprArray(); $$->push_back($1); } | primary_list T_COMMA primary { - LDS_LOG_INFO("primary_list : TODO"); + LDS_LOG_INFO("primary_list : Add primary To Primary Array"); $$->push_back($3); } ; diff --git a/libparser/lds_parser.cpp b/libparser/lds_parser.cpp index 7adfcb3..41c6aeb 100644 --- a/libparser/lds_parser.cpp +++ b/libparser/lds_parser.cpp @@ -337,7 +337,7 @@ parser::function_complete(AST::DeclContext *m_CurrentDC,AST::TranslationUnitDecl /* Lookup has already be perfomed at primary level Its a constant String */ LOG_ERROR("fonction_complete: action simple function call %s StringLiteral parameter %s" , fct->getName().c_str(),it->getString().c_str()); - /* Parameter is string Literral Not always true */ + /* Parameter is string Literal Not always true */ AST::Type * vTy = &tu->getASTContext().StringTy; /* May be find a global constant ... or something like that */ AST::DeclContext::lookup_result r = m_CurrentDC->lookup(it->getString()); diff --git a/libparser/lds_parser.h b/libparser/lds_parser.h index 50e2738..0c2db35 100644 --- a/libparser/lds_parser.h +++ b/libparser/lds_parser.h @@ -80,6 +80,11 @@ namespace lds { */ void function_complete(AST::DeclContext *DC,AST::TranslationUnitDecl *tu,AST::FunctionDecl *fct,AST::ParenListExpr *args); + /** + * Somehow I need to process actual parameters to see + * what it is and return the appropriate expression. + * Mainly because of constant + */ protected: static parser *m_parser; ListenerList m_listeners;