Оператор
PRINT.
Введем оператор вывода на экран. БНФ будет такой:
<Программа>:=<Поток операторов>
<Поток операторов>:=[<Оператор><;>]
<Оператор>:=<Присваивание>|<Вывод>
<Присваивание>:=<Переменная>=<Вычисленное выражение>
<Вывод>:=<PRINT>(<Вычисленное выражение>)
<Вычисленное выражение>:=<Expr2>
<expr2> := <expr1> {<бинарная, логическая><expr1>}
<expr1> := <expr> {<операция сравнения><expr>}
<expr> := <term>
{<add_op><term>}
<term> :=
<signed_factor>{<mul_op><signed_factor>}
<signed_factor> := [<add_op или лог-е отрицание>]<factor>
<factor> :=
<float>|”<string>”|(<expr2>)|<funcname>([<expr2>{,<expr2>}])
|<Переменная>
Теперь – не вся программа, а ее основной кусок, содержащий почти все изменения. Есть еще изменения в функции обработки ошибок, но это несущественно, поэтому их я не привожу.
void OutPut()
{
NextLexema();
/***************/
if(*Lex==40) /* Если скобка */
{
NextLexema();
expr2();
PostFix(Res,dest);
if(*Lex!=41)
{
*Res=0;
ErrorLex(14);
/*WrStr("Error.txt",End,"ERROR - No 2-nd bracket in
PRINT",1); */
return;
}
else
{
/*WrStr("ResultPRINT.txt",End,dest,1);*/ /* Это - главное действие оператора */
if(*dest==34)
{
printf("%s\n",dest+1);
}
else
{
printf("%s\n",dest);
}
NextLexema();
if(*Lex!=59)
{
ErrorLex(15);
return;
/*WrStr("Error.txt",End,"No ; after PRINT(...)",1);
*/
/*NextLexema();*/
}
}
}
}
void Operators() /* Это - собственно оператор (присваивания и др) */
{
if(COMPstr(Lex,"PRINT")==0)
{
OutPut();
return;
}
Assignment();
}
Это кусок проекта из папки Gramm92_001