Dokumentasi ini ditujukan untuk para pemodel yang menggunakan bahasa OCCE OCL. Dokumentasi terperinci untuk insinyur bahasa menggunakan atau memperluas bahasa OCL terletak di sini . Kami merekomendasikan agar insinyur bahasa membaca dokumentasi ini sebelum membaca dokumentasi terperinci.
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;
}
Contoh ekspresi lebih lanjut (termasuk komonekspresi 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
Representasi OCL tekstual sebagian besar bergantung pada definisi dalam [rum16, rum17]. OCL digunakan untuk memeriksa kebenaran model lain. Di sini, jenis Book
dan Customer
, misalnya, ditentukan oleh diagram kelas:
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];
}
Bagian ini menjelaskan alat baris perintah dari bahasa OCL. Alat ini menyediakan fungsi khas yang digunakan saat memproses model. Untuk efek ini, ini memberikan fungsionalitas untuk
Persyaratan untuk membangun dan menggunakan alat OCL adalah bahwa (setidaknya) JDK 8 (JDK 11 dan JDK 14 juga secara resmi didukung oleh kami), GIT, dan Gradle dipasang dan tersedia untuk digunakan dalam bash. Jika Anda menggunakan Docker, Anda juga dapat menggunakan wadah Docker tanpa memasang java, git, atau lulusan.
Subbagian berikut menjelaskan cara mengunduh alat. Kemudian, dokumen ini menjelaskan cara membangun alat dari file sumber. Setelah itu, dokumen ini berisi tutorial untuk menggunakan alat ini.
Versi alat yang siap digunakan dapat diunduh dalam bentuk file jar yang dapat dieksekusi. Anda dapat menggunakan tautan unduhan ini untuk mengunduh alat ini.
Atau, Anda dapat mengunduh alat menggunakan wget
. Perintah berikut mengunduh versi terbaru dari alat ini dan menyimpannya dengan nama MCOCL.jar
di direktori kerja Anda:
wget "monticore.de/download/MCOCL.jar" -O MCOCL.jar
Versi terbaru dari gambar Docker Tools dapat diperoleh menggunakan
docker pull monticore/ocl
Jika Anda menggunakan Docker, ganti java -jar MCOCL.jar
sebagai berikut oleh (untuk Windows Powershell, Mac Terminal, atau Linux Bash)
docker run --rm -v ${PWD}:/input -w /input monticore/ocl
atau (untuk baris perintah windows)
docker run --rm -v %CD%:/input -w /input monticore/ocl
Misalnya, perintah ini dari langkah 2 tutorial ini
java -jar MCOCL.jar -i Example.ocl -pp
menjadi
docker run --rm -v ${PWD}:/input -w /input monticore/ocl -i Example.ocl -pp
Saat menggunakan Docker.
Dimungkinkan untuk membangun toples alat yang dapat dieksekusi dari file sumber yang terletak di GitHub. Berikut ini menjelaskan proses untuk membangun alat dari file sumber menggunakan bash. Untuk membangun toples yang dapat dieksekusi dengan bash dari file sumber yang tersedia di GitHub, jalankan perintah berikut.
Pertama, klon repositori:
git clone https://github.com/MontiCore/ocl.git
Ubah direktori ke direktori root dari sumber yang dikloning:
cd OCL
Kemudian bangun proyek dengan menjalankan (info: Anda harus menginstal lulusan untuk ini):
gradle build
Selamat! Anda sekarang dapat menemukan file jar MCOCL.jar
yang dapat dieksekusi di direktori target/libs
(dapat diakses melalui cd target/libs
).
Bagian sebelumnya menjelaskan cara mendapatkan file jar yang dapat dieksekusi (alat baris perintah OCL). Bagian ini menyediakan tutorial untuk menggunakan alat OCL. Contoh -contoh berikut menganggap bahwa Anda secara lokal menamai alat MCOCL
. Jika Anda membangun alat dari sumber atau menggunakan perintah wget
di atas, maka Anda baik -baik saja. Jika Anda mengunduh alat secara manual, maka Anda harus mempertimbangkan untuk mengganti nama toples yang diunduh.
Mengeksekusi file jar tanpa opsi mencetak informasi penggunaan dari
Alat ke konsol:
$ 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.
Agar bekerja dengan baik, alat ini membutuhkan argumen wajib -i,--input <file>
, yang mengambil jalur file dari setidaknya satu file input yang berisi model SD. Jika tidak ada argumen lain yang ditentukan, alat ini semata -mata mem -parsing model.
Untuk mencoba ini, salin MCOCL.jar
ke direktori pilihan Anda. Setelah itu, buat berisi OCL sederhana berikut:
ocl Example {
}
Simpan file teks sebagai Example.ocl
di direktori tempat MCOCL.jar
berada.
Sekarang jalankan perintah berikut:
java -jar MCOCL.jar -i Example.ocl
Anda mungkin memperhatikan bahwa alat tersebut mencetak tidak ada output ke konsol. Ini berarti bahwa alat ini telah menguraikan Example.ocl
file.ocl dengan sukses.
Alat ini menyediakan printer yang cukup untuk bahasa OCL. Proter-printer dapat digunakan, misalnya, untuk memperbaiki pemformatan file yang berisi OCL. Untuk menjalankan opsi Pretty-Printer, -pp,--prettyprint
dapat digunakan. Menggunakan opsi tanpa argumen apa pun yang cukup dicetak, model yang terkandung dalam file input ke konsol.
Jalankan perintah berikut untuk mencoba ini:
java -jar MCOCL.jar -i Example.ocl -pp
Perintah mencetak model yang cukup dicetak yang terkandung dalam file input ke konsol:
ocl Example {
}
Dimungkinkan untuk mencetak cukup model yang terkandung dalam file input ke file output. Untuk tugas ini, dimungkinkan untuk memberikan nama file output sebagai argumen ke -pp,--prettyprint
. Jika argumen untuk file output disediakan, maka jumlah file output harus sama dengan jumlah file input. File input i-th cukup dicetak ke dalam file output i-th.
Jalankan perintah berikut untuk mencoba ini:
java -jar MCOCL.jar -i Example.ocl -pp Output.ocl
Perintah mencetak model yang cukup dicetak yang terkandung dalam file input ke dalam file Output.ocl
.
Untuk memeriksa kondisi konteks, opsi -c,--coco <arg>
dapat digunakan. Menggunakan opsi ini tanpa argumen apa pun memeriksa apakah model memenuhi semua kondisi konteks.
Jika Anda hanya tertarik untuk memeriksa apakah model hanya memenuhi subset dari kondisi konteks atau ingin menjelaskan bahwa semua kondisi konteks harus diperiksa, Anda dapat melakukan ini dengan juga memberikan salah satu dari tiga argumen intra
, inter
, dan type
.
intra
hanya menjalankan kondisi konteks mengenai pelanggaran kondisi konteks intra-model. Kondisi konteks ini, misalnya, memeriksa konvensi penamaan.inter
mengeksekusi semua kondisi konteks intra-model dan juga memeriksa apakah jenis nama dalam tanda tangan konstruktor didefinisikan.type
argumen mengeksekusi semua konidisi konteks. Kondisi konteks ini termasuk memeriksa apakah ada jenis dan metode bekas. Perilaku saat menggunakan type
argumen sama dengan perilaku default saat menggunakan tidak ada argumen.Jalankan perintah berikut untuk mencoba contoh sederhana:
java -jar MCOCL.jar -i Example.ocl -c -cd4c
Anda mungkin memperhatikan bahwa alat tersebut tidak mencetak apa pun ke konsol saat menjalankan perintah ini. Ini berarti bahwa model tersebut memenuhi semua kondisi konteks.
Sekarang mari kita pertimbangkan contoh yang lebih kompleks. Ingatlah Bookshop
OCL dari bagian An Example Model
di atas. Untuk melanjutkan, salin representasi tekstual dari OCL Bookshop
dan simpan di file Bookshop.ocl
di direktori di mana file MCOCL.jar
berada. Untuk ini Anda akan memerlukan file simbol yang berisi simbol diagram kelas yang sesuai dengan Bookshop.ocl
. Ini akan dijelaskan secara lebih rinci di bagian berikut. Untuk saat ini, cukup tambahkan -p src/test/resources/docs/Bookshop/ -cd4c
ke perintah untuk menggunakan Tell the Tool di mana menemukan file simbol yang disiapkan untuk contoh ini dan cara memprosesnya.
Anda dapat memeriksa berbagai jenis kondisi konteks, menggunakan -c,--coco <arg>
opsi:
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
Tak satu pun dari perintah ini yang menghasilkan output.
Untuk melihat kesalahan, mari kita tambahkan kesalahan pada model. Ganti baris ini di Bookshop.ocl
{ book | Book book in booksInStock, book.iban == iban }
oleh
{ book2 | Book book in booksInStock, book.iban == iban }
Saat book2
tidak ditentukan, alat ini sekarang harus mencetak pesan kesalahan saat memeriksa Cocos:
$ 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
Harap ingat untuk membatalkan "kesalahan".
Pada bagian ini kami menggunakan jalur simbol dan menyediakan alat dengan file simbol (tabel simbol tersimpan) dari model lain, yang berisi informasi jenis yang diperlukan.
Buat mytypes
direktori baru di direktori di mana alat MCOCL.jar
berada. Misalnya, contoh Bookshop.ocl
dari bagian pertama memerlukan diagram kelas yang menentukan tipe data. Anda dapat menemukan file diagram kelas ini di bawah SRC/Test/Resources/Docs/Bookshop/Bookshop.cd.
Untuk menggunakannya di OCL, pertama -tama Anda harus mengonversinya info file simbol. Simbol File Bookshop.sym
dari diagram kelas menyediakan semua informasi jenis yang diperlukan untuk menggunakan tipe -tipe di OCL. Jika Anda tidak ingin terlibat dengan alat CD pada saat ini, Anda juga dapat menemukan file yang siap digunakan di bawah SRC/Test/Resources/Docs/Bookshop/Bookshop.sym. Cukup salin ke folder mytypes
Anda. Kalau tidak, untuk mengubah diagram kelas menjadi file simbol yang Anda butuhkan untuk menggunakan MCCD.jar
dari proyek analisis CD4 dan mengonversi file diagram kelas menggunakan perintah berikut:
java -jar MCCD.jar -d false --fieldfromrole navigable -i src/test/resources/docs/Bookshop/Bookshop.cd -s mytypes/Bookshop.sym
Isi file simbol sangat penting bagi Anda sebagai pengguna bahasa. Jika Anda penasaran dan melihat ke dalam file simbol: file simbol berisi representasi simbol JSON yang ditentukan dalam model. Dalam hal ini, file simbol berisi informasi tentang tipe yang ditentukan. Biasanya, alat -alat bahasa Monticore secara otomatis menghasilkan isi file -file ini dan Anda, sebagai pengguna bahasa, tidak boleh peduli dengan isinya.
Jalur yang berisi struktur direktori yang berisi file simbol disebut "jalur simbol". Jika kami memberikan jalur simbol ke alat, ia akan mencari simbol dalam file simbol, yang disimpan dalam direktori yang terkandung dalam jalur simbol. Jadi, jika kami ingin alat untuk menemukan file simbol kami, kami harus memberikan jalur model ke alat melalui opsi --path <directory>
. Anda dapat mencobanya menggunakan folder mytypes
yang baru saja Anda buat:
java -jar MCOCL.jar -i Bookshop.ocl --path <SYMBOLPATH> -c type -cd4c
di mana <SYMBOLPATH>
adalah jalur di mana Anda menyimpan file simbol yang diunduh. Dalam contoh kami, jika Anda menyimpan model di direktori mytypes
, jalankan perintah berikut:
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type -cd4c
Perhatikan bahwa perintah ini juga menggunakan bendera -cd4c
. Untuk menafsirkan Symbolfiles yang disediakan untuk alat OCL, perlu memahami bagaimana menafsirkan simbol yang disimpan oleh alat CD. Bendera -cd4c
adalah steno untuk melakukan ini untuk kode CD4. Anda juga dapat melakukannya secara manual dengan menggunakan bendera --typeSymbol
, --functionSymbol
, dan --variableSymbol
diikuti oleh jenis simbol yang harus diartikan sebagai TypeSymbol
, FunctionSymbol
dan VariableSymbol
:
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type --typeSymbol <TYPE_SYMBOL_KINDS> --variableSymbol <VAR_SYMBOL_KINDS> --functionSymbol <FUNC_SYMBOL_KINDS>
di mana <TYPE_SYMBOL_KINDS>
, <VAR_SYMBOL_KINDS>
, dan <FUNC_SYMBOL_KINDS>
adalah nama simbol yang sepenuhnya memenuhi syarat. Jika Anda ingin memberikan beberapa jenis simbol, cukup tambahkan mereka dipisahkan oleh ruang. Dalam contoh kami, mendeklarasikan simbol dari CD4analysis akan terlihat seperti ini:
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
Perhatikan bahwa alat ini sekarang menghasilkan banyak peringatan pada simbol yang tidak dapat ditafsirkan. Tidak setiap simbol bahasa yang berbeda mungkin menarik di OCL. Untuk menekan peringatan yang tidak disengaja ini, Anda dapat memberi tahu alat OCL untuk jenis simbol mana yang tidak ingin Anda terima menggunakan --ignoreSymKind <SYM_KINDS_TO_IGNORE>
opsi. Dalam contoh kami, ini akan terlihat seperti ini:
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
Untuk penggunaan sehari -hari, ini sedikit rumit. Jadi ingatlah bahwa bendera -cd4c
hanya dapat mengurangi ini menjadi
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type -cd4c
Bagian sebelumnya menjelaskan cara memuat simbol dari file simbol yang ada. Sekarang, kami akan menggunakan alat ini untuk menyimpan file simbol untuk model Bookshop.ocl
kami. File simbol yang disimpan akan berisi informasi tentang objek yang ditentukan dalam file OCL. Ini dapat diimpor oleh model lain untuk menggunakan simbol yang diperkenalkan oleh definisi objek ini, mirip dengan bagaimana kami mengubah file Bookshop.ocl
untuk mengimpor simbol yang terkandung dalam simbol file Bookshop.sym
.
Menggunakan opsi -s,-symboltable <file>
Membangun tabel simbol dari model input dan menyimpannya di jalur file yang diberikan sebagai argumen. Tidak ada jalur file yang harus disediakan atau tepat satu jalur file harus disediakan untuk setiap model input. File simbol untuk model input i-th disimpan dalam file yang ditentukan oleh jalur file i-th. Jika Anda tidak memberikan jalur file apa pun, alat ini menyimpan tabel simbol dari setiap model input dalam simbol file target/symbols/{packageName}/{fileName}.oclsym
di mana packageName
adalah nama paket seperti yang ditentukan dalam file yang berisi file yang berisi file yang berisi file yang berisi file yang berisi file yang berisi file yang berisi file yang berisi file yang berisi file yang berisi file tersebut berisi file yang berisi file tersebut yang berisi file tersebut yang berisi file tersebut yang berisi file tersebut yang berisi file tersebut yang berisi file tersebut yang berisi file tersebut yang berisi file tersebut. Model dan fileName
adalah nama file yang berisi model. File disimpan relatif terhadap direktori kerja, yaitu, direktori di mana Anda menjalankan perintah untuk menyimpan file simbol. Selain itu, harap perhatikan bahwa untuk menyimpan simbol dengan benar, model harus dibentuk dengan baik dalam semua hal, dan oleh karena itu semua kondisi konteks diperiksa sebelumnya.
Untuk menyimpan file simbol Bookshop.ocl
, jalankan perintah berikut (Kondisi konteks implisit pemeriksaan memerlukan menggunakan opsi jalur simbol):
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -cd4c -s
Alat ini menghasilkan target/symbols/docs/Bookshop.oclsym
, yang sekarang dapat diimpor oleh model lain, misalnya, oleh model yang perlu menggunakan beberapa objek yang ditentukan dalam Bookshop
file OCL.
Untuk menyimpan file simbol Bookshop.ocl
dalam file syms/Bookshop.oclsym
, misalnya, jalankan perintah berikut (sekali lagi, kondisi konteks implisit memerlukan menggunakan opsi jalur simbol):
java -jar MCOCL.jar -i Bookshop.ocl -path mytypes -cd4c -s syms/Bookshop.oclsym
Selamat, Anda baru saja menyelesaikan tutorial tentang menyimpan file simbol SD!