Наверх

Пред. След.

 

 

Оператор 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

 

 

Хостинг от uCoz