some work on a 'program mode'

git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1136 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
2018-10-30 20:59:17 +00:00
parent c825c85878
commit a6b767a223
4 changed files with 34 additions and 28 deletions

View File

@@ -886,9 +886,9 @@ int c;
}
void PatternParser::CreateTreeReadDirectiveExpression(Item & item, wchar_t starting_terminator, wchar_t ending_terminator)
void PatternParser::CreateTreeReadDirectiveExpression(Item & item, bool is_statement)
{
long terminator_counter = 1;
int brackets_counter = is_statement ? 1 : 0;
while( *itext )
{
@@ -897,19 +897,25 @@ void PatternParser::CreateTreeReadDirectiveExpression(Item & item, wchar_t start
if( c == 10 || c == 13 )
c = ' ';
if( c == starting_terminator )
if( c == ';' && brackets_counter == 0 )
{
terminator_counter += 1;
itext += 1;
return; // end of normal expression (not in a statement such as 'for' or 'if')
}
if( c == ending_terminator )
if( c == '(' )
{
terminator_counter -= 1;
brackets_counter += 1;
}
if( terminator_counter == 0 )
if( c == ')' )
{
brackets_counter -= 1;
if( is_statement && brackets_counter == 0 )
{
itext += 1;
return; // end of expression;
return; // end of statement expression
}
}
@@ -923,6 +929,8 @@ void PatternParser::CreateTreeReadDirectiveExpression(Item & item, wchar_t start
bool PatternParser::CreateTreeCheckProgramDirective(Item & item)
{
const wchar_t * old_itext = itext;
if( PT::IsSubStringNoCasep(L"if", itext) )
{
itext += 2;
@@ -934,11 +942,6 @@ bool PatternParser::CreateTreeCheckProgramDirective(Item & item)
item.type = Item::item_if;
return true;
}
else
{
item.type = Item::item_err;
return false;
}
}
if( PT::IsSubStringNoCasep(L"while", itext) )
@@ -952,13 +955,9 @@ bool PatternParser::CreateTreeCheckProgramDirective(Item & item)
item.type = Item::item_for;
return true;
}
else
{
item.type = Item::item_err;
return false;
}
}
itext = old_itext;
return false;
}
@@ -986,15 +985,12 @@ bool PatternParser::CreateTreeReadExpression(Item & item)
if( CreateTreeCheckProgramDirective(item) )
{
CreateTreeReadDirectiveExpression(item, '(', ')');
CreateTreeReadDirectiveExpression(item, true);
}
else
{
if( item.type == Item::item_err )
return false;
item.type = Item::item_function;
CreateTreeReadDirectiveExpression(item, 0, ';');
CreateTreeReadDirectiveExpression(item, false);
}
return true;