2024-11-20 19:29:09 -08:00
|
|
|
/**
|
|
|
|
|
* @file Basic proof assistant based on Calculus of Constructions
|
|
|
|
|
* @author William Ball <williampi103@gmail.com>
|
|
|
|
|
* @license GPL3
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/// <reference types="tree-sitter-cli/dsl" />
|
|
|
|
|
// @ts-check
|
|
|
|
|
|
|
|
|
|
module.exports = grammar({
|
|
|
|
|
name: "perga",
|
|
|
|
|
|
2024-11-21 13:14:46 -08:00
|
|
|
extras: $ => [
|
|
|
|
|
$.comment,
|
|
|
|
|
/\s/,
|
|
|
|
|
],
|
|
|
|
|
|
2024-11-20 19:29:09 -08:00
|
|
|
rules: {
|
|
|
|
|
|
2024-12-01 20:53:58 -08:00
|
|
|
program : $ => repeat(choice($.definition, $.preprocess, $.axiom)),
|
2024-11-20 19:29:09 -08:00
|
|
|
|
|
|
|
|
identifier : $ => /[a-zA-Z_]\w*/,
|
|
|
|
|
|
|
|
|
|
comment : $ => token(seq('--', /.*/)),
|
|
|
|
|
|
|
|
|
|
param_block : $ => seq(
|
|
|
|
|
'(',
|
2024-11-23 10:39:33 -08:00
|
|
|
field('param', repeat1($.identifier)),
|
2024-11-20 19:29:09 -08:00
|
|
|
':',
|
2024-11-20 21:46:51 -08:00
|
|
|
field('type', $.expr),
|
2024-11-20 19:29:09 -08:00
|
|
|
')'
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
star : $ => "*",
|
|
|
|
|
square : $ => choice('□', '[]'),
|
2024-12-01 23:36:32 -08:00
|
|
|
sort : $ => choice($.star, $.square, seq($.square, /[0-9]+/)),
|
2024-11-20 19:29:09 -08:00
|
|
|
|
|
|
|
|
labs : $ => seq(
|
2024-11-20 21:46:51 -08:00
|
|
|
choice('λ', 'fun'),
|
2024-11-20 19:29:09 -08:00
|
|
|
repeat1($.param_block),
|
2024-12-01 21:38:43 -08:00
|
|
|
optional($.ascription),
|
2024-11-20 19:29:09 -08:00
|
|
|
choice('=>', '⇒'),
|
|
|
|
|
$.expr,
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
pabs : $ => seq(
|
2024-11-20 21:46:51 -08:00
|
|
|
choice('∏', 'forall'),
|
2024-11-20 19:29:09 -08:00
|
|
|
repeat1($.param_block),
|
2024-12-01 21:38:43 -08:00
|
|
|
optional($.ascription),
|
2024-11-20 19:29:09 -08:00
|
|
|
',',
|
|
|
|
|
$.expr,
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
term : $ => choice(
|
|
|
|
|
$.identifier,
|
2024-12-01 23:36:32 -08:00
|
|
|
$.sort,
|
2024-11-20 19:29:09 -08:00
|
|
|
seq('(', $.expr, ')'),
|
|
|
|
|
),
|
|
|
|
|
|
2024-11-23 10:06:53 -08:00
|
|
|
binding : $ => seq(
|
|
|
|
|
'(',
|
|
|
|
|
$.identifier,
|
2024-11-23 10:39:33 -08:00
|
|
|
repeat($.param_block),
|
2024-12-01 20:53:58 -08:00
|
|
|
optional($.ascription),
|
2024-11-23 10:06:53 -08:00
|
|
|
':=',
|
|
|
|
|
$.expr,
|
|
|
|
|
')',
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
let : $ => seq(
|
|
|
|
|
'let',
|
|
|
|
|
repeat1($.binding),
|
|
|
|
|
'in',
|
|
|
|
|
$.expr,
|
|
|
|
|
'end',
|
|
|
|
|
),
|
|
|
|
|
|
2024-11-20 19:29:09 -08:00
|
|
|
app : $ => repeat1($.term),
|
|
|
|
|
|
|
|
|
|
arrow : $ => prec.left(1, seq(
|
|
|
|
|
$.app_term,
|
|
|
|
|
choice('->', '→'),
|
|
|
|
|
$.expr,
|
|
|
|
|
)),
|
|
|
|
|
|
|
|
|
|
app_term : $ => choice(
|
|
|
|
|
$.labs,
|
|
|
|
|
$.pabs,
|
2024-11-23 10:06:53 -08:00
|
|
|
$.let,
|
2024-11-20 19:29:09 -08:00
|
|
|
$.app,
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
expr : $ => choice(
|
|
|
|
|
$.app_term,
|
|
|
|
|
$.arrow,
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
ascription : $ => seq(
|
|
|
|
|
':',
|
2024-11-20 21:46:51 -08:00
|
|
|
field('type', $.expr),
|
2024-11-20 19:29:09 -08:00
|
|
|
),
|
|
|
|
|
|
2024-12-01 20:53:58 -08:00
|
|
|
axiom : $ => seq(
|
|
|
|
|
'axiom',
|
|
|
|
|
field('name', $.identifier),
|
|
|
|
|
repeat($.param_block),
|
|
|
|
|
$.ascription,
|
|
|
|
|
';'
|
|
|
|
|
),
|
|
|
|
|
|
2024-11-20 19:29:09 -08:00
|
|
|
definition : $ => seq(
|
2024-12-01 20:53:58 -08:00
|
|
|
'def',
|
2024-11-20 21:46:51 -08:00
|
|
|
field('name', $.identifier),
|
2024-11-20 19:29:09 -08:00
|
|
|
repeat($.param_block),
|
|
|
|
|
optional($.ascription),
|
|
|
|
|
':=',
|
2024-12-01 20:53:58 -08:00
|
|
|
choice($.expr),
|
2024-11-20 19:29:09 -08:00
|
|
|
';',
|
|
|
|
|
),
|
|
|
|
|
|
2024-11-22 10:37:30 -08:00
|
|
|
preprocess : $ => seq($.command, $.post_command),
|
|
|
|
|
|
|
|
|
|
post_command : $ => /.+/,
|
|
|
|
|
|
|
|
|
|
command : $ => '@include',
|
|
|
|
|
|
2024-11-20 19:29:09 -08:00
|
|
|
}
|
|
|
|
|
});
|