PiTOGo is a compiler from $\pi$-calculus expressions into golang code written in typescript.
First, in the root directory of the project, run the following command to install dependencies:
pnpm i
Then, run the following command to compile the typescript code:
npx tsx path/to/file/.ts
Example usage can be seen in the file __tests__/transpiler.test.ts
.
Running
npx tsx __tests__/transpiler.test.ts
will generate a file __tests__/program.go
containing the golang code.
The syntax of processes is that of $\pi$-calculus, where the following constructs can be written in this way (where p is a process, a and b are channel names, x is a message, and P is a process identifier):
Construct | $\pi$-calculus Syntax | PiTOGo Syntax |
---|---|---|
Nil process | $nil$ | nil |
Parallel composition | $p \mid p$ | p | p |
Choice | $p + p$ | p + p |
Restriction | $(a) p$ | (a)p |
Matching | $[a =b].p$ | [a=b].p |
Input | $a(x).p$ | a(x).p |
Output | $\overline{a}x.p$ | a<x>.p |
Process definition | $P(a) \triangleq p$ | P(a) = p; |
Process invocation | $P\langle a \rangle$ | P<a> |
Replication | $!p$ | !p |
A special write-only channel log
is provided to print messages to the console.
A program is a list of process definitions terminated by semicolons, where the last process definition is the main process:
P1(a) = p1;
P2(b) = p2;
...
main = p3;
The project is structured as follows:
-
__tests__/
contains example code for all the components; -
src/common/
andsrc/utils/
contain utility code; -
src/scanner/
contains the code for scanning and lexing strings into tokens that will be consumed by the parser; -
src/parser/
contains the code for parsing tokens generated by the tokenizer and building the abstract syntax tree of $\pi$-calculus expressions; -
src/transpiler/
contains the code for generating golang code starting from the abstract syntax tree;