Skip to main content
Version: Next

Aladino Language

Aladino is a simple language to specify steps in pull request workflows.

The expressions in the language allow you to easily perform read and write actions on pull requests.

Syntax

The syntax of Aladino is quite simple. Here's the BNF grammar representation:

prog := stat_list

stat := expr

expr := expr BINOP expr
| UNARYOP expr
| TIMESTAMP
| RELATIVE_TIMESTAMP
| NUMBER
| STRING
| BOOLEAN
| '(' expr ')'
| '[' expr_list ']'
| '$' IDENTIFIER '(' expr_list ')'
| '(' expr_list '=>' expr ')'

expr_list :=
expr ',' expr_list
| expr
|

TIMESTAMP :=
YYYYMMDD
| YYYY-MM-DD
| YYYYMMDDTHH:MM:SS
| YYYY-MM-DDTHH:MM:SS

RELATIVE_TIMESTAMP := NUMBER TIME_UNIT ago

TIME_UNIT :=
'year' | 'years'
| 'month' | 'months'
| 'week' | 'weeks'
| 'day' | 'days'
| 'hour' | 'hours'
| 'minute' | 'minutes'

BINOP :=
'==' | '>=' | '>' | '<' | '<='
| '&&' | '||'

UNARYOP := '!'

This allows us to specify:

  1. Logical expressions: e.g. "a" == "a" or $fun() == 1;
  2. Function calls: e.g. $label("bug")
  3. Lambda functions: e.g. ($dev => $dev == $getAuthor())

Semantic

Aladino supports five types of values: booleans, numbers, strings, arrays and a special type _action_.

Since the language is quite simple, it is also straightforward to perform type inference.

There are two requirements when it comes to typing:

  1. The type of the expression in a rule spec is bool. For example, the following rule is invalid:
- name: doesnt-type-check-to-bool
kind: patch
description: Rule that does not type check to bool
spec: "hello" # type error
  1. The type of each action to be effect. For example, the following workflow is invalid because of its actions:
- name: invalid-workflow
description: Invalid workflow because of action
run:
if: rule_1
then: "hello" # type error

Since, by design, you cannot define functions or variables, the usefulness of the language comes down to the set of built-in variables and functions that are provided.