Beispiel #1
0
// Имя {"(" Выраж | Тип ")"} | Число | "(" Выраж ")"
    static tType Factor()
    {
        Obj   X;
        tType T = tType.None;

        if (Scan.Lex == tLex.lexName)
        {
            if ((X = Table.Find(Scan.Name)).Cat == tCat.Var)
            {
                Gen.Addr(X); //Адрес переменной
                Gen.Cmd(OVM.cmLoad);
                Scan.NextLex();
                return(X.Type);
            }
            else if (X.Cat == tCat.Const)
            {
                Gen.Const(X.Val);
                Scan.NextLex();
                return(X.Type);
            }
            else if (X.Cat == tCat.StProc &&
                     X.Type != tType.None)
            {
                Scan.NextLex();
                Check(tLex.lexLPar, "\"(\"");
                T = StFunc(X.Val);
                Check(tLex.lexRPar, "\")\"");
            }
            else
            {
                Error.Expected(
                    "переменная, константа или процедура-функции"
                    );
            }
        }
        else if (Scan.Lex == tLex.lexNum)
        {
            Gen.Const(Scan.Num);
            Scan.NextLex();
            return(tType.Int);
        }
        else if (Scan.Lex == tLex.lexLPar)
        {
            Scan.NextLex();
            T = Expression();
            Check(tLex.lexRPar, "\")\"");
        }
        else
        {
            Error.Expected("имя, число или \"(\"");
        }
        return(T);
    }
Beispiel #2
0
// Переменная = Имя
    static void Variable()
    {
        Obj X;

        if (Scan.Lex != tLex.lexName)
        {
            Error.Expected("имя");
        }
        else
        {
            if ((X = Table.Find(Scan.Name)).Cat != tCat.Var)
            {
                Error.Expected("имя переменной");
            }
            Gen.Addr(X);
            Scan.NextLex();
        }
    }