Paccianizing

This commit is contained in:
Mattia Mascarello 2023-04-18 22:55:48 +02:00
parent f7fc90d98d
commit 6cdef34073
63 changed files with 568 additions and 813 deletions

View File

@ -2,7 +2,7 @@
# Use of this source code is governed by a GPLv3 license, see LICENSE.txt. # Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
cmake_minimum_required(VERSION 3.14) cmake_minimum_required(VERSION 3.14)
project(Monicelli VERSION 2.1.0 LANGUAGES C CXX) project(Pacciani VERSION 2.1.0 LANGUAGES C CXX)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")

View File

@ -4,7 +4,7 @@
# Project related configuration options # Project related configuration options
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8 DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "Monicelli" PROJECT_NAME = "Pacciani"
PROJECT_NUMBER = PROJECT_NUMBER =
PROJECT_BRIEF = PROJECT_BRIEF =
PROJECT_LOGO = PROJECT_LOGO =

279
README.md
View File

@ -1,68 +1,35 @@
# Monicelli 2.x "Cofandina" # The Pacciani programming language
This all-new release mainly brings several improvements to the code that make
it easier to hack and build new features. In addition to that:
* `mcc` now produces an executable by default, no need to use (or install) Pacciani is an esoteric language largely based on the [Monicelli Programming Language](https://github.com/esseks/monicelli), which you should definitely check out!
`lcc`, as it was previously the case. `mcc cofandina.mc -o cofandina` and
that's it! This feature currently requires a POSIX system (like Linux or
Mac OS X) with a C compiler installed (anything reasonably recent will do).
* `mcc` does not depend on Boost anymore. # What's Pacciani anyway?
* `mcc` has a new hand-written parser that should provide better error Pacciani is an esoterical programming language based on the so-called
messages. Now it's easier to stuzzicate your prematurated supercazzole. "compagni di merende" from the Italian [Monster of Florence](https://en.wikipedia.org/wiki/Monster_of_Florence) trial.
Error messages are in plain English and not very antani. Apologies for that.
* `mcc` now generates code that directly calls the C standard library. This
allows you to seamlessly link Monicelli object files with C/C++ code, without
any extra dependency on a Monicelli standard library.
* The code generator in `mcc` has been ported to LLVM 6.0 and will continue
to be updated with new releases.
* Modules are gone. This was a rather obscure feature that allowed to expose
functions implemented in C/C++ to Monicelli code using a YAML-based language.
Instead, it's now possible to declare a function with an empty body to signal
that it will be implemented in another file, be it in Monicelli or C/C++.
See the updated Turtle example.
* The C++ transpiler is gone. It might come back again, though.
# What's Monicelli anyway?
Monicelli is an esoterical programming language based on the so-called
"supercazzole" from the movie Amici Miei, a masterpiece of the Italian
comedy.
Over the past few years I have tried to render the idea of "supercazzola" to
non-Italian speakers, with little success. The closest I got was by describing
it as "comically deceptive gibberish", which sadly does not capture the true
essence of what a "supercazzola" (spelled "supercazzora" according to some) is.
I'm still open to suggestions on how to better present Monicelli (the language)
to the international public.
# Compilation # Compilation
A part of the Monicelli compiler (the lexer) is generated using `ragel`, which A part of the Pacciani compiler (the lexer) is generated using `ragel`, which
you will need to have installed. If this is not the case, the configuration you will need to have installed. If this is not the case, the configuration
script will warn you. Monicelli is developed with version 6.8, but any script will warn you. Pacciani is developed with version 6.8, but any
sufficiently recent release should do just fine. sufficiently recent release should do just fine.
You will also need to have LLVM development libraries installed, version 14. You will also need to have LLVM development libraries installed, version 14.
Newer versions might or might not work. CMake looks for version 14 by default, you Newer versions might or might not work. CMake looks for version 14 by default, you
can override this by setting the `MONICELLI_LLVM_VERSION` variable: can override this by setting the `PACCIANI_LLVM_VERSION` variable:
$ cmake -DMONICELLI_LLVM_VERSION=15 $ cmake -DPACCIANI_LLVM_VERSION=15
Finally, you will need CMake, version 3.14 or higher. Finally, you will need CMake, version 3.14 or higher.
A typical Makefile-based build workflow would be: A typical Makefile-based build workflow would be:
$ cd monicelli/ $ cd pacciani/
$ mkdir build/ $ mkdir build/
$ cd build/ $ cd build/
$ cmake .. -DCMAKE_INSTALL_PREFIX="$HOME/mcc" $ cmake .. -DCMAKE_INSTALL_PREFIX="$HOME/pcc"
$ make all install $ make all install
If your tools are installed in non-standard locations If your tools are installed in non-standard locations
@ -70,7 +37,7 @@ If your tools are installed in non-standard locations
$ PATH=/path/to/ragel cmake .. $ PATH=/path/to/ragel cmake ..
`mcc` statically links LLVM, once compiled it will only depend on the C++ `pcc` statically links LLVM, once compiled it will only depend on the C++
runtime and on `libz`. runtime and on `libz`.
## Note for non-POSIX platforms (like Windows) ## Note for non-POSIX platforms (like Windows)
@ -81,45 +48,36 @@ Windows. There, you will need to disable this feature at build time. You will
only get object files (.o) that you will have to link, including a C runtime only get object files (.o) that you will have to link, including a C runtime
library, by yourself. library, by yourself.
You can disable the invocation of an external linker and make `mcc` compilable You can disable the invocation of an external linker and make `pcc` compilable
on Windows during CMake configuration by forcing the appropriate flag to OFF: on Windows during CMake configuration by forcing the appropriate flag to OFF:
$ cmake .. -DMONICELLI_LINKER=OFF $ cmake .. -DPACCIANI_LINKER=OFF
## Tested platforms ## Tested platforms
The reference OS for building and testing Monicelli is the most recent Ubuntu LTS. The reference OS for building and testing Pacciani is the most recent Ubuntu LTS.
If the build is broken there, then it's a bug. It _should_ also compile on Windows, as If the build is broken there, then it's a bug. It _should_ also compile on Windows, as
well as many more POSIX systems, including Mac OS X. If you needed a patch to compile well as many more POSIX systems, including Mac OS X. If you needed a patch to compile
Monicelli on your favourite platform, please send us a pull request! Pacciani on your favourite platform, please send us a pull request!
# Usage # Usage
Monicelli build an executable by default on POSIX systems Pacciani build an executable by default on POSIX systems
(such as Linux, Mac OS X). Linking requires an external C compiler, anything (such as Linux, Mac OS X). Linking requires an external C compiler, anything
decently modern and standard-conformant should do. decently modern and standard-conformant should do.
A typical invocation is very similar to what you would expect from your C A typical invocation is very similar to what you would expect from your C
compiler: compiler:
$ mcc example.mc -o example $ pcc example.pc -o example
$ ./example $ ./example
Please be aware that the Monicelli compiler depends on the availability of a C Please be aware that the Pacciani compiler depends on the availability of a C
compiler and stdlib, although this dependency should be available on virtually compiler and stdlib, although this dependency should be available on virtually
all platforms where you might think to run `mcc`. all platforms where you might think to run `pcc`.
# Language overview # Language overview
The original specification can be found in `Specification.txt`, and was
initially conceived by my colleagues and dear friends Alessandro Barenghi,
Michele Tartara and Nicola Vitucci, to whom goes my gratitude.
Their proposal was meant to be an elaborate joke and is not complete.
This project is an ongoing effort to produce a rigorous specification for the
language and implement a compiler, which implies filling gaps and ambiguities
with sensible choices.
Statements have no terminator, i.e. no semicolon `;` or the like. A single Statements have no terminator, i.e. no semicolon `;` or the like. A single
statement can be split across multiple lines and multiple statements can be statement can be split across multiple lines and multiple statements can be
grouped on the same line. However, keywords consisting of multiple space-separed grouped on the same line. However, keywords consisting of multiple space-separed
@ -129,7 +87,7 @@ A comma might be inserted after each statement, if it fits the sentence ;)
Accented letters can be replaced by the non-accented letter followed by a Accented letters can be replaced by the non-accented letter followed by a
backtick `` ` ``, although the use of the correct Italian spelling is strongly backtick `` ` ``, although the use of the correct Italian spelling is strongly
encouraged for maximizing the antani effect. encouraged for maximizing the firenze effect.
## Getting started real quick ## Getting started real quick
@ -141,17 +99,17 @@ folder contains a set of programs covering most of the features of the language.
The entry point of the program (the "main") is identified by the phrase: The entry point of the program (the "main") is identified by the phrase:
Lei ha clacsonato Tutti in piedi
which marks the beginning of the _supercazzola_ (i.e. of the program). which marks the beginning of the _processo_ (i.e. of the program).
A value can be returned by using the the following statement: A value can be returned by using the the following statement:
vaffanzum <expression>! seduti <expression>!
optionally, no value might be returned with: optionally, no value might be returned with:
vaffanzum! seduti!
## Expressions ## Expressions
@ -181,7 +139,7 @@ This ensures that no loss takes place when evaluating an expression.
Binary shift operators have a slighly different Binary shift operators have a slighly different
syntax: syntax:
<what> con scappellamento a <direction> per <bits> <what> con saluto romano a <direction> per <bits>
which is equivalent to `what >> bits` or `what << bits`, depending on the which is equivalent to `what >> bits` or `what << bits`, depending on the
direction, which is specified as follows: direction, which is specified as follows:
@ -194,14 +152,14 @@ direction, which is specified as follows:
as you might have noticed, those are simply the translation in Italian of as you might have noticed, those are simply the translation in Italian of
"left" and "right". For instance: "left" and "right". For instance:
antani con scappellamento a sinistra per 2 testimone con saluto romano a sinistra per 2
maps to `antani << 2`. maps to `testimone << 2`.
It goes without saying, other expression can be used instead of numbers. It goes without saying, other expression can be used instead of numbers.
Also, the usual precedence rules apply. Also, the usual precedence rules apply.
**There is no syntax for braces in Monicelli**. **There is no syntax for braces in Pacciani**.
## Variables ## Variables
@ -220,9 +178,9 @@ Consequently, the articles above cannot be used as variable names.
A value can be assigned to a variable with the following statement: A value can be assigned to a variable with the following statement:
<varname> come fosse <expression> <varname> è amico di <expression>
the alternate spelling `come se fosse` can be used as well.
The `<expression>` initializer is casted to the declared type of the variable, The `<expression>` initializer is casted to the declared type of the variable,
even if the cast will cause some loss. This feature can be (ab)used to introduce even if the cast will cause some loss. This feature can be (ab)used to introduce
@ -235,61 +193,61 @@ directly mapped on C++/C99 types as follows:
| Type name | Mapped C type | Size | | Type name | Mapped C type | Size |
|-----------|---------------|-------| |-----------|---------------|-------|
| Necchi | `int` | 64bit | | Pacciani | `int` | 64bit |
| Mascetti | `char` | 8bit | | Vanni | `char` | 8bit |
| Perozzi | `float` | 32bit | | Pucci | `float` | 32bit |
| Melandri | `bool` | - | | Lotti | `bool` | - |
| Sassaroli | `double` | 64bit | | Canessa | `double` | 64bit |
A variable is declared with the following statement: A variable is declared with the following statement:
voglio <varname>, <type> venga <varname>, <type>
an initialization value can be provided: an initialization value can be provided:
voglio <varname>, <type> come se fosse <expression> venga <varname>, <type> è amico di <expression>
for instance: for instance:
voglio antani, Necchi come se fosse 4 venga l'imputato, Pacciani è amico di 4
declares a variables called `antani` of type `Necchi` (`int`) and initializes declares a variables called `testimone` of type `Pacciani` (`int`) and initializes
it to 4. it to 4.
## Input/Output ## Input/Output
Variables and expressions can be printed with the statement: Variables and expressions can be printed with the statement:
<expression> a posterdati <expression> è espulso dall'aula
Conversely, a variable might be read from input using: Conversely, a variable might be read from input using:
mi porga <varname> chiamo a testimoniare <varname>
## Loop ## Loop
There is only one loop construct, equivalent to a C `do {} while();`, which is There is only one loop construct, equivalent to a C `do {} while();`, which is
defined as follows: defined as follows:
stuzzica allora
<statements> <statements>
e brematura anche, se <condition> si calmi, se <condition>
For example: For example:
voglio antani, Necchi come se fosse 10 venga il mostro, Pacciani è amico di 10
stuzzica allora
antani come fosse antani meno 1 il mostro è amico di mostro meno 1
e brematura anche, se antani maggiore di 0 si calmi, se il mostro è maggiore di 0
maps to: maps to:
int antani = 10; int mostro = 10;
do { do {
antani = antani - 1; mostro = mostro - 1;
} while (antani > 0); } while (mostro > 0);
`brematura` might be replaced by its alternate form `prematura` `si calmi` might be replaced by its alternate form `perfavore`
## Branch ## Branch
@ -299,115 +257,112 @@ C translation.
This is the general form: This is the general form:
che cos'è <variable>? lei conosce <variable>?
<condition>: <condition>:
<statements> <statements>
o magari <condition>: o merenda <condition>:
<statements> <statements>
o tarapia tapioco: insomma:
<statement> <statement>
e velocità di esecuzione e facevate le merende insieme
where `<condition>` might be either a value or a semi-expression, that is an where `<condition>` might be either a value or a semi-expression, that is an
operator followed by any expression. For instance: operator followed by any expression. For instance:
che cos'è il genio? lei conosce il testimone?
intuizione: giulio:
genio come se fosse genio meno 1 testimone è amico di testimone meno 1
o magari intuizione diviso 2: o merenda giulio diviso 2:
genio come se fosse genio più 1 testimone è amico di testimone più 1
o magari maggiore di mobiletto per due: o merenda maggiore di mobiletto per due:
genio come se fosse genio per 2 testimone è amico di testimone per 2
o tarapia tapioco: insomma:
genio come se fosse 2 testimone è amico di 2
e velocità di esecuzione e facevate le merende insieme
maps to: maps to:
if (genio == intuizione) { if (testimone == giulio) {
genio = genio - 1; testimone = testimone - 1;
} else if (genio == (intuizione / 2)) { } else if (testimone == (giulio / 2)) {
genio = genio + 1; testimone = testimone + 1;
} else if (genio > (mobiletto * 2)) { } else if (testimone > (mobiletto * 2)) {
genio = genio * 2; testimone = testimone * 2;
} else { } else {
genio = 2; testimone = 2;
} }
The statement can emulate an `if () {} else {}`: The statement can emulate an `if () {} else {}`:
che cos'è il genio? lei conosce il genio?
maggiore di mobiletto: maggiore di mobiletto:
genio come se fosse 2 genio è amico di 2
o tarapia tapioco: insomma:
genio come se fosse 0 genio è amico di 0
e velocità di esecuzione e facevate le merende insieme
Placing multiple `o <condition>:` block is similar to a chain of `else if` in C. Placing multiple `o <condition>:` block is similar to a chain of `else if` in C.
The `o tarapia tapioco` block can be omitted: The `insomma` block can be omitted:
che cos'è il genio? lei conosce il genio?
maggiore di mobiletto: maggiore di mobiletto:
genio come se fosse 2 genio è amico di 2
e velocità di esecuzione e facevate le merende insieme
Finally, here is the equivalent of a `switch () {}`: Finally, here is the equivalent of a `switch () {}`:
che cos'è il genio? lei conosce il genio?
1: 1:
genio come se fosse 2 genio è amico di 2
o magari 2: o merenda 2:
genio come se fosse 7 genio è amico di 7
o tarapia tapioco: insomma:
genio come se fosse 9 genio è amico di 9
e velocità di esecuzione e facevate le merende insieme
where the `o tarapia tapioco` part is like the `default` block. where the `insomma` part is like the `default` block.
## Functions ## Functions
**Note**: the alternate spelling `supercazzora` might be used in place
of `supercazzola` wherever the latter appears.
## Declaration ## Declaration
A function is declared with the `blinda la supercazzola` statement: A function is declared with the `idromassaggiatore` statement:
blinda la supercazzola [<type>] <name> [con <param> <type>[, <param> <type>...]] o scherziamo? idromassaggiatore [<type>] <name> [con <param> <type>[, <param> <type>...]] innocente
<statements> <statements>
Where `<type>` can be omitted for a void function. For instance: Where `<type>` can be omitted for a void function. For instance:
blinda la supercazzola Necchi antanizzata con alfio Mascetti o scherziamo? idromassaggiatore Pacciani merendivoro con mario Vanni innocente
vaffanzum alfio meno 2! seduti mario meno 2!
is a function of type `Necchi`, taking one argument of type `Mascetti`. is a function of type `Pacciani`, taking one argument of type `Vanni`.
Multiple arguments must be comma-separed, like in: Multiple arguments must be comma-separed, like in:
blinda la supercazzola Necchi antanizzata con alfio Mascetti, barilotto Necchi o scherziamo? idromassaggiatore Pacciani merendivoro con mario Vanni, barilotto Pacciani innocente
vaffanzum alfio meno 2! seduti mario meno 2!
which is a function of type `Necchi`, taking two arguments of type `Mascetti` which is a function of type `Pacciani`, taking two arguments of type `Vanni`
and `Necchi`. It maps to: and `Pacciani`. It maps to:
int antanizzata(char alfio, int barilotto) { int merendivoro(char mario, int barilotto) {
return alfio - 2; return mario - 2;
} }
Finally, this: Finally, this:
blinda la supercazzola antanizzata o scherziamo? idromassaggiatore merendivoro innocente
vaffanzum! seduti!
is a `void` function taking no arguments and becomes: is a `void` function taking no arguments and becomes:
void antanizzata() { void merendivoro() {
return; return;
} }
Functions cannot be nested and can be declared before or after the main in any Functions cannot be nested and can be declared before or after the main in any
order. `mcc` will not check that a return statement is always reachable inside order. `pcc` will not check that a return statement is always reachable inside
a non-void function. Failing to return a value leads to undefined behaviour. a non-void function. Failing to return a value leads to undefined behaviour.
A function might be declared with no body, in which case it's treated as a A function might be declared with no body, in which case it's treated as a
@ -416,23 +371,23 @@ it signals that the function is implemented in another file.
## Invocation ## Invocation
A function is called with the `brematurata la supercazzola` statement: A function is called with the `noi condividiamo` statement:
brematurata la supercazzola <name> [con <expression>[, <expression>...] o scherziamo? noi condividiamo <name> [con <expression>[, <expression>...] innocente
Functions might be called inside expressions. For instance, this: Functions might be called inside expressions. For instance, this:
antani come se fosse brematurata la supercazzola alfio con barilotto diviso 3 o scherziamo? per 2 il giudice è amico di noi condividiamo poeticamente con merende diviso 3 innocente per 2
maps to: maps to:
antani = alfio(barilotto / 3) * 2; giudice = poeticamente(merende / 3) * 2;
## Exceptions ## Exceptions
The program might be aborted immediately with the statement: The program might be aborted immediately with the statement:
avvertite don ulrico viva idduce
there are no arguments. there are no arguments.
@ -441,16 +396,16 @@ there are no arguments.
An assertion block will evaluate its expression and trigger an error message An assertion block will evaluate its expression and trigger an error message
if it is found to be 0 (logical false). An assertion is stated as: if it is found to be 0 (logical false). An assertion is stated as:
ho visto <expression>! ma cosa dice <expression>!
## Comments ## Comments
Any character after `bituma` is ignored until a line break is encountered. For Any character after `il nostro signore Gesù` is ignored until a line break is encountered. For
instance, in: instance, in:
antani come se fosse 4 bituma, scusi, noi siamo in quattro il testimone è amico di 4 il nostro signore Gesù è mio amico
`, scusi, noi siamo in quattro` is ignored. `il nostro signore Gesù` is ignored.
Comments are useful to fill the "supercazzola" and make it more readable, since Comments are useful to fill the "supercazzola" and make it more readable, since
any word (including reserved words) can be inserted into it. any word (including reserved words) can be inserted into it.
@ -462,7 +417,7 @@ with an hash sign `#` and continues until a line break is encountered, as an
ordinary comment. ordinary comment.
They have a different graphical symbol, which can be immediately spotted inside They have a different graphical symbol, which can be immediately spotted inside
a long "supercazzola". Also, ordinary comments can and should be used in an a long "processo". Also, ordinary comments can and should be used in an
improper way to fill the sentence, meta comments provide a mechanism for improper way to fill the sentence, meta comments provide a mechanism for
distiguishing "real" comments. distiguishing "real" comments.
@ -472,6 +427,4 @@ The following phrases are currently reserved with no assigned usage. They cannot
be used as variable identifiers, even if they do not serve any other purpose in be used as variable identifiers, even if they do not serve any other purpose in
the current language revision. the current language revision.
* `conte` * `lei la picchiava`
* `scusi noi siamo in`
* `con rinforzino`

View File

@ -1,220 +0,0 @@
-------------------------------------------------------------------------
NOTE: this document was left here only for historical purposes,
refer to REAMDE.md for the current spec.
NOTA: questo documento è obsoleto ed è qui solo per memoria storica, in
quanto rappresenta la prima specifica proposta per il linguaggio.
README.md contiene l'attuale versione.
-------------------------------------------------------------------------
Proposte per la definizione di un linguaggio di programmazione esoterico "Monicelli"
Il "main" del programma inizia in corrispondenza di:
Lei ha clacsonato
che da il via alla supercazzola (cioè al programma)
Il programma termina con l'istruzione
vaffanzum
che equivale a
return
Può essere usato anche per terminare le funzioni restituendo un valore di ritorno:
vaffanzum antani
*** Tipi di dato ***
* Necchi -> int
* Mascetti -> char
* Perozzi -> float
* Melandri -> bool
* Sassaroli -> double
I puntatori si dichiarano anteponendo "conte" al nome della variabile
quindi
conte Mascetti
è
char*
*** Dichiarazione variabili ***
Si usa la sintassi:
voglio il <nome>, <tipo>[, come fosse <espressione>]
Esempio:
voglio il cappellano, Necchi
dichiara la variabile "cappellano" di tipo int
e:
voglio lo scrittoio, conte Mascetti
dichiara la variabile "scrittoio" di tipo "char*"
Eventualmente si può anche inizializzare immediatamente la variabile usando l'operatore di assegnamento (spiegato meglio nel seguito)
voglio il cappellano, Necchi, come fosse 4
Ogni volta che si deve utilizzare una variabile, è possibile precederla con un articolo.
La concordanza dell'articolo non è semanticamente verificata, ma ci si assicura sintatticamente
che l'articolo sia effettivamente un articolo.
*** Operatori ***
definiti a parole, per meglio integrarsi graficamente nella supercazzola.
Aritmetici
* più
* meno
* per
* diviso
Di shift:
con scappellamento a <direzione> per X
dove X e il numero di posizioni dello shift e direzione può essere
* sinistra
* destra
Esempio:
antani con scappellamento a destra per 2
equivale a
antani >> 2
Di confronto
* minore di
* maggiore di
* minore o uguale a
* maggiore o uguale a
Di assegnamento
è "come fosse".
Perciò:
vicesindaco come fosse antani per due a destra
equivale a
vicesindaco = antani >> 2
Operatore di output (postfisso):
a posterdati
Esempio:
antani a posterdati
Stampa la variabile "antani" a video
Operatore di input:
mi porga <variabile>
Esempio
mi porga il cappellano
richiede all'utente di inserire il valore della variabile "cappellano" da standard input
*** Cicli ***
Stuzzica-Brematura
Stuzzica il palato eseguendo almeno una volta il corpo del ciclo, ed eventualmente lo brematura altre volte.
Sintassi:
stuzzica
<corpo del ciclo>
e brematura anche, se <condizione>
*** Costrutto di selezione (switch+if) ***
"Che cos'è"
È l'unico costrutto di selezione, facente funzione sia di if, sia di switch
Sintassi:
che cos'è <articolo> <variabileDiControllo>?
<ipotesi>:
<codice>
<ipotesi>:
<codice>
[tarapia tapioco: #Else/default, opzionale
<codice>
]
e velocità di esecuzione.
<ipotesi> può essere:
* <espressione>:
il codice viene eseguito se il risultato dell'espressione è uguale alla variabileDiControllo
* <op_confronto> <espressione>:
il codice viene eseguito se è vero che: <variabileDiControllo> <op_confronto> <espressione>
Esempio:
che cos'è il genio?
fantasia:
antani come se fosse vicesindaco per due
intuizione:
mi porga il cappellano
zingarata come fosse cappellano più uno
zingarata a posterdati
maggiore di mobiletto:
genio a posterdati
tarapia tapioco:
mi porga il cappello
e velocita di esecuzione
Che corrisponde a (pseudocodice):
switch(genio) {
case genio=fantasia:
antani = vicesindaco*2
case genio=intuizione:
input cappellano
zingarata = cappellano+1
print zingarata
case genio > mobiletto:
print genio
default:
input cappello
}
*** Funzioni ***
Una funzione può essere definita con la sintassi:
blinda la supercazzola <nome> [con <parametro>[, <parametro>]].
<codice>
O scherziamo?
che definisce la funzione <nome> con i parametri in ingresso specificati
Le funzioni sono invocate con la sintassi:
brematurata la supercazzola <nome> con [<parametro>[, <parametro>]]
*** Eccezioni ***
Esiste un'unica eccezione possibile (di fatto, corrispondente a segnalare un errore non gestibile e
causa la terminazione del programma).
L'eccezione può essere lanciata tramite la frase:
avvertite don ulrico
Esempio:
che cos'è il thermos?
un oggetto:
barilotto come se fosse antani per due
> 0:
thermos come se fosse thermos meno 1
tarapia tapioco:
avvertite don ulrico
e velocità di esecuzione
Che corrisponde a (pseudocodice):
switch(thermos) {
case thermos==oggetto:
barilotto = antani * 2
case thermos>0:
thermos = thermos-1
default:
raise exception
}
*** Commenti ***
Ogni riga iniziata da "bituma" è un commento e viene completamente ignorata dal compilatore
Esempio:
bituma il codice che esegue la FFT
*** Asserzioni ***
ho visto la <condizione>!
verifica che la condizione risulti vera, altrimenti avverte don Ulrico (ossia, lancia un'eccezione)
Esempio:
ho visto il cappellano come fosse la lavagna!
equivale a
assert(cappellano==lavagna)

View File

@ -4,17 +4,17 @@
find_package(Doxygen) find_package(Doxygen)
if (DOXYGEN_FOUND) if (DOXYGEN_FOUND)
set(MONICELLI_DOXYGEN_CONFIG ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) set(PACCIANI_DOXYGEN_CONFIG ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
configure_file( configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
${MONICELLI_DOXYGEN_CONFIG} ${PACCIANI_DOXYGEN_CONFIG}
@ONLY @ONLY
) )
add_custom_target(doc add_custom_target(doc
DEPENDS ${MONICELLI_DOXYGEN_CONFIG} DEPENDS ${PACCIANI_DOXYGEN_CONFIG}
COMMAND ${DOXYGEN_EXECUTABLE} ${MONICELLI_DOXYGEN_CONFIG} COMMAND ${DOXYGEN_EXECUTABLE} ${PACCIANI_DOXYGEN_CONFIG}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
VERBATIM VERBATIM
) )

View File

@ -4,7 +4,7 @@
find_program(RAGEL_EXECUTABLE ragel) find_program(RAGEL_EXECUTABLE ragel)
if (${RAGEL_EXECUTABLE} STREQUAL "RAGEL_EXECUTABLE-NOTFOUND") if (${RAGEL_EXECUTABLE} STREQUAL "RAGEL_EXECUTABLE-NOTFOUND")
message(FATAL_ERROR "Please install ragel to compile Monicelli.") message(FATAL_ERROR "Please install ragel to compile Pacciani.")
else() else()
message(STATUS "Found Ragel: ${RAGEL_EXECUTABLE}") message(STATUS "Found Ragel: ${RAGEL_EXECUTABLE}")
endif() endif()

View File

@ -1,4 +1,4 @@
MCC=mcc PCC=pcc
EXAMPLES=factorial hello-world primes return fibonacci mandelbrot float EXAMPLES=factorial hello-world primes return fibonacci mandelbrot float
all: $(EXAMPLES) all: $(EXAMPLES)
@ -7,4 +7,4 @@ clean:
$(RM) $(EXAMPLES) $(RM) $(EXAMPLES)
%: %.mc %: %.mc
$(MCC) $< -o $@ $(PCC) $< -o $@

View File

@ -1,26 +0,0 @@
bituma un po' il calcolo del fattoriale come fosse un Sassaroli, o no?
blinda la supercazzola Sassaroli antanizzata con pazienza bitumata, concorda
Sassaroli o scherziamo?
voglio il gruppo, Sassaroli
il gruppo come fosse 1
che cos'è la pazienza?
1: il gruppo come fosse 2 con scappellamento a destra per 1
o tarapia tapioco: il gruppo come fosse prematurata la supercazzola
antanizzata con pazienza meno 1 o scherziamo? per la pazienza
e velocità di esecuzione bitumata! in fretta, e
bitumando! se no il gruppo si spacca, e insomma,
vaffanzum il gruppo!
Lei ha clacsonato
voglio il vicesindaco, Necchi
voglio il numero, Necchi
mi porga il numero bitumando il vicesindaco, dico, bitumando
il vicesindaco come fosse un numero
prematurata la supercazzola antanizzata con il vicesindaco
o scherziamo? a posterdati bitumati, pure, o in questura?

26
examples/factorial.pc Normal file
View File

@ -0,0 +1,26 @@
con il nostro signore Gesù un po' il calcolo del fattoriale è amico di un Canessa, o no?
idromassaggiatore Canessa poeticamente con pazienza il nostro signore Gesù, concorda
Canessa innocente
venga il gruppo, Canessa
il gruppo è amico di 1
lei conosce la pazienza?
1: il gruppo è amico di 2 con saluto romano a destra per 1
insomma: il gruppo è amico di noi condividiamo
poeticamente con pazienza meno 1 innocente per la pazienza
e facevate le merende insieme con il nostro signore Gesù! in fretta, e
con il nostro signore Gesù ancora se no il gruppo si spacca, e insomma,
seduti il gruppo!
Tutti in piedi
venga il giudice, Pacciani
venga il numero, Pacciani
chiamo a testimoniare il numero per il nostro signore Gesù
il giudice è amico di un numero
noi condividiamo poeticamente con il giudice
innocente è espulso dall'aula con il nostro signore Gesù

View File

@ -1,14 +0,0 @@
Lei ha clacsonato
voglio antani, Necchi come se fosse 0
voglio pastene, Necchi come se fosse 1
voglio un barilotto, Necchi
mi porga il barilotto
stuzzica
pastene a posterdati
voglio un passaggio, Necchi come fosse antani
antani come fosse pastene
pastene come fosse il pastene più il passaggio
barilotto come fosse il barilotto meno 1
e brematura anche, se il barilotto maggiore di 0

View File

@ -0,0 +1,14 @@
Tutti in piedi
venga il testimone, Pacciani è amico di 0
venga il difensore, Pacciani è amico di 1
venga un usciere, Pacciani
chiamo a testimoniare l' usciere
allora
il difensore è espulso dall'aula
venga un segretario, Pacciani è amico del testimone
il testimone è amico del difensore
il difensore è amico del difensore più il segretario
usciere è amico dell' usciere meno 1
si calmi, se l' usciere maggiore di 0

View File

@ -1,8 +0,0 @@
Lei ha clacsonato voglio antani, Necchi come se fosse 0 bitumando il pastene
voglio il pastene, Necchi come se fosse 1 voglio un barilotto, Necchi
mi porga il barilotto stuzzica bitumato il passaggio sullo sci nautico
pastene a posterdati voglio un passaggio, Necchi come fosse antani,
antani come fosse pastene bitumato e per finire
pastene come fosse il pastene più il passaggio
barilotto come fosse il barilotto bitumato di prima
meno 1 e brematura anche, se il barilotto maggiore di 0

8
examples/fibonacci.pc Normal file
View File

@ -0,0 +1,8 @@
Tutti in piedi venga il testimone, Pacciani è amico di 0
venga il difensore, Pacciani è amico di 1
venga un usciere, Pacciani
chiamo a testimoniare l' usciere
allora il difensore è espulso dall'aula
venga un segretario, Pacciani è amico del testimone il testimone è amico del difensore
il difensore è amico del difensore più il segretario
usciere è amico dell' usciere meno 1 si calmi, se l' usciere maggiore di 0

View File

@ -1,12 +0,0 @@
# Test all possible numerical forms (integer and float)
Lei ha clacsonato
2.0 a posterdati
-2.0 a posterdati
2. a posterdati
.232 a posterdati
-2 a posterdati
-.2233 a posterdati
+2 a posterdati
+2.233e-23 a posterdati

12
examples/float.pc Normal file
View File

@ -0,0 +1,12 @@
# Test all possible numerical forms (integer and float)
Tutti in piedi
2.0 è espulso dall'aula
-2.0 è espulso dall'aula
2. è espulso dall'aula
.232 è espulso dall'aula
-2 è espulso dall'aula
-.2233 è espulso dall'aula
+2 è espulso dall'aula
+2.233e-23 è espulso dall'aula

View File

@ -1,15 +0,0 @@
# Author: Alessandro Pellegrini <alessandro@pellegrini.tk>
# Released under GPLv3
Lei ha clacsonato
voglio una bucaiola, Necchi come se fosse 0 voglio prematurata, Mascetti come se fosse 72
prematurata a posterdati voglio antifurto, Mascetti come se fosse 87.
voglio una cofandina, Mascetti come se fosse prematurata con scappellamento a sinistra per 1
cofandina come fosse cofandina meno 33 brematurata la supercazzola antanizzata con antifurto,
cofandina o scherziamo? vaffanzum! bituma scusi, noi siamo in quattro.
blinda la supercazzola antanizzata con Alfio Mascetti, tarapia Mascetti o scherziamo?
voglio vicesindaco, Mascetti come se fosse 101 vicesindaco a posterdati voglio pastene,
Mascetti come se fosse vicesindaco più 7 pastene a posterdati bituma in un certo senso.
pastene a posterdati tarapia a posterdati Alfio a posterdati tarapia a posterdati
voglio scappellamento, Mascetti come se fosse 114 scappellamento a posterdati
pastene a posterdati voglio Antani, Mascetti come se fosse pastene meno 8 Antani a posterdati

15
examples/hello-world.pc Normal file
View File

@ -0,0 +1,15 @@
# Author: Alessandro Pellegrini <alessandro@pellegrini.tk>
# Released under GPLv3
Tutti in piedi
venga una bucaiola, Pacciani è amico di 0 venga bugiarda, Vanni è amico di 72
bugiarda è espulsa dall'aula venga delitto, Vanni è amico di 87.
venga un capretto, Vanni è amico della bugiarda con saluto romano a sinistra per 1
capretto è amico di capretto meno 33 noi condividiamo poeticamente con delitto,
capretto innocente seduti! il nostro signore Gesù ci perdoni
idromassaggiatore poeticamente con pazzo Vanni, pazzissimo Vanni innocente
venga giudice, Vanni è amico di 101 giudice è espulso dall'aula venga il difensore,
Vanni è amico del giudice più 7 il difensore è espulso dall'aula il nostro signore Gesù in un certo senso.
il difensore è espulso dall'aula pazzissimo è espulso dall'aula il pazzo è espulso dall'aula pazzissimo è espulso dall'aula
venga assoluzione, Vanni è amico di 114 assoluzione è espulso dall'aula
il difensore è espulso dall'aula venga avvocato, Vanni è amico del difensore meno 8 avvocato è espulso dall'aula

View File

@ -1,63 +0,0 @@
blinda la supercazzola densa con cofandina Sassaroli o scherziamo?
voglio una zingarata, Mascetti
che cos'è la cofandina?
maggiore di 8: zingarata come fosse 32
o magari maggiore di 4: zingarata come fosse 46
o magari maggiore di 2: zingarata come fosse 43
o tarapia tapioco: zingarata come fosse 42
e velocità di esecuzione
zingarata a posterdati
blinda la supercazzola Sassaroli converge con
vero Sassaroli, sogno Sassaroli, passo Necchi,
destinazione Sassaroli, finta Sassaroli o scherziamo?
voglio lo sci, Sassaroli come se fosse vero per vero più sogno per sogno bitumato quello nautico però
che cos'è il passo?
maggiore di 255:
vaffanzum un passo!
o tarapia tapioco: che cos'è lo sci?
maggiore di 4: vaffanzum il passo!
o tarapia tapioco:
vaffanzum
prematurata la supercazzola converge con
vero per vero meno un sogno per il sogno più la destinazione,
2 per il vero per il sogno più la finta,
il passo più 1,
destinazione, finta
o scherziamo?!
e velocità di esecuzione
e velocità di esecuzione bituma dico io!
blinda la supercazzola Sassaroli ancora con il vero Sassaroli, un sogno Sassaroli o scherziamo?
vaffanzum prematurata la supercazzola converge con vero, sogno, 0, vero, sogno o scherziamo?!
blinda la supercazzola antanizzata con
mino Sassaroli, mano Sassaroli, piede Sassaroli,
fuochino Sassaroli, mono Sassaroli, pastene Sassaroli o scherziamo?
voglio ispettore, Mascetti come se fosse 10
voglio una pulitina, Sassaroli come fosse mino
stuzzica
fuochino come se fosse fuochino più pastene
stuzzica
mino come se fosse mino più piede
prematurata la supercazzola densa con prematurata la supercazzola
bitumata come sempre e
ancora con mino, fuochino o scherziamo? o scherziamo? bituma no eh! Lo ripeto
e brematura anche, se mino minore di mano
mino come se fosse la pulitina
ispettore a posterdati
e brematura anche, se fuochino minore di mono
blinda la supercazzola cofandina con
vero Sassaroli, l'immagine Sassaroli,
la grandezza Sassaroli, il finale Sassaroli bituma come sempre
o scherziamo?
prematurata la supercazzola antanizzata con
vero, vero più la grandezza per 78, grandezza,
immagine, immagine più il finale per 40, il finale
o scherziamo?
Lei ha clacsonato
prematurata la supercazzola cofandina con
-2.3, -1.3, 0.05, 0.07
o scherziamo?

View File

@ -0,0 +1,63 @@
idromassaggiatore densa con pavido Canessa innocente
venga una testimone, Vanni
lei conosce il pavido?
maggiore di 8: testimone è amico di 32
o merenda maggiore di 4: testimone è amico di 46
o merenda maggiore di 2: testimone è amico di 43
insomma: testimone è amico di 42
e facevate le merende insieme
testimone è espulso dall'aula
idromassaggiatore Canessa converge con
vero Canessa, sogno Canessa, passo Pacciani,
destinazione Canessa, finta Canessa innocente
venga l' usciere, Canessa è amico di vero per vero più sogno per sogno il nostro signore Gesù quello nautico però
lei conosce il passo?
maggiore di 255:
seduti un passo!
insomma: lei conosce l' usciere?
maggiore di 4: seduti il passo!
insomma:
seduti
noi condividiamo converge con
vero per vero meno un sogno per il sogno più la destinazione,
2 per il vero per il sogno più la finta,
il passo più 1,
destinazione, finta
innocente!
e facevate le merende insieme
e facevate le merende insieme il nostro signore Gesù dico io!
idromassaggiatore Canessa ancora con il vero Canessa, un sogno Canessa innocente
seduti noi condividiamo converge con vero, sogno, 0, vero, sogno innocente!
idromassaggiatore poeticamente con
mino Canessa, mano Canessa, piede Canessa,
fuochino Canessa, mono Canessa, pastene Canessa innocente
venga ispettore, Vanni è amico di 10
venga una pulitina, Canessa è amico di mino
allora
fuochino è amico di fuochino più pastene
allora
mino è amico di mino più piede
noi condividiamo densa con noi condividiamo
il nostro signore Gesùta come sempre e
ancora con mino, fuochino innocente innocente il nostro signore Gesù no eh! Lo ripeto
si calmi, se mino minore di mano
mino è amico di la pulitina
ispettore è espulso dall'aula
si calmi, se fuochino minore di mono
idromassaggiatore pavido con
vero Canessa, l'immagine Canessa,
la grandezza Canessa, il finale Canessa il nostro signore Gesù come sempre
innocente
noi condividiamo poeticamente con
vero, vero più la grandezza per 78, grandezza,
immagine, immagine più il finale per 40, il finale
innocente
Tutti in piedi
noi condividiamo pavido con
-2.3, -1.3, 0.05, 0.07
innocente

View File

@ -1,40 +0,0 @@
blinda la supercazzola densa con cofandina Sassaroli o scherziamo?
voglio una zingarata, Mascetti bitumando la confandina.
che cos'è la cofandina? maggiore di 8: zingarata come fosse 32
o magari maggiore di 4: zingarata come fosse 46 o magari maggiore di 2:
zingarata come fosse 43 o tarapia tapioco: zingarata come fosse 42
e velocità di esecuzione, zingarata a posterdati
blinda la supercazzola Sassaroli converge con vero Sassaroli, sogno Sassaroli,
passo Necchi, destinazione Sassaroli, finta Sassaroli o scherziamo?
voglio lo sci, Sassaroli come se fosse vero per vero più sogno per sogno
che cos'è il passo? maggiore di 255: vaffanzum un passo!
o tarapia tapioco: che cos'è lo sci? maggiore di 4: vaffanzum il passo!
o tarapia tapioco: vaffanzum prematurata la supercazzola converge con
vero per vero meno un sogno per il sogno più la destinazione, 2 per il vero
per il sogno più la finta, il passo più 1, destinazione, finta o scherziamo?!
e velocità di esecuzione, e velocità di esecuzione bitumata dico io!
blinda la supercazzola Sassaroli ancora con il vero Sassaroli,
un sogno Sassaroli o scherziamo? vaffanzum prematurata la supercazzola converge
con vero, sogno, 0, vero, sogno o scherziamo?!
blinda la supercazzola antanizzata con mino Sassaroli, mano Sassaroli,
piede Sassaroli, fuochino Sassaroli, mono Sassaroli, pastene Sassaroli o scherziamo?
voglio ispettore, Mascetti come se fosse 10 voglio una pulitina, Sassaroli
come fosse mino stuzzica fuochino come se fosse fuochino più pastene stuzzica
mino come se fosse mino più piede prematurata la supercazzola densa con bituma e
prematurata la supercazzola bitumata come sempre e
ancora con mino, fuochino o scherziamo? o scherziamo? bituma no eh! Lo ripeto
e brematura anche, se mino minore di mano mino come se fosse la pulitina
ispettore a posterdati e brematura anche, se fuochino minore di mono
blinda la supercazzola cofandina con vero Sassaroli, l'immagine Sassaroli,
la grandezza Sassaroli, il finale Sassaroli o scherziamo? bituma come sempre
prematurata la supercazzola antanizzata con vero, vero più la grandezza
per 78, grandezza, immagine, immagine più il finale per 40, il finale
o scherziamo?
Lei ha clacsonato prematurata la supercazzola cofandina con
-2.3, -1.3, 0.05, 0.07 o scherziamo?

63
examples/mandelbrot.pc Normal file
View File

@ -0,0 +1,63 @@
idromassaggiatore densa con pavido Canessa innocente
venga una testimone, Vanni
lei conosce il pavido?
maggiore di 8: testimone è amico di 32
o merenda maggiore di 4: testimone è amico di 46
o merenda maggiore di 2: testimone è amico di 43
insomma: testimone è amico di 42
e facevate le merende insieme
testimone è espulso dall'aula
idromassaggiatore Canessa converge con
vero Canessa, sogno Canessa, passo Pacciani,
destinazione Canessa, finta Canessa innocente
venga l' usciere, Canessa è amico di vero per vero più sogno per sogno il nostro signore Gesù quello nautico però
lei conosce il passo?
maggiore di 255:
seduti un passo!
insomma: lei conosce l' usciere?
maggiore di 4: seduti il passo!
insomma:
seduti
noi condividiamo converge con
vero per vero meno un sogno per il sogno più la destinazione,
2 per il vero per il sogno più la finta,
il passo più 1,
destinazione, finta
innocente!
e facevate le merende insieme
e facevate le merende insieme il nostro signore Gesù dico io!
idromassaggiatore Canessa ancora con il vero Canessa, un sogno Canessa innocente
seduti noi condividiamo converge con vero, sogno, 0, vero, sogno innocente!
idromassaggiatore poeticamente con
mino Canessa, mano Canessa, piede Canessa,
fuochino Canessa, mono Canessa, pastene Canessa innocente
venga ispettore, Vanni è amico di 10
venga una pulitina, Canessa è amico di mino
allora
fuochino è amico di fuochino più pastene
allora
mino è amico di mino più piede
noi condividiamo densa con noi condividiamo
il nostro signore Gesùta come sempre e
ancora con mino, fuochino innocente innocente il nostro signore Gesù no eh! Lo ripeto
si calmi, se mino minore di mano
mino è amico di la pulitina
ispettore è espulso dall'aula
si calmi, se fuochino minore di mono
idromassaggiatore pavido con
vero Canessa, l'immagine Canessa,
la grandezza Canessa, il finale Canessa il nostro signore Gesù come sempre
innocente
noi condividiamo poeticamente con
vero, vero più la grandezza per 78, grandezza,
immagine, immagine più il finale per 40, il finale
innocente
Tutti in piedi
noi condividiamo pavido con
-2.3, -1.3, 0.05, 0.07
innocente

View File

@ -1,20 +0,0 @@
Lei ha clacsonato
voglio uno, Necchi come se fosse 1
voglio antani, Necchi come se fosse uno
voglio il massimo, Necchi come se fosse antani per 100
antani per 2 a posterdati
stuzzica
antani come se fosse antani più uno
voglio l'amico, Necchi come se fosse 2
voglio un controllo, Melandri come se fosse uno
stuzzica
voglio vicino, Necchi come se fosse antani diviso l'amico per un amico
che cos'è antani? vicino:
controllo come se fosse 0
e velocità di esecuzione
amico come se fosse amico più uno
e brematura anche, se amico minore di antani
che cos'è il controllo? uno:
antani a posterdati
e velocità di esecuzione
e brematura anche, se antani minore del massimo

20
examples/primes.beauty.pc Normal file
View File

@ -0,0 +1,20 @@
Tutti in piedi
venga uno, Pacciani è amico di 1
venga amico, Pacciani è amico di uno
venga il massimo, Pacciani è amico di amico per 100
amico per 2 è espulso dall'aula
allora
amico è amico di amico più uno
venga l'amico, Pacciani è amico di 2
venga un controllo, Lotti è amico di uno
allora
venga vicino, Pacciani è amico di amico diviso l'amico per un amico
lei conosce amico? vicino:
controllo è amico di 0
e facevate le merende insieme
amico è amico di amico più uno
si calmi, se amico minore di amico
lei conosce il controllo? uno:
amico è espulso dall'aula
e facevate le merende insieme
si calmi, se amico minore del massimo

View File

@ -1,11 +0,0 @@
Lei ha clacsonato
voglio uno, Necchi come se fosse 1 voglio antani, Necchi come se fosse uno,
voglio il massimo, Necchi come se fosse antani per 100 antani per 2 a posterdati
stuzzica antani come se fosse antani più uno, voglio l'amico, Necchi
come se fosse 2 voglio un controllo, Melandri come se fosse uno stuzzica
voglio vicino, Necchi come se fosse antani diviso l'amico per un amico,
che cos'è antani? vicino: controllo come se fosse 0 e velocità di esecuzione,
amico come se fosse amico più uno e brematura anche, se amico minore di antani,
che cos'è il controllo? uno: antani a posterdati e velocità di esecuzione
e brematura anche, se antani minore del massimo

11
examples/primes.pc Normal file
View File

@ -0,0 +1,11 @@
Tutti in piedi
venga uno, Pacciani è amico di 1 venga amico, Pacciani è amico di uno,
venga il massimo, Pacciani è amico di amico per 100 amico per 2 è espulso dall'aula
allora amico è amico di amico più uno, venga l'amico, Pacciani
è amico di 2 venga un controllo, Lotti è amico di uno allora
venga vicino, Pacciani è amico di amico diviso l'amico per un amico,
lei conosce amico? vicino: controllo è amico di 0 e facevate le merende insieme,
amico è amico di amico più uno si calmi, se amico minore di amico,
lei conosce il controllo? uno: amico è espulso dall'aula e facevate le merende insieme
si calmi, se amico minore del massimo

View File

@ -1,5 +0,0 @@
Lei ha clacsonato
voglio antani, Necchi come se fosse 2
stuzzica
vaffanzum!
e brematura anche, se antani per 2

5
examples/return.pc Normal file
View File

@ -0,0 +1,5 @@
Tutti in piedi
venga mario, Pacciani è amico di 2
allora
seduti!
si calmi, se mario per 2

View File

@ -1,46 +0,0 @@
# This is a beautified version of test.mc
#
# This program will produce not-compilable output, it's used to test
# all the features of the compiler, including those that are not yet ready.
bituma per caso una piccola prova?
Lei ha clacsonato
voglio il dito, conte Mascetti
voglio antani, Necchi come fosse 2
voglio troppo, Melandri
stuzzica
il dito come fosse antani
e brematura anche, se vicesindaco maggiore di antani
vicesindaco come se fosse antani con scappellamento a destra per 2
che cos'è il genio?
fantasia:
vicesindaco come fosse vicesindaco per antani,
o magari intuizione:
mi porga il cappellano,
zingarata come fosse cappellano più uno,
zingarata a posterdati,
o magari maggiore di mobiletto:
genio a posterdati,
o tarapia tapioco:
mi porga il cappello
e velocità di esecuzione
vicesindaco a posterdati
mi porga il vicesindaco,
brematurata la supercazzola tombale con alfio, serio o scherziamo?
avvertite don ulrico,
ho visto la signora!
vicesindaco come se fosse brematurata la supercazzola avanti con il vicesindaco o scherziamo,
vaffanzum 0!
blinda la supercazzola Necchi antanizzata con alfio Mascetti, barilotto Necchi o scherziamo?
vaffanzum alfio meno 2!
bituma al finale?

46
examples/syntax.beauty.pc Normal file
View File

@ -0,0 +1,46 @@
# This is a beautified version of test.mc
#
# This program will produce not-compilable output, it's used to test
# all the features of the compiler, including those that are not yet ready.
il nostro signore Gesù per caso una piccola prova?
Tutti in piedi
venga il dito, conte Vanni
venga antani, Pacciani è amico di 2
venga troppo, Lotti
allora
il dito è amico di antani
si calmi, se giudice maggiore di antani
giudice è amico di firenze con saluto romano a destra per 2
lei conosce il genio?
fantasia:
giudice è amico di giudice per antani,
o merenda intuizione:
chiamo a testimoniare il cappellano,
zingarata è amico di cappellano più uno,
zingarata è espulso dall'aula,
o merenda maggiore di mobiletto:
genio è espulso dall'aula,
insomma:
chiamo a testimoniare il cappello
e facevate le merende insieme
giudice è espulso dall'aula
chiamo a testimoniare il giudice,
noi condividiamo tombale con alfio, serio innocente
viva idduce,
ma cosa dice la signora!
giudice è amico di noi condividiamo avanti con il giudice o scherziamo,
seduti 0!
idromassaggiatore Pacciani poeticamente con alfio Vanni, barilotto Pacciani innocente
seduti alfio meno 2!
il nostro signore Gesù al finale?

View File

@ -1,14 +0,0 @@
bituma per caso una piccola prova?
Lei ha clacsonato voglio il dito, conte Mascetti, voglio antani, Necchi
come fosse 2, voglio troppo, Melandri, stuzzica il dito come fosse antani
e brematura anche, se vicesindaco maggiore di antani vicesindaco come se fosse
antani con scappellamento a destra per 2, che cos'è il genio? fantasia:
vicesindaco come fosse vicesindaco per antani, o magari intuizione:
mi porga il cappellano, zingarata come fosse cappellano più uno, zingarata
a posterdati, o magari maggiore di mobiletto: genio a posterdati,
o tarapia tapioco: mi porga il cappello e velocità di esecuzione,
vicesindaco a posterdati, mi porga il vicesindaco, brematurata la supercazzola
tombale con alfio, serio o scherziamo? avvertite don ulrico, ho visto la signora!
vicesindaco come se fosse brematurata la supercazzola avanti con il vicesindaco
o scherziamo, vaffanzum 0! blinda la supercazzola Necchi antanizzata con alfio
Mascetti o scherziamo? vaffanzum alfio meno 2! bituma al finale?

14
examples/syntax.pc Normal file
View File

@ -0,0 +1,14 @@
il nostro signore Gesù per caso una piccola prova?
Tutti in piedi venga il dito, conte Vanni, venga antani, Pacciani
è amico di 2, venga troppo, Lotti, allora il dito è amico di firenze
si calmi, se giudice maggiore di firenze giudice è amico di
firenze con saluto romano a destra per 2, lei conosce il genio? fantasia:
giudice è amico di giudice per antani, o merenda intuizione:
chiamo a testimoniare il cappellano, zingarata è amico di cappellano più uno, zingarata
è espulso dall'aula, o merenda maggiore di mobiletto: genio è espulso dall'aula,
insomma: chiamo a testimoniare il cappello e facevate le merende insieme,
giudice è espulso dall'aula, chiamo a testimoniare il giudice, noi condividiamo
tombale con alfio, serio innocente viva idduce, ma cosa dice la signora!
giudice è amico di noi condividiamo avanti con il giudice
o scherziamo, seduti 0! idromassaggiatore Pacciani poeticamente con alfio
Vanni innocente seduti alfio meno 2! il nostro signore Gesù al finale?

View File

@ -1,4 +1,4 @@
MCC=mcc PCC=pcc
all: turtle all: turtle
@ -8,7 +8,7 @@ clean:
turtle.mc:; turtle.mc:;
%.mc.o: %.mc %.mc.o: %.mc
$(MCC) -c $< -o $@ $(PCC) -c $< -o $@
turtle: turtle.mc.o turtle.cpp turtle: turtle.mc.o turtle.cpp
$(CXX) -std=c++11 $^ -lcairo -o $@ $(CXX) -std=c++11 $^ -lcairo -o $@

View File

@ -1,10 +0,0 @@
blinda la supercazzola cofandina con x Necchi, y Necchi o scherziamo?
blinda la supercazzola pastene con w Sassaroli o scherziamo?
blinda la supercazzola ispettore con x Sassaroli, y Sassaroli o scherziamo?
blinda la supercazzola barilotto o scherziamo?
Lei ha clacsonato
prematurata la supercazzola cofandina con 200, 200 o scherziamo?
prematurata la supercazzola pastene con 3 o scherziamo?
prematurata la supercazzola ispettore con 200, 200 o scherziamo?
prematurata la supercazzola barilotto o scherziamo?

10
examples/turtle/turtle.pc Normal file
View File

@ -0,0 +1,10 @@
idromassaggiatore firenze con x Pacciani, y Pacciani innocente
idromassaggiatore arezzo con w Canessa innocente
idromassaggiatore prato con x Canessa, y Canessa innocente
idromassaggiatore viareggio innocente
Tutti in piedi
noi condividiamo firenze con 200, 200 innocente
noi condividiamo arezzo con 3 innocente
noi condividiamo prato con 200, 200 innocente
noi condividiamo viareggio innocente

View File

@ -1,11 +1,11 @@
# Copyright 2017 the Monicelli project authors. All rights reserved. # Copyright 2017 the Monicelli project authors. All rights reserved.
# Use of this source code is governed by a GPLv3 license, see LICENSE.txt. # Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
set(MONICELLI_ARCH "x86" CACHE STRING "Target architecture for Monicelli.") set(PACCIANI_ARCH "x86" CACHE STRING "Target architecture for Pacciani.")
set(MONICELLI_LLVM_VERSION 14 CACHE STRING "LLVM version for Monicelli.") set(PACCIANI_LLVM_VERSION 14 CACHE STRING "LLVM version for Pacciani.")
set(MONICELLI_LINKER ON CACHE BOOL "Enable the Monicelli linker. Requires POSIX.") set(PACCIANI_LINKER ON CACHE BOOL "Enable the Pacciani linker. Requires POSIX.")
find_package(LLVM "${MONICELLI_LLVM_VERSION}" REQUIRED CONFIG) find_package(LLVM "${PACCIANI_LLVM_VERSION}" REQUIRED CONFIG)
find_package(Ragel REQUIRED) find_package(Ragel REQUIRED)
add_ragel_library(lexer add_ragel_library(lexer
@ -15,7 +15,7 @@ add_ragel_library(lexer
lexer.def lexer.def
) )
add_executable(mcc add_executable(pcc
main.cpp main.cpp
asmgen.cpp asmgen.cpp
codegen.cpp codegen.cpp
@ -34,27 +34,27 @@ add_executable(mcc
operators.def operators.def
) )
set_target_properties(mcc lexer set_target_properties(pcc lexer
PROPERTIES PROPERTIES
CXX_STANDARD 14 CXX_STANDARD 14
CXX_STANDARD_REQUIRED true CXX_STANDARD_REQUIRED true
) )
target_include_directories(mcc PRIVATE ${LLVM_INCLUDE_DIRS}) target_include_directories(pcc PRIVATE ${LLVM_INCLUDE_DIRS})
target_compile_definitions(mcc PRIVATE ${LLVM_DEFINITIONS}) target_compile_definitions(pcc PRIVATE ${LLVM_DEFINITIONS})
target_link_libraries(mcc PRIVATE lexer) target_link_libraries(pcc PRIVATE lexer)
llvm_config(mcc llvm_config(pcc
core core
support support
"${MONICELLI_ARCH}codegen" "${PACCIANI_ARCH}codegen"
"${MONICELLI_ARCH}asmparser" "${PACCIANI_ARCH}asmparser"
) )
if (MONICELLI_LINKER) if (PACCIANI_LINKER)
target_compile_definitions(mcc PRIVATE MONICELLI_ENABLE_LINKER) target_compile_definitions(pcc PRIVATE PACCIANI_ENABLE_LINKER)
endif() endif()
install(TARGETS mcc RUNTIME DESTINATION bin) install(TARGETS pcc RUNTIME DESTINATION bin)

View File

@ -16,13 +16,13 @@
#include <iostream> #include <iostream>
#include <string> #include <string>
#ifdef MONICELLI_ENABLE_LINKER #ifdef PACCIANI_ENABLE_LINKER
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <unistd.h> #include <unistd.h>
#endif #endif
namespace monicelli { namespace pacciani {
void registerTargets() { void registerTargets() {
llvm::InitializeNativeTarget(); llvm::InitializeNativeTarget();
@ -68,7 +68,7 @@ void writeAssembly(const std::string& to_filename, llvm::Module* module,
output.flush(); output.flush();
} }
#ifdef MONICELLI_ENABLE_LINKER #ifdef PACCIANI_ENABLE_LINKER
static const char* C_COMPILER = "c99"; static const char* C_COMPILER = "c99";
@ -120,4 +120,4 @@ void linkAssembly(const std::string& output_name, const std::vector<std::string>
#endif #endif
} // namespace monicelli } // namespace pacciani

View File

@ -1,5 +1,5 @@
#ifndef MONICELLI_ASMGEN_H #ifndef PACCIANI_ASMGEN_H
#define MONICELLI_ASMGEN_H #define PACCIANI_ASMGEN_H
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
@ -10,7 +10,7 @@
#include <string> #include <string>
#include <vector> #include <vector>
namespace monicelli { namespace pacciani {
void registerTargets(); void registerTargets();
@ -20,11 +20,11 @@ llvm::TargetMachine* getTargetMachine(const std::string& triple, const std::stri
void writeAssembly(const std::string& to_filename, llvm::Module* module, void writeAssembly(const std::string& to_filename, llvm::Module* module,
llvm::TargetMachine* target_machine); llvm::TargetMachine* target_machine);
#ifdef MONICELLI_ENABLE_LINKER #ifdef PACCIANI_ENABLE_LINKER
void linkAssembly(const std::string& output_name, const std::vector<std::string>& object_files, void linkAssembly(const std::string& output_name, const std::vector<std::string>& object_files,
bool keep_object_files = false); bool keep_object_files = false);
#endif #endif
} // namespace monicelli } // namespace pacciani
#endif #endif

View File

@ -6,7 +6,7 @@
#include <iostream> #include <iostream>
using namespace monicelli; using namespace pacciani;
namespace { namespace {
@ -257,11 +257,11 @@ private:
} // namespace } // namespace
namespace monicelli { namespace pacciani {
void printAst(std::ostream& stream, const AstNode* node) { void printAst(std::ostream& stream, const AstNode* node) {
AstPrinter printer{stream}; AstPrinter printer{stream};
printer.visit(node); printer.visit(node);
} }
} // namespace monicelli } // namespace pacciani

View File

@ -1,17 +1,17 @@
#ifndef MONICELLI_AST_PRINTER_H #ifndef PACCIANI_AST_PRINTER_H
#define MONICELLI_AST_PRINTER_H #define PACCIANI_AST_PRINTER_H
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
#include <iostream> #include <iostream>
namespace monicelli { namespace pacciani {
class AstNode; class AstNode;
void printAst(std::ostream& stream, const AstNode* node); void printAst(std::ostream& stream, const AstNode* node);
} // namespace monicelli } // namespace pacciani
#endif #endif

View File

@ -1,5 +1,5 @@
#ifndef MONICELLI_AST_VISITOR_H #ifndef PACCIANI_AST_VISITOR_H
#define MONICELLI_AST_VISITOR_H #define PACCIANI_AST_VISITOR_H
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
@ -8,7 +8,7 @@
#include "ast.h" #include "ast.h"
#include "errors.h" #include "errors.h"
namespace monicelli { namespace pacciani {
#define DECLARE_CLASS(NAME) class NAME; #define DECLARE_CLASS(NAME) class NAME;
@ -43,6 +43,6 @@ private:
#undef DEFAULT_VISIT #undef DEFAULT_VISIT
#undef DISPATCH_CONST_STATEMENT #undef DISPATCH_CONST_STATEMENT
} // namespace monicelli } // namespace pacciani
#endif #endif

View File

@ -4,7 +4,7 @@
#include "ast.h" #include "ast.h"
#include "errors.h" #include "errors.h"
namespace monicelli { namespace pacciani {
// static // static
const char* BinaryExpression::getOperatorRepresentation(BinaryExpression::Type type) { const char* BinaryExpression::getOperatorRepresentation(BinaryExpression::Type type) {
@ -19,4 +19,4 @@ const char* BinaryExpression::getOperatorRepresentation(BinaryExpression::Type t
} }
} }
} // namespace monicelli } // namespace pacciani

View File

@ -1,5 +1,5 @@
#ifndef MONICELLI_AST_DEF #ifndef PACCIANI_AST_DEF
#define MONICELLI_AST_DEF #define PACCIANI_AST_DEF
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.

View File

@ -1,5 +1,5 @@
#ifndef MONICELLI_AST_H #ifndef PACCIANI_AST_H
#define MONICELLI_AST_H #define PACCIANI_AST_H
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
@ -13,7 +13,7 @@
#include <string> #include <string>
#include <vector> #include <vector>
namespace monicelli { namespace pacciani {
class Variable final : public LocationMixin { class Variable final : public LocationMixin {
public: public:
@ -443,6 +443,6 @@ private:
friend class Parser; friend class Parser;
}; };
} // namespace monicelli } // namespace pacciani
#endif #endif

View File

@ -26,7 +26,7 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
using namespace monicelli; using namespace pacciani;
namespace { namespace {
@ -758,7 +758,7 @@ llvm::Type* ResultTypeCalculator::visitFunctionCallExpression(const FunctionCall
return f->getReturnType(); return f->getReturnType();
} }
namespace monicelli { namespace pacciani {
std::unique_ptr<llvm::Module> generateIR(llvm::LLVMContext& context, Module* ast) { std::unique_ptr<llvm::Module> generateIR(llvm::LLVMContext& context, Module* ast) {
IRGenerator codegen{context, ast->getSourceFilename()}; IRGenerator codegen{context, ast->getSourceFilename()};
@ -785,4 +785,4 @@ void printIR(std::ostream& stream, llvm::Module* module) {
module->print(llvm_stream, nullptr); module->print(llvm_stream, nullptr);
} }
} // namespace monicelli } // namespace pacciani

View File

@ -1,5 +1,5 @@
#ifndef MONICELLI_CODEGEN_DEF #ifndef PACCIANI_CODEGEN_DEF
#define MONICELLI_CODEGEN_DEF #define PACCIANI_CODEGEN_DEF
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.

View File

@ -1,5 +1,5 @@
#ifndef MONICELLI_CODEGEN_H #ifndef PACCIANI_CODEGEN_H
#define MONICELLI_CODEGEN_H #define PACCIANI_CODEGEN_H
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
@ -8,7 +8,7 @@
#include "llvm/IR/Module.h" #include "llvm/IR/Module.h"
#include <memory> #include <memory>
namespace monicelli { namespace pacciani {
class Module; class Module;
@ -18,6 +18,6 @@ void runFunctionOptimizer(llvm::Module* module);
void printIR(std::ostream& stream, llvm::Module* module); void printIR(std::ostream& stream, llvm::Module* module);
} // namespace monicelli } // namespace pacciani
#endif #endif

View File

@ -8,7 +8,7 @@
#include <iostream> #include <iostream>
#include <string> #include <string>
namespace monicelli { namespace pacciani {
[[noreturn]] void UNREACHABLE(const std::string& message) { [[noreturn]] void UNREACHABLE(const std::string& message) {
std::cerr << message << '\n'; std::cerr << message << '\n';
@ -49,4 +49,4 @@ void ErrorReportingMixin::printErrorLocation(std::ostream& stream, const Locatio
stream << '\n' << from << ": error: "; stream << '\n' << from << ": error: ";
} }
} // namespace monicelli } // namespace pacciani

View File

@ -1,5 +1,5 @@
#ifndef MONICELLI_ERRORS_H #ifndef PACCIANI_ERRORS_H
#define MONICELLI_ERRORS_H #define PACCIANI_ERRORS_H
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
@ -10,7 +10,7 @@
#include <iostream> #include <iostream>
#include <string> #include <string>
namespace monicelli { namespace pacciani {
[[noreturn]] void UNREACHABLE(const std::string& message); [[noreturn]] void UNREACHABLE(const std::string& message);
@ -54,6 +54,6 @@ private:
std::string source_filename_; std::string source_filename_;
}; };
} // namespace monicelli } // namespace pacciani
#endif #endif

View File

@ -1,5 +1,5 @@
#ifndef MONICELLI_ITERATORS_H #ifndef PACCIANI_ITERATORS_H
#define MONICELLI_ITERATORS_H #define PACCIANI_ITERATORS_H
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
@ -7,7 +7,7 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
namespace monicelli { namespace pacciani {
template<typename T> class PointerVectorConstIter final { template<typename T> class PointerVectorConstIter final {
public: public:
@ -43,6 +43,6 @@ private:
IterT end_; IterT end_;
}; };
} // namespace monicelli } // namespace pacciani
#endif #endif

View File

@ -6,7 +6,7 @@
#include <cstring> #include <cstring>
namespace monicelli { namespace pacciani {
static const char* builtinTypeToString(Token::BuiltinTypeValue type) { static const char* builtinTypeToString(Token::BuiltinTypeValue type) {
switch (type) { switch (type) {
@ -99,4 +99,4 @@ void Lexer::advanceBuffer() {
buffer_.imbue(input_); buffer_.imbue(input_);
} }
} // namespace monicelli } // namespace pacciani

View File

@ -1,5 +1,5 @@
#ifndef MONICELLI_LEXER_DEF #ifndef PACCIANI_LEXER_DEF
#define MONICELLI_LEXER_DEF #define PACCIANI_LEXER_DEF
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.

View File

@ -1,5 +1,5 @@
#ifndef MONICELLI_LEXER_H #ifndef PACCIANI_LEXER_H
#define MONICELLI_LEXER_H #define PACCIANI_LEXER_H
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
@ -13,7 +13,7 @@
#include <memory> #include <memory>
#include <string> #include <string>
namespace monicelli { namespace pacciani {
class Token final : public LocationMixin { class Token final : public LocationMixin {
public: public:
@ -181,6 +181,6 @@ private:
bool trace_enabled_; bool trace_enabled_;
}; };
} // namespace monicelli } // namespace pacciani
#endif #endif

View File

@ -13,10 +13,9 @@ accent_u = "u`"|"ù";
accent_vowels = "à"|"è"|"é"|"ì"|"ò"|"ó"|"ù"| [aeiou] "`"; accent_vowels = "à"|"è"|"é"|"ì"|"ò"|"ó"|"ù"| [aeiou] "`";
articles = "il"|"lo"|"la"|"l'"|"i"|"gli"|"le"|"un"|"un'"|"una"|"dei"|"delle"; articles = "il"|"lo"|"la"|"l'"|"i"|"gli"|"le"|"un"|"un'"|"una"|"dei"|"delle";
di = "di"|"dei"|"del"|"della"|"dell'"; di = "di"|"dei"|"del"|"della"|"dell'";
prematura = [bp] "rematura";
supercazzola = "supercazzo" [lr] "a"; supercazzola = "supercazzo" [lr] "a";
comment_start = "il"|"al"|"con"|"per"|"con il"|"per il";
comment = "#"|"bituma"; comment = "#"|(comment_start " "[nN]"ostro "[sS]"ignore "[Gg]"es" accent_u);
identifier = (alpha | accent_vowels) (alnum | accent_vowels)*; identifier = (alpha | accent_vowels) (alnum | accent_vowels)*;
integer = [+\-]? digit+; integer = [+\-]? digit+;
float = [+\-]? (digit* "." digit+ | digit+ "."?) [eE] [+\-]? digit+ float = [+\-]? (digit* "." digit+ | digit+ "."?) [eE] [+\-]? digit+
@ -41,59 +40,59 @@ initial := |*
"meno" => { SET_TOKEN(OP_MINUS); fbreak; }; "meno" => { SET_TOKEN(OP_MINUS); fbreak; };
"per" => { SET_TOKEN(OP_TIMES); fbreak; }; "per" => { SET_TOKEN(OP_TIMES); fbreak; };
"diviso" => { SET_TOKEN(OP_DIV); fbreak; }; "diviso" => { SET_TOKEN(OP_DIV); fbreak; };
"con scappellamento a" => { advanceColumn(); fgoto shift; }; "con saluto romano a" => { advanceColumn(); fgoto shift; };
"minore " di => { SET_TOKEN(OP_LT); fbreak; }; "minore " di => { SET_TOKEN(OP_LT); fbreak; };
"maggiore " di => { SET_TOKEN(OP_GT); fbreak; }; "maggiore " di => { SET_TOKEN(OP_GT); fbreak; };
"minore " "o "? "uguale " ("a"|di) => { SET_TOKEN(OP_LE); fbreak; }; "minore " "o "? "uguale " ("a"|di) => { SET_TOKEN(OP_LE); fbreak; };
"maggiore " "o "? "uguale " ("a"|di) => { SET_TOKEN(OP_GE); fbreak; }; "maggiore " "o "? "uguale " ("a"|di) => { SET_TOKEN(OP_GE); fbreak; };
"vaffanzum" => { SET_TOKEN(RETURN); fbreak; }; "seduti" => { SET_TOKEN(RETURN); fbreak; };
"voglio" => { SET_TOKEN(VARDECL); fbreak; }; "venga" => { SET_TOKEN(VARDECL); fbreak; };
"come " ("se "?) "fosse" => { SET_TOKEN(ASSIGN); fbreak; }; accent_e " amico " di => { SET_TOKEN(ASSIGN); fbreak; };
"a posterdati" => { SET_TOKEN(PRINT); fbreak; }; ("sono"|accent_e) " espuls"[oaei]" dall'aula" => { SET_TOKEN(PRINT); fbreak; };
"mi porga" => { SET_TOKEN(INPUT); fbreak; }; "chiamo a testimoniare" => { SET_TOKEN(INPUT); fbreak; };
"ho visto" => { SET_TOKEN(ASSERT); fbreak; }; "ma cosa dice" => { SET_TOKEN(ASSERT); fbreak; };
"avvertite don ulrico" => { SET_TOKEN(ABORT); fbreak; }; "viva idduce" => { SET_TOKEN(ABORT); fbreak; };
"stuzzica" => { SET_TOKEN(LOOP_BEGIN); fbreak; }; "allora" => { SET_TOKEN(LOOP_BEGIN); fbreak; };
"e " prematura " anche, se" => { SET_TOKEN(LOOP_CONDITION); fbreak; }; "si calmi, se" => { SET_TOKEN(LOOP_CONDITION); fbreak; };
"che cos'" accent_e => { SET_TOKEN(BRANCH_CONDITION); fbreak; }; "lei conosce" => { SET_TOKEN(BRANCH_CONDITION); fbreak; };
"o tarapia tapioco" => { SET_TOKEN(BRANCH_ELSE); fbreak; }; "insomma" => { SET_TOKEN(BRANCH_ELSE); fbreak; };
"e velocit" accent_a " di esecuzione" => { SET_TOKEN(BRANCH_END); fbreak; }; "e facevate le merende insieme" => { SET_TOKEN(BRANCH_END); fbreak; };
"o magari" => { SET_TOKEN(CASE_END); fbreak; }; "o merenda" => { SET_TOKEN(CASE_END); fbreak; };
"Lei ha clacsonato" => { SET_TOKEN(ENTRY_POINT); fbreak; }; "Tutti in piedi" => { SET_TOKEN(ENTRY_POINT); fbreak; };
"blinda la " supercazzola => { SET_TOKEN(FUN_DECL); fbreak; }; "idromassaggiatore" => { SET_TOKEN(FUN_DECL); fbreak; };
"con" => { SET_TOKEN(FUN_PARAMS); fbreak; }; "con" => { SET_TOKEN(FUN_PARAMS); fbreak; };
prematura "ta la " supercazzola => { SET_TOKEN(FUN_CALL); fbreak; }; "noi condividiamo" => { SET_TOKEN(FUN_CALL); fbreak; };
"o scherziamo" ("?"?) => { SET_TOKEN(FUN_END); fbreak; }; "innocente" => { SET_TOKEN(FUN_END); fbreak; };
"Necchi" => { "Pacciani" => {
SET_TOKEN(TYPENAME); SET_TOKEN(TYPENAME);
token->setBuiltinTypeValue(Token::BUILTIN_TYPE_INTEGER); token->setBuiltinTypeValue(Token::BUILTIN_TYPE_INTEGER);
fbreak; fbreak;
}; };
"Mascetti" => { "Vanni" => {
SET_TOKEN(TYPENAME); SET_TOKEN(TYPENAME);
token->setBuiltinTypeValue(Token::BUILTIN_TYPE_CHAR); token->setBuiltinTypeValue(Token::BUILTIN_TYPE_CHAR);
fbreak; fbreak;
}; };
"Perozzi" => { "Pucci" => {
SET_TOKEN(TYPENAME); SET_TOKEN(TYPENAME);
token->setBuiltinTypeValue(Token::BUILTIN_TYPE_FLOAT); token->setBuiltinTypeValue(Token::BUILTIN_TYPE_FLOAT);
fbreak; fbreak;
}; };
"Melandri" => { "Lotti" => {
SET_TOKEN(TYPENAME); SET_TOKEN(TYPENAME);
token->setBuiltinTypeValue(Token::BUILTIN_TYPE_BOOL); token->setBuiltinTypeValue(Token::BUILTIN_TYPE_BOOL);
fbreak; fbreak;
}; };
"Sassaroli" => { "Canessa" => {
SET_TOKEN(TYPENAME); SET_TOKEN(TYPENAME);
token->setBuiltinTypeValue(Token::BUILTIN_TYPE_DOUBLE); token->setBuiltinTypeValue(Token::BUILTIN_TYPE_DOUBLE);
fbreak; fbreak;
@ -134,7 +133,7 @@ initial := |*
#include <string> #include <string>
namespace monicelli { namespace pacciani {
#define SET_TOKEN(NAME) \ #define SET_TOKEN(NAME) \
do { \ do { \

View File

@ -1,12 +1,12 @@
#ifndef MONICELLI_LOCATION_H #ifndef PACCIANI_LOCATION_H
#define MONICELLI_LOCATION_H #define PACCIANI_LOCATION_H
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
#include <iostream> #include <iostream>
namespace monicelli { namespace pacciani {
class Location final { class Location final {
public: public:
@ -54,6 +54,6 @@ static inline bool operator==(const Location& a, const Location& b) {
return a.getLine() == b.getLine() && a.getColumn() == b.getColumn(); return a.getLine() == b.getLine() && a.getColumn() == b.getColumn();
} }
} // namespace monicelli } // namespace pacciani
#endif #endif

View File

@ -13,7 +13,7 @@
#include <string> #include <string>
#include <vector> #include <vector>
using namespace monicelli; using namespace pacciani;
int main(int argc, char** argv) { int main(int argc, char** argv) {
ProgramOptions options = ProgramOptions::fromCommandLine(argc, argv); ProgramOptions options = ProgramOptions::fromCommandLine(argc, argv);
@ -35,7 +35,7 @@ int main(int argc, char** argv) {
auto target_machine = auto target_machine =
getTargetMachine(triple, options.getCPU(), options.getCPUFeatures(), options.shouldEmitPIC()); getTargetMachine(triple, options.getCPU(), options.getCPUFeatures(), options.shouldEmitPIC());
#ifdef MONICELLI_ENABLE_LINKER #ifdef PACCIANI_ENABLE_LINKER
std::vector<std::string> object_filenames; std::vector<std::string> object_filenames;
object_filenames.reserve(options.input_filenames_size()); object_filenames.reserve(options.input_filenames_size());
#endif #endif
@ -78,12 +78,12 @@ int main(int argc, char** argv) {
writeAssembly(object_filename, ir.get(), target_machine); writeAssembly(object_filename, ir.get(), target_machine);
#ifdef MONICELLI_ENABLE_LINKER #ifdef PACCIANI_ENABLE_LINKER
object_filenames.emplace_back(std::move(object_filename)); object_filenames.emplace_back(std::move(object_filename));
#endif #endif
} }
#ifdef MONICELLI_ENABLE_LINKER #ifdef PACCIANI_ENABLE_LINKER
if (!options.shouldSkipCompilation() && !options.shouldOnlyCompile() && if (!options.shouldSkipCompilation() && !options.shouldOnlyCompile() &&
!object_filenames.empty()) { !object_filenames.empty()) {
linkAssembly(options.getOutputFilename(), object_filenames); linkAssembly(options.getOutputFilename(), object_filenames);

View File

@ -1,5 +1,5 @@
#ifndef MONICELLI_OPERATORS_DEF #ifndef PACCIANI_OPERATORS_DEF
#define MONICELLI_OPERATORS_DEF #define PACCIANI_OPERATORS_DEF
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.

View File

@ -7,7 +7,7 @@
#include <cstring> #include <cstring>
#include <iostream> #include <iostream>
namespace monicelli { namespace pacciani {
// static // static
ProgramOptions ProgramOptions::fromCommandLine(int argc, char** argv) { ProgramOptions ProgramOptions::fromCommandLine(int argc, char** argv) {
@ -41,7 +41,7 @@ ProgramOptions ProgramOptions::fromCommandLine(int argc, char** argv) {
options.emit_pic_ = false; options.emit_pic_ = false;
continue; continue;
} }
#ifdef MONICELLI_ENABLE_LINKER #ifdef PACCIANI_ENABLE_LINKER
if (strcmp(argv[i], "-c") == 0 || strcmp(argv[i], "--only-compile") == 0) { if (strcmp(argv[i], "-c") == 0 || strcmp(argv[i], "--only-compile") == 0) {
options.compile_only_ = true; options.compile_only_ = true;
continue; continue;
@ -71,7 +71,7 @@ ProgramOptions ProgramOptions::fromCommandLine(int argc, char** argv) {
} }
options.input_filenames_.emplace_back(argv[i]); options.input_filenames_.emplace_back(argv[i]);
} }
#ifndef MONICELLI_ENABLE_LINKER #ifndef PACCIANI_ENABLE_LINKER
options.compile_only_ = true; options.compile_only_ = true;
#endif #endif
return options; return options;
@ -82,7 +82,7 @@ void ProgramOptions::printHelp(const char* program_name) {
std::cout << "Usage: " << program_name std::cout << "Usage: " << program_name
<< " [options...] [input.mc ...]\n\n" << " [options...] [input.mc ...]\n\n"
"Options:\n" "Options:\n"
#ifdef MONICELLI_ENABLE_LINKER #ifdef PACCIANI_ENABLE_LINKER
" --only-compile, -c : Compile only, do not link.\n" " --only-compile, -c : Compile only, do not link.\n"
#endif #endif
" --no-compile, -n : Do not compile, only print (see below).\n" " --no-compile, -n : Do not compile, only print (see below).\n"
@ -98,4 +98,4 @@ void ProgramOptions::printHelp(const char* program_name) {
exit(0); exit(0);
} }
} // namespace monicelli } // namespace pacciani

View File

@ -1,15 +1,15 @@
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
#ifndef MONICELLI_OPTIONS_H #ifndef PACCIANI_OPTIONS_H
#define MONICELLI_OPTIONS_H #define PACCIANI_OPTIONS_H
#include "iterators.h" #include "iterators.h"
#include <string> #include <string>
#include <vector> #include <vector>
namespace monicelli { namespace pacciani {
class ProgramOptions final { class ProgramOptions final {
public: public:
@ -55,6 +55,6 @@ private:
bool emit_pic_; bool emit_pic_;
}; };
} // namespace monicelli } // namespace pacciani
#endif #endif

View File

@ -4,7 +4,7 @@
#include "parser.h" #include "parser.h"
#include "errors.h" #include "errors.h"
namespace monicelli { namespace pacciani {
std::unique_ptr<Module> Parser::parseModule() { std::unique_ptr<Module> Parser::parseModule() {
std::unique_ptr<Module> module{new Module}; std::unique_ptr<Module> module{new Module};
@ -539,4 +539,4 @@ std::unique_ptr<Token> Parser::getNextToken() {
return token; return token;
} }
} // namespace monicelli } // namespace pacciani

View File

@ -1,8 +1,8 @@
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
#ifndef MONICELLI_PARSER_H #ifndef PACCIANI_PARSER_H
#define MONICELLI_PARSER_H #define PACCIANI_PARSER_H
#include "ast.h" #include "ast.h"
#include "errors.h" #include "errors.h"
@ -13,7 +13,7 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
namespace monicelli { namespace pacciani {
class Parser final : public ErrorReportingMixin { class Parser final : public ErrorReportingMixin {
public: public:
@ -68,6 +68,6 @@ private:
std::unique_ptr<Token> current_token_; std::unique_ptr<Token> current_token_;
}; };
} // namespace monicelli } // namespace pacciani
#endif #endif

View File

@ -3,7 +3,7 @@
#include "support.h" #include "support.h"
namespace monicelli { namespace pacciani {
std::string basename(std::string input_filename) { std::string basename(std::string input_filename) {
auto base_name_start = input_filename.find_last_of("\\/"); auto base_name_start = input_filename.find_last_of("\\/");
@ -14,4 +14,4 @@ std::string basename(std::string input_filename) {
return input_filename; return input_filename;
} }
} // namespace monicelli } // namespace pacciani

View File

@ -1,13 +1,13 @@
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
#ifndef MONICELLI_SUPPORT_H #ifndef PACCIANI_SUPPORT_H
#define MONICELLI_SUPPORT_H #define PACCIANI_SUPPORT_H
#include <iostream> #include <iostream>
#include <string> #include <string>
namespace monicelli { namespace pacciani {
#define USE(x) ((void)(x)) #define USE(x) ((void)(x))
@ -23,6 +23,6 @@ static void print(std::ostream& stream, const First& first, Tail... tail) {
std::string basename(std::string input_filename); std::string basename(std::string input_filename);
} // namespace monicelli } // namespace pacciani
#endif #endif

View File

@ -1,5 +1,5 @@
#ifndef MONICELLI_TYPES_DEF #ifndef PACCIANI_TYPES_DEF
#define MONICELLI_TYPES_DEF #define PACCIANI_TYPES_DEF
// Copyright 2017 the Monicelli project authors. All rights reserved. // Copyright 2017 the Monicelli project authors. All rights reserved.
// Use of this source code is governed by a GPLv3 license, see LICENSE.txt. // Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
@ -7,10 +7,10 @@
// symbol_name, ir_type, input_format, output_format, src_name, ast_name // symbol_name, ir_type, input_format, output_format, src_name, ast_name
#define BUILTIN_TYPES(V) \ #define BUILTIN_TYPES(V) \
V(VOID, Void, nullptr, nullptr, "", "void") \ V(VOID, Void, nullptr, nullptr, "", "void") \
V(INTEGER, Int32, "%d", "%d\n", "Necchi", "int") \ V(INTEGER, Int32, "%d", "%d\n", "Pacciani", "int") \
V(CHAR, Int8, "%c", "%c", "Mascetti", "char") \ V(CHAR, Int8, "%c", "%c", "Vanni", "char") \
V(FLOAT, Float, "%f", "%f\n", "Perozzi", "float") \ V(FLOAT, Float, "%f", "%f\n", "Pucci", "float") \
V(BOOL, Int1, "%d", "%d\n", "Melandri", "bool") \ V(BOOL, Int1, "%d", "%d\n", "Lotti", "bool") \
V(DOUBLE, Double, "%lf", "%f\n", "Sassaroli", "double") V(DOUBLE, Double, "%lf", "%f\n", "Canessa", "double")
#endif #endif