Министерство Образования и Науки Российской Федерации
Санкт-Петербургский Электротехнический Университет “ЛЭТИ ”
Кафедра МО ЭВМ
Описание входного языка
Вариант 18
Выполнил ст.гр.3351 Смирнов Е.А.
Проверил Лукина О.С.
Санкт-Петербург
2006 г.
Описание синтаксиса входного языка
<Programm>::={<ImportStatement>}<ClassDeclaration>
<ImportStatement>::=import <Identifier>.class;
<ClassDeclaration>::=class<Identifier><ClassBody>
<ClassBody>::={{<ClassBodyDeclarations>}}
<ClassBodyDeclaration>::=<FieldDeclaration> | <MethodDeclaration>
<FieldDeclaration>::=<Type><VariableDeclarator>;
<VariableDeclarator>::= <Identifier>|<Identifier>=<VariableInitializer>
<VariableInitializer>::= <IntegerNumber> | <FloatNumber> | <Char> |
<StringInitializer> | <ExpressionR> | <ObjectCreationExpression> | null
<ObjectCreationExpression>::=new <StructType> ()
<MethodDeclaration>::=<MethodHeader><MethodBody> | void main()<MethodBody>
<MethodHeader>::=<ResultType><MethodDeclorator>
<ResultType>::=<Type> | void
<Type>::=<BasicType> | <StructType>
<BasicType>::= int | float | char
<StructType>::= String | <Identifier>
<MethodDeclorator>::=<Identifier>([<FormalParameterList>])
<FormalParameterList>::=<FormalParameter>{,<FormalParameter>}
<FormalParameter>::=<Type><Identifier>
<MethodBody>::={{<BlockStatements>}}
<BlockStatement>::=<VariableDeclarator>|<Block>
<Block>::=<CompStatement> | <SimpleStatement>
<CompStatement>::={<SimpleStatement>{<SimpleStatement>}}
<SimpleStatement>::= If (<ParExpression>) <Block> [ else <Block>] |
while (<ParExpression>) <Block> |
return [<ExpressionR>]; |
<StatementExpression>;
<StatementExpression>::=<Assignment> | <CondAssignment> |
<PostIncrementExpression> | <PostDecrementExpression> |
<MethodInvocation> |
<Output> | <Input> |
<Label> | <gotoLabel>
<Label>::= <Identifier>:
<gotoLabel>::= goto <Identifier>;
<ParExpression>::=<ExpressionR><RelationOperator><ExpressionR> | equal(<ExpressionR>,<ExpressionR>)
<PostIncrementExpression>::=<Identifier>++
<PostDecrementExpression>::=<Identifier>--
<Assignment>::=<ExpressionL> = <ExpressionR>;
<CondAssignment>::= (<ParExpression>)? <ExpressionR>: <ExpressionR>;
<ExpressionL>::=<Identifier>{.<Identifier>}
<ExpressionR>::=<ExpressionR>+T | <ExpressionR>-T | <T>
<T>::=<T>*<P> | <T>/<P> | <P>
<P>::=(<ExpressionR>) | <Identifier> | <MethodInvokation> | <PostIncrementExpression> |
<PostDecrementExpression> | <Constant> | <ExpressionL> | <MethodInvokation>
<MethodInvokation>::=<Identifier>([<FactParameterList>]) |
length(<ExpressionR>)|
concat(<ExpressionR>,<ExpressionR>) |
replace(<ExpressionR>, <ExpressionR>, <ExpressionR>)|
find(<ExpressionR>, <ExpressionR>) |
substring(<ExpressionR>, <DigitSequence>, <DigitSequence>)
<FactParameterList>::=<FactParameter>{,<FactParameter>}
<FactParameter>::=<ExpressionR> | <Identifier>
<RelationOperator>::= < | > | <= | >= | == | !=
<Identifier>::=<Symbol> {<SymDig>}
<SymDig>::= <Symbol> | <Digit>
<Sign>::= -|+
<IntegerNumber>::=[<Sign>]<DigitSequence>
<FloatNumber>::=[<Sign>]<DigitSequence>.<DigitSequence>[EFloat]
<EFloat>::= E[<Sign>]<DigitSequence>
<Constant>::=<IntegerNumber> | <FloatNumber> | <Char> | <StringExpr>
<DigitSequence>::=<Digit> {<Digit>}
<Digit>::=1|2|3|4|5|6|7|8|9|0
<StringExpr>::=“{<SymDig>}”
<Symbol>::=a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | w | x | y | z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | W | X | Y | Z | _
<Char>::=’<Symbol>’
<Input>::=<ExpressionL> = read();
<Output>::=write(<OutputList>);
<OutputList>::=<ExpressionR>[#<DigitSequence>]{, <ExpressionR>[#<DigitSequence>]}
Задание
Базовый язык – Java.
Базовые типы: целый, вещественный, символьный.
Структурированный тип: символьная строка.
Операции над строками: определение длины строки, конкатенация строк, замена подстроки в строке, поиск подстроки в строке, доступ к подстроке.
Дополнительные требования: функции, оператор new, операции ++, --, условный оператор присваивания.
Оператор цикла – с предусловием.
Перегрузка операций - разрешается.
Эквивалентность типов – структурная.
Класс грамматик – грамматики операторного предшествования.
Промежуточный язык – триады.
Семантика языка
Программа представляет собой множество пользовательских типов данных (далее - классов), находящихся в одном каталоге и связанных включением (import), один из которых обязательно имеет функцию-член с сигнатурой void main(). В каждом файле может быть описан только один класс. Класс имеет поля, которые могут быть членами-данными встроенных или же определяемых пользователем типов (разработанных классов) или членами-функциями (далее - просто функциями). Инициализация члена-данного может быть осуществлена во время объявления этого члена-данного. Поля класса должны иметь уникальные имена. Переменные, объявленные внутри одно блока должны иметь уникальные имена. Областью видимости локальной переменной является блок. Локальные переменные объявленные внутри блока перекрывают переменные с теми же именами, объявленными вне этого блока. Имя формально параметра функции также перекрывает имя переменной, объявленной как член-данное класса. Время жизни неименованных переменных (используемых в выражениях) ограничивается временем вычисления результата выражения. Время жизни локальной переменной ограничивается блоком, в котором она была определена.