Эта документация предназначена для моделей , которые используют языки OCL OCL. Подробная документация для инженеров языка, использующих или расширяющую язык OCL, расположена здесь . Мы рекомендуем, чтобы инженеры языка прочитали эту документацию, прежде чем читать подробную документацию.
ocl Bookshop {
context Shop s inv CustomerPaysBeforeNewOrder: // invariant
forall Customer c in s.customers: // quantifiers available
c.allowedToOrder implies !exists Invoice i in s.invoices:
i.buyer == c && i.moneyPayed < i.invoiceAmount ;
// Method specification for selling a book
context Invoice Stock.sellBook(String iban, int discountPercent, Customer c)
let availableBooks = // set comprehension
{ book | Book book in booksInStock, book.iban == iban }
pre: !availableBooks.isEmpty && // precondition
c.allowedToOrder;
post: let discount = (100 - discountPercent)/100; // postcondition, let
b = result.soldBook // result variable
in
!(b isin booksInStock) &&
booksInStock.size@pre == booksInStock.size + 1 && // @pre
result.invoiceAmount == b.price * discount;
}
Дополнительные примеры выражения (включая CommonexPressions Monticore):
a + 3*4; // number expressions
a >= b; a < 3; a == "myName"; // equalities
b implies (c && a) || d; // boolean expressions
forall a in S: foo(a) > 3; // quantifiers
exists a in S: foo(a) > 3;
a ?== b; c ?<= d // elvis operators (dealing with optionals)
S.first; S.size; S.addAll(T); // 30 operators for Lists
a in S; S.add(a); // + more for Sets
max(S) > 3; // + more for numbers
Текстовое представление OCL в основном зависит от определения в [Rum16, Rum17]. OCL используется для проверки правильности других моделей. Здесь, например, Book
и типы Customer
определены классовой диаграммой:
classdiagram Bookshop {
class Book {
String name;
String iban;
double cost;
double price;
}
class Shop;
association [1] Shop -> (invoices) Invoice [*];
association [1] Shop -> (customers) Customer [*];
class Stock {
void addBook(Book b);
Invoice sellBook(Book bookToSell, int discountPercent, Customer buyer);
}
association [1] Stock -> (booksInStock) Book [*];
class Customer {
String name;
String phoneNumber;
int customerNumber;
boolean allowedToOrder;
void payInvoice(double moneyWired, Invoice invoice);
}
class Invoice {
int invoiceNumber;
double invoiceAmount;
double moneyPayed;
}
association [1] Invoice <-> (buyer) Customer [1];
association [1] Invoice <-> (soldBook) Book [1];
}
В этом разделе описывается инструмент командной строки языка OCL. Инструмент предоставляет типичную функциональность, используемая при обработке моделей. Для этого это обеспечивает послушность для
Требования к построению и использованию инструмента OCL заключаются в том, что (по крайней мере) JDK 8 (JDK 11 и JDK 14 также официально поддерживаются нами), GIT и Gradle установлены и доступны для использования в Bash. Если вы используете Docker, вы также можете использовать контейнер Docker без установки Java, Git или Gradle.
В следующем подразделе описывается, как загрузить инструмент. Затем в этом документе описывается, как создать инструмент из исходных файлов. После этого этот документ содержит учебник для использования инструмента.
Готовую версию инструмента может быть загружена в форме исполняемого файла JAR. Вы можете использовать эту ссылку для загрузки инструмента.
В качестве альтернативы, вы можете скачать инструмент с помощью wget
. Следующая команда загружает последнюю версию инструмента и сохраняет его под названием MCOCL.jar
в вашем рабочем каталоге:
wget "monticore.de/download/MCOCL.jar" -O MCOCL.jar
Последняя версия изображения Docker инструмента может быть получена с помощью
docker pull monticore/ocl
Если вы используете Docker, замените java -jar MCOCL.jar
в следующем (для Windows PowerShell, Mac Terminal или Linux Bash)
docker run --rm -v ${PWD}:/input -w /input monticore/ocl
или (для командной строки Windows)
docker run --rm -v %CD%:/input -w /input monticore/ocl
Например, эта команда с шага 2 этого учебника
java -jar MCOCL.jar -i Example.ocl -pp
становится
docker run --rm -v ${PWD}:/input -w /input monticore/ocl -i Example.ocl -pp
При использовании Docker.
Можно создать исполняемую банку инструмента из исходных файлов, расположенных в GitHub. Ниже описывается процесс построения инструмента из исходных файлов с использованием Bash. Для создания исполняемой банки с Bash из исходных файлов, доступных в GitHub, выполните следующие команды.
Во -первых, клонировать репозиторий:
git clone https://github.com/MontiCore/ocl.git
Измените каталог на корневой каталог клонированных источников:
cd OCL
Затем создайте проект с помощью запуска (Информация: вам нужно установить Gradle для этого):
gradle build
Поздравляю! Теперь вы можете найти исполняемый файл JAR MCOCL.jar
в target/libs
(доступный через cd target/libs
).
В предыдущих разделах описывается, как получить исполняемый файл JAR (инструмент командной строки OCL). В этом разделе предоставлена учебное пособие по использованию инструмента OCL. Следующие примеры предполагают, что вы локально назвали инструмент MCOCL
. Если вы создаете инструмент из источников или использовали команду wget
выше, то все в порядке. Если вы загрузили инструмент вручную, то вам следует рассмотреть возможность переименования загруженной банки.
Выполнение файла JAR без каких -либо параметров печатает информацию об использовании
инструмент для консоли:
$ java -jar MCOCL.jar
usage: OCLTool
-c,--coco <arg> Checks the CoCos for the input. Optional
arguments are:
-c intra to check only the intra-model CoCos,
-c inter checks also inter-model CoCos,
-c type (default) checks all CoCos.
-cd4c,--cd4code Load symbol kinds from CD4C. Shortcut for loading
CDTypeSymbol as TypeSymbol,
CDMethodSignatureSymbol as FunctionSymbol, and
FieldSymbol as VariableSymbol. Furthermore,
warnings about not deserializing
CDAssociationSymbol and CDRoleSymbol will be
ignored.
-d,--dev Specifies whether developer level logging should
be used (default is false)
-fs,--functionSymbol <fqns> Takes the fully qualified name of one or more
symbol kind(s) that should be treated as
FunctionSymbol when deserializing symbol files.
Multiple symbol kinds should be separated by
spaces.
-h,--help Prints this help dialog
-i,--input <files> Processes the list of OCL input artifacts.
Argument list is space separated. CoCos are not
checked automatically (see -c).
-is,--ignoreSymKind <fqns> Takes the fully qualified name of one or more
symbol kind(s) for which no warnings about not
being able to deserialize them shall be printed.
Allows cleaner outputs. Multiple symbol kinds
should be separated by spaces.
-p,--path <directory> Sets the artifact path for imported symbols.
Directory will be searched recursively for files
with the ending ".*sym" (for example ".cdsym" or
".sym"). Defaults to the current folder.
-pp,--prettyprint <files> Prints the OCL model to stdout or the specified
file(s) (optional). Multiple files should be
separated by spaces and will be used in the same
order in which the input files (-i option) are
provided.
-s,--symboltable <files> Stores the symbol tables of the input OCL
artifacts in the specified files. For each input
OCL artifact (-i option) please provide one
output symbol file (using same order in which the
input artifacts are provided) to store its
symbols in. For example, -i x.ocl y.ocl -s
a.oclsym b.oclsym will store the symbols of x.ocl
to a.oclsym and the symbols of y.ocl to b.oclsym.
Arguments are separated by spaces. If no
arguments are given, output is stored to
'target/symbols/{packageName}/{artifactName}.ocls
ym'.
-ts,--typeSymbol <fqns> Takes the fully qualified name of one or more
symbol kind(s) that should be treated as
TypeSymbol when deserializing symbol files.
Multiple symbol kinds should be separated by
spaces.
-vs,--variableSymbol <fqns> Takes the fully qualified name of one or more
symbol kind(s) that should be treated as
VariableSymbol when deserializing symbol files.
Multiple symbol kinds should be separated by
spaces.
Чтобы правильно работать, инструмент нуждается в обязательном аргументе -i,--input <file>
, который берет пути файла, по крайней мере, одного входного файла, содержащего модели SD. Если другие аргументы не указаны, инструмент анализирует исключительно модели (ы).
Чтобы попробовать это, скопируйте MCOCL.jar
в каталог по вашему выбору. После этого создайте, содержащий следующий простой OCL:
ocl Example {
}
Сохраните текстовый файл как Example.ocl
в каталоге, где находится MCOCL.jar
.
Теперь выполните следующую команду:
java -jar MCOCL.jar -i Example.ocl
Вы можете заметить, что инструмент не печатает не вывод на консоли. Это означает, что инструмент успешно проанализировал файл Example.ocl
.
Инструмент обеспечивает довольно живопись для языка OCL. Можно использовать симпатичный Printer, например, для исправления форматирования файлов, содержащих OCL. Чтобы выполнить симпатичный Printer, может использоваться опция -pp,--prettyprint
. Используя опцию без каких-либо аргументов.
Выполнить следующую команду, чтобы попробовать это:
java -jar MCOCL.jar -i Example.ocl -pp
Команда печатает довольно напечатанную модель, содержащуюся в входном файле в консоли:
ocl Example {
}
Модель может быть довольно напечатать модели, содержащиеся в входных файлах для вывода файлов. Для этой задачи можно предоставить имена выходных файлов в качестве аргументов для -pp,--prettyprint
Option. Если предоставляются аргументы для выходных файлов, то количество выходных файлов должно быть равным количеству входных файлов. Входной файл I-TH довольно напечатан в выходной файл I-TH.
Выполнить следующую команду, чтобы попробовать это:
java -jar MCOCL.jar -i Example.ocl -pp Output.ocl
Команда печатает довольно напечатанную модель, содержащуюся в входном файле в файл Output.ocl
.
Для проверки условий контекста можно использовать опцию -c,--coco <arg>
. Использование этой опции без каких -либо аргументов проверяет, удовлетворяет ли модель все условия контекста.
Если вы заинтересованы только в том, чтобы проверить, удовлетворяет ли модель только подмножество условий контекста или вы хотите объяснить, что все условия контекста следует проверить, вы можете сделать это, дополнительно предоставив один из трех аргументов intra
, inter
и type
.
intra
только выполняет условия контекста, касающиеся нарушений условий внутримодельного контекста. Эти контекстные условия, например, проверяют соглашения об именах.inter
выполняет все условия внутримодельного контекста и дополнительно проверяет, определены ли имена типов в подписях конструктора.type
аргумента выполняет все контекст. Эти контекстные условия включают проверку, существуют ли используемые типы и методы. Поведение при использовании type
аргумента равна поведению по умолчанию при использовании аргументов.Выполнить следующую команду, чтобы попробовать простой пример:
java -jar MCOCL.jar -i Example.ocl -c -cd4c
Вы можете заметить, что инструмент ничего не печатает в консоли при выполнении этой команды. Это означает, что модель удовлетворяет всем контекстам.
Давайте теперь рассмотрим более сложный пример. Вспомните Bookshop
OCL из раздела An Example Model
выше. Для продолжения скопируют текстовое представление Bookshop
OCL и сохраните его в файле Bookshop.ocl
в каталоге, где находится файл MCOCL.jar
. Для этого вам понадобится файл символов, содержащий символы классовой диаграммы, соответствующей Bookshop.ocl
. Это будет объяснено более подробно в следующем разделе. На данный момент просто добавьте -p src/test/resources/docs/Bookshop/ -cd4c
в команду, чтобы использовать инструмент, где найти файл символов, подготовленный для этого примера и как его обработать.
Вы можете проверить различные виды условий контекста, используя опцию -c,--coco <arg>
:
java -jar MCOCL.jar -i Bookshop.ocl -p src/test/resources/docs/Bookshop/ -cd4c -c intra
java -jar MCOCL.jar -i Bookshop.ocl -p src/test/resources/docs/Bookshop/ -cd4c -c inter
java -jar MCOCL.jar -i Bookshop.ocl -p src/test/resources/docs/Bookshop/ -cd4c -c type
Ни одна из этих команд не должна создавать выход.
Чтобы увидеть ошибку, позволяет добавить ошибку в модель. Замените эту линию в Bookshop.ocl
{ book | Book book in booksInStock, book.iban == iban }
к
{ book2 | Book book in booksInStock, book.iban == iban }
Поскольку book2
не определен, инструмент должен теперь распечатать сообщение об ошибке при проверке кокоса:
$ java -jar MCOCL.jar -i Bookshop.ocl -p src/test/resources/docs/Bookshop/ -cd4c -c
[INFO] DeriveSymTypeOfExpression package suspected
[ERROR] 0xA0309 Bookshop.ocl:<13,12> Could not calculate type of expression "book2" on the left side of SetComprehension
Пожалуйста, не забудьте отменить «ошибку».
В этом разделе мы используем путь символа и предоставляем инструмент с помощью файла символа (хранимой таблицы символов) другой модели, которая содержит необходимую информацию типа.
Создайте новые mytypes
каталога в каталоге, где находится инструмент MCOCL.jar
. Например, пример Bookshop.ocl
из первого раздела требовал диаграммы класса, которая указала его дата. Вы можете найти этот файл диаграммы класса в SRC/Test/Resources/Docs/Bookshop/Bookshop.cd.
Чтобы использовать его в OCL, вам сначала необходимо преобразовать его информацию в файл символов. Symbol File Bookshop.sym
классовой диаграммы предоставляет всю необходимую информацию типа для использования его типов в OCL. Если вы не хотите участвовать в инструменте CD на этом этапе, вы также можете найти готовый к использованию файл в SRC/Test/Resources/Docs/Bookshop/Bookshop.sym. Просто скопируйте его в папку mytypes
. В противном случае, чтобы преобразовать диаграмму классов в файл символов, вам необходимо использовать MCCD.jar
из проекта CD4ANALISS и преобразовать файл диаграммы класса, используя следующую команду:
java -jar MCCD.jar -d false --fieldfromrole navigable -i src/test/resources/docs/Bookshop/Bookshop.cd -s mytypes/Bookshop.sym
Содержимое файла символов имеет незначительное значение для вас как пользователя языка. В случае, если вам любопытно и изучить файл символов: файл символа содержит представление JSON символов, определенных в модели. В этом случае файл символа содержит информацию о определенных типах. Обычно инструменты Monticore Languages автоматически генерируют содержимое этих файлов, и вы, как пользователь языка, не должны беспокоиться об их содержиморе.
Путь, содержащий структуру каталога, содержащая файл символа, называется «путь символа». Если мы предоставим путь символа к инструменту, он будет искать символы в файлах символов, которые хранятся в каталогах, содержащихся в пути символа. Таким образом, если мы хотим, чтобы инструмент нашел наш файл символов, мы должны предоставить путь модели для инструмента через опцию --path <directory>
. Вы можете попробовать это, используя только что созданную папку mytypes
:
java -jar MCOCL.jar -i Bookshop.ocl --path <SYMBOLPATH> -c type -cd4c
где <SYMBOLPATH>
- это путь, в котором вы хранили загруженный файл символов. В нашем примере, если вы сохранили модель в каталоге mytypes
, выполните следующую команду:
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type -cd4c
Обратите внимание, что эта команда также использует флаг -cd4c
. Чтобы интерпретировать символисты, предоставленные инструменту OCL, он должен понимать, как интерпретировать символы, хранящиеся инструментом CD. Флаг -cd4c
является сокращением для этого для CD4Code. Вы также можете сделать это вручную, используя флаги --typeSymbol
, --functionSymbol
и --variableSymbol
, за которыми следуют виды символов, которые следует интерпретировать как TypeSymbol
, FunctionSymbol
и VariableSymbol
:
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type --typeSymbol <TYPE_SYMBOL_KINDS> --variableSymbol <VAR_SYMBOL_KINDS> --functionSymbol <FUNC_SYMBOL_KINDS>
где <TYPE_SYMBOL_KINDS>
, <VAR_SYMBOL_KINDS>
и <FUNC_SYMBOL_KINDS>
являются полностью квалифицированными именами символов. Если вы хотите предоставить несколько типов символов, просто добавьте их, разделенные пространством. В нашем примере объявление символов от CD4analysis будет выглядеть так:
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type --typeSymbol de.monticore.cdbasis._symboltable.CDTypeSymbol --variableSymbol de.monticore.symbols.oosymbols._symboltable.FieldSymbol --functionSymbol de.monticore.cd4codebasis._symboltable.CDMethodSignatureSymbol
Обратите внимание, что сейчас инструмент дает много предупреждений о символах, которые нельзя интерпретировать. Не каждый символ разного языка может быть интересным в OCL. Чтобы подавить эти непреднамеренные предупреждения, вы можете сказать инструмент OCL, для которого виды символов вы не хотите получать их, используя опцию --ignoreSymKind <SYM_KINDS_TO_IGNORE>
. В нашем примере это будет выглядеть так:
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type --typeSymbol de.monticore.cdbasis._symboltable.CDTypeSymbol --variableSymbol de.monticore.symbols.oosymbols._symboltable.FieldSymbol --functionSymbol de.monticore.cd4codebasis._symboltable.CDMethodSignatureSymbol --ignoreSymKind de.monticore.cdassociation._symboltable.CDAssociationSymbol de.monticore.cdassociation._symboltable.CDRoleSymbol
Для повседневного использования это немного сложно. Так что помните, что флаг -cd4c
может уменьшить это только до
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type -cd4c
В предыдущем разделе описывается, как загружать символы из существующего файла символов. Теперь мы будем использовать инструмент для хранения файла символов для нашей модели Bookshop.ocl
. Файл сохраненного символа будет содержать информацию об объектах, определенных в файле OCL. Он может быть импортирован другими моделями для использования символов, представленных этими определениями объектов, аналогично тому, как мы изменили файл Bookshop.ocl
для импорта символов, содержащихся в файле символов Bookshop.sym
.
Используя опцию -s,-symboltable <file>
опция создает таблицы символов моделей ввода и хранит их в путях файлов, приведенных в качестве аргументов. Либо никаких путей файла не должно быть предоставлено, либо для каждой входной модели должен быть предоставлен один путь файла. Файл символа для модели I-TH ввода хранится в файле, определенном путем I-TH файла. Если вы не предоставляете никаких путей файла, инструмент хранит таблицу символов каждой входной модели в target/symbols/{packageName}/{fileName}.oclsym
, где packageName
является именем пакета, как указано в файле, содержащем Модель и fileName
- это имя файла, содержащего модель. Файл хранится по сравнению с рабочим каталогом, т. Е. Справочник, в котором вы выполняете команду для хранения файлов символов. Кроме того, пожалуйста, обратите внимание, что для правильного хранения символов модель должна быть хорошо сформирована во всех отношениях, и поэтому все условия контекста проверяются заранее.
Для хранения файла символов в Bookshop.ocl
выполните следующую команду (неявные проверки условий контекста требуются с использованием параметра пути символа):
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -cd4c -s
Инструмент создает target/symbols/docs/Bookshop.oclsym
, который теперь может быть импортирован другими моделями, например, моделями, которые необходимо использовать некоторые из объектов, определенных в Bookshop
файла OCL.
Для хранения файла символов Bookshop.ocl
в файле syms/Bookshop.oclsym
, например, выполнить следующую команду (опять же, проверки неявных контекстов требуют, используя опцию пути символа):
java -jar MCOCL.jar -i Bookshop.ocl -path mytypes -cd4c -s syms/Bookshop.oclsym
Поздравляю, вы только что закончили учебник о сохранении файлов символов SD!