// Имя {"(" Выраж | Тип ")"} | Число | "(" Выраж ")" 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); }
// Переменная = Имя 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(); } }