Pil Manual
Stratego -- Strategies for Program Transformation
A simple PIL tutorial
PIL is a language based on a small subset of Java, but simpler and with a few subtle differences and convenient additions. Let's start with the famous "Hello world!" example. Create a new file
hello.pil:
void main(Array<String> args) {
println("Hello world!");
}
You can now generate Java code from this program using:
pilc -i hello.pil --java
or Python code:
pilc -i hello.pil --python
Code is generated in the
out/ directory, optionally this destination directory can be set with the -d switch.
Both the Python and Java back-ends need a small run-time library to run the software. In the case of Java you can compile and run the generated code using (assuming you installed it with Nix, otherwise, replace the path):
javac -cp out:/nix/store/*-pil-*/share/pil/pil.jar application/Main.java
java -cp out:/nix/store/*-pil-*/share/pil/pil.jar application.Main
But, because this is kind of annoying for simply testing, the
PIL distribution comes with convenient
pil-java and
pil-python wrapper scripts that compile and run the program for you:
$ pil-java hello.pil
[ pilc | info ] Now compiling: hello.pil
[ pilc | info ] Done with hello.pil
Hello world!
$ pil-python hello.pil
[ pilc | info ] Now compiling: hello.pil
[ pilc | info ] Done with hello.pil
Hello world!
Word frequency
You will have noticed that unlike Java,
PIL also support global function, i.e. methods that are not part of a class. Here is a slightly more complicate example that also uses the simple type inferencing features of
PIL (the
var keyword):
List<String> cutIntoWords(String text) {
var i = 0;
var words = new List<String>();
var word = new MutableString();
while(i < text.length) {
if(text[i] == ' ') {
words.add(word.as<String>);
word = new MutableString();
while(text[i] == ' ') {
i = i + 1;
}
} else {
word.append(text[i]);
i = i + 1;
}
}
words.add(word.as<String>);
return words;
}
Map<String, Int> wordFrequency(String text) {
var words = cutIntoWords(text);
var freq = new Map<String, Int>();
for(String word : words) {
if(freq.contains(word)) {
freq[word] = freq[word] + 1;
} else {
freq[word] = 1;
}
}
return freq;
}
void main(Array<String> args) {
var sentence = "This a sentence and I wonder if it can calculate the word frequency of each of these words and if it works";
println(sentence);
println(wordFrequency(sentence));
}
And running it:
$ pil-java parseSentence.pil
[ pilc | info ] Now compiling: parseSentence.pil
[ pilc | info ] Done with parseSentence.pil
This a sentence and I wonder if it can calculate the word frequency of each of these words and if it works
{it=2, can=1, calculate=1, a=1, sentence=1, the=1, frequency=1, This=1, I=1, works=1, and=2, of=2, words=1, if=2, wonder=1, word=1, each=1, these=1}
$ pil-python parseSentence.pil
[ pilc | info ] Now compiling: parseSentence.pil
[ pilc | info ] Done with parseSentence.pil
This a sentence and I wonder if it can calculate the word frequency of each of these words and if it works
{'a': 1, 'and': 2, 'works': 1, 'word': 1, 'calculate': 1, 'sentence': 1, 'This': 1, 'of': 2, 'it': 2, 'I': 1, 'frequency': 1, 'these': 1, 'can': 1, 'words': 1, 'each': 1, 'the': 1, 'if': 2, 'wonder': 1}
--
ZefHemel - 02 Oct 2009