You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
193 lines
7.0 KiB
193 lines
7.0 KiB
/**
|
|
* @file mark_question_colon.cpp
|
|
*
|
|
* @author Guy Maurel
|
|
* @license GPL v2+
|
|
*/
|
|
|
|
#include "mark_question_colon.h"
|
|
|
|
#include "chunk.h"
|
|
#include "combine_tools.h"
|
|
#include "log_levels.h"
|
|
|
|
|
|
/*
|
|
* Issue #3558
|
|
* will be called if a ? (CT_QUESTION) chunk is encountered
|
|
* return the chunk colon if found or Chunk::NullChunkPtr
|
|
* if a ; (CT_SEMI_COLON) chunk is found
|
|
*/
|
|
Chunk *search_for_colon(Chunk *pc_question)
|
|
{
|
|
Chunk *pc2 = pc_question->GetNextNcNnl();
|
|
bool colon_found = false;
|
|
|
|
LOG_FMT(LCOMBINE, "%s(%d): pc_question.orig line is %zu, orig col is %zu, level is %zu, Text() is '%s'\n",
|
|
__func__, __LINE__, pc_question->GetOrigLine(), pc_question->GetOrigCol(), pc_question->GetLevel(),
|
|
pc_question->Text());
|
|
|
|
// examine the next tokens, look for E2, E3, COLON, might be for a next CT_QUESTION
|
|
while (pc2->IsNotNullChunk())
|
|
{
|
|
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() is '%s'\n",
|
|
__func__, __LINE__, pc2->GetOrigLine(), pc2->GetOrigCol(), pc2->GetLevel(), pc2->Text());
|
|
|
|
if ( pc2->Is(CT_SEMICOLON)
|
|
|| ( pc2->Is(CT_PAREN_CLOSE)
|
|
&& (pc_question->GetLevel() == pc2->GetLevel() + 1))
|
|
|| pc2->Is(CT_COMMA))
|
|
{
|
|
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() is '%s'\n",
|
|
__func__, __LINE__, pc2->GetOrigLine(), pc2->GetOrigCol(), pc2->GetLevel(), pc2->Text());
|
|
pc2->SetFlagBits(PCF_IN_CONDITIONAL);
|
|
log_pcf_flags(LCOMBINE, pc2->GetFlags());
|
|
|
|
if (colon_found)
|
|
{
|
|
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() is '%s'\n",
|
|
__func__, __LINE__, pc2->GetOrigLine(), pc2->GetOrigCol(), pc2->GetLevel(), pc2->Text());
|
|
pc_question->SetParent(pc2); // back again
|
|
|
|
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() is '%s'\n",
|
|
__func__, __LINE__, pc2->GetOrigLine(), pc2->GetOrigCol(), pc2->GetLevel(), pc2->Text());
|
|
return(pc2);
|
|
}
|
|
else
|
|
{
|
|
pc2->SetParent(pc_question); // save the question token
|
|
pc_question->SetParent(pc2); // back again
|
|
}
|
|
}
|
|
else if (pc2->Is(CT_COMMA))
|
|
{
|
|
// TODO: is it necessary?
|
|
}
|
|
else if (pc2->Is(CT_QUESTION))
|
|
{
|
|
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() is '%s'\n",
|
|
__func__, __LINE__, pc2->GetOrigLine(), pc2->GetOrigCol(), pc2->GetLevel(), pc2->Text());
|
|
pc2 = search_for_colon(pc2);
|
|
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() is '%s'\n",
|
|
__func__, __LINE__, pc2->GetOrigLine(), pc2->GetOrigCol(), pc2->GetLevel(), pc2->Text());
|
|
continue;
|
|
}
|
|
else if (pc2->Is(CT_COND_COLON))
|
|
{
|
|
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() is '%s'\n",
|
|
__func__, __LINE__, pc2->GetOrigLine(), pc2->GetOrigCol(), pc2->GetLevel(), pc2->Text());
|
|
|
|
if (colon_found)
|
|
{
|
|
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() is '%s'\n",
|
|
__func__, __LINE__, pc2->GetOrigLine(), pc2->GetOrigCol(), pc2->GetLevel(), pc2->Text());
|
|
Chunk *pr = pc2->GetPrevNcNnl();
|
|
return(pr);
|
|
}
|
|
else
|
|
{
|
|
pc2->SetParent(pc_question); // save the question token
|
|
pc_question->SetParent(pc2); // back again
|
|
colon_found = true;
|
|
}
|
|
|
|
if (pc2->Is(CT_COLON))
|
|
{
|
|
if (colon_found)
|
|
{
|
|
return(pc2);
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
}
|
|
else if (pc2->Is(CT_COLON))
|
|
{
|
|
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() is '%s'\n",
|
|
__func__, __LINE__, pc2->GetOrigLine(), pc2->GetOrigCol(), pc2->GetLevel(), pc2->Text());
|
|
|
|
if (colon_found)
|
|
{
|
|
pc2->SetType(CT_COND_COLON);
|
|
return(pc2);
|
|
}
|
|
else
|
|
{
|
|
// E2 found orig line is 23, orig col is 3
|
|
pc2->SetType(CT_COND_COLON);
|
|
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() is '%s'\n",
|
|
__func__, __LINE__, pc2->GetOrigLine(), pc2->GetOrigCol(), pc2->GetLevel(), pc2->Text());
|
|
pc2->SetParent(pc_question); // save the question token
|
|
pc_question->SetParent(pc2); // back again
|
|
|
|
// look for E3
|
|
colon_found = true;
|
|
}
|
|
}
|
|
pc2 = pc2->GetNextNcNnl();
|
|
}
|
|
|
|
if (pc2->IsNotNullChunk())
|
|
{
|
|
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() is '?'\n",
|
|
__func__, __LINE__, pc2->GetOrigLine(), pc2->GetOrigCol(), pc2->GetLevel());
|
|
}
|
|
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() is '?'\n",
|
|
__func__, __LINE__, pc2->GetOrigLine(), pc2->GetOrigCol(), pc2->GetLevel());
|
|
return(pc2);
|
|
} // search_for_colon
|
|
|
|
|
|
void mark_question_colon()
|
|
{
|
|
LOG_FUNC_ENTRY();
|
|
Chunk *pc = Chunk::GetHead();
|
|
Chunk *pc_question;
|
|
|
|
// Issue #3558
|
|
while (pc->IsNotNullChunk())
|
|
{
|
|
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() '%s'\n",
|
|
__func__, __LINE__, pc->GetOrigLine(), pc->GetOrigCol(), pc->GetLevel(), pc->Text());
|
|
log_pcf_flags(LCOMBINE, pc->GetFlags());
|
|
|
|
if ( pc->Is(CT_QUESTION)
|
|
&& !language_is_set(LANG_JAVA))
|
|
{
|
|
pc_question = pc;
|
|
// look for E2, COLON, E3...
|
|
pc = search_for_colon(pc);
|
|
|
|
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() is '%s'\n",
|
|
__func__, __LINE__, pc->GetOrigLine(), pc->GetOrigCol(), pc->GetLevel(), pc->Text());
|
|
|
|
if ( pc->Is(CT_SEMICOLON)
|
|
|| ( pc->Is(CT_PAREN_CLOSE)
|
|
&& (pc_question->GetLevel() == pc->GetLevel() + 1))
|
|
|| pc->Is(CT_COMMA))
|
|
{
|
|
// set at the end of the question statement ...
|
|
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() is '%s'\n",
|
|
__func__, __LINE__, pc->GetOrigLine(), pc->GetOrigCol(), pc->GetLevel(), pc->Text());
|
|
// ... and go on
|
|
}
|
|
}
|
|
pc = pc->GetNextNcNnl();
|
|
}
|
|
|
|
for (pc = Chunk::GetHead(); pc->IsNotNullChunk(); pc = pc->GetNextNcNnl())
|
|
{
|
|
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() '%s'\n",
|
|
__func__, __LINE__, pc->GetOrigLine(), pc->GetOrigCol(), pc->GetLevel(), pc->Text());
|
|
|
|
if (pc->Is(CT_QUESTION))
|
|
{
|
|
Chunk *from = pc;
|
|
Chunk *to = pc->GetParent();
|
|
flag_series(from, to, PCF_IN_CONDITIONAL);
|
|
pc = to;
|
|
}
|
|
}
|
|
} // mark_question_colon
|