tree-sitter-perga/grammar.js

129 lines
2.1 KiB
JavaScript
Raw Normal View History

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: {
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('□', '[]'),
labs : $ => seq(
2024-11-20 21:46:51 -08:00
choice('λ', 'fun'),
2024-11-20 19:29:09 -08:00
repeat1($.param_block),
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),
',',
$.expr,
),
term : $ => choice(
$.identifier,
$.star,
$.square,
seq('(', $.expr, ')'),
),
2024-11-23 10:06:53 -08:00
binding : $ => seq(
'(',
$.identifier,
2024-11-23 10:39:33 -08:00
repeat($.param_block),
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),
axiom : $ => 'axiom',
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
),
axiom : $ => seq(
'axiom',
field('name', $.identifier),
repeat($.param_block),
$.ascription,
';'
),
2024-11-20 19:29:09 -08:00
definition : $ => seq(
'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),
':=',
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
}
});