Transpile pi-calculus in Go
npm install pitogoPiTOGo 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:
``bash`
pnpm i`
Then, run the following command to compile the typescript code:bash`
npx tsx path/to/file/.ts
Example usage can be seen in the file __tests__/transpiler.test.ts.`
Runningbash`
npx tsx __tests__/transpiler.test.ts__tests__/program.go
will generate a file 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 |p \| p
|Parallel composition |$p \mid p$ | |p + p
|Choice |$p + p$ | |(a)p
|Restriction |$(a) p$ | |[a=b].p
|Matching |$[a =b].p$ | |a(x).p
|Input |$a(x).p$ | |a
|Output |$\overline{a}x.p$ | |P(a) = p;
|Process definition |$P(a) \triangleq p$ | |P
|Process invocation |$P\langle a \rangle$ | |!p
|Replication |$!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/
- and src/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;
-