tree-sitter-perga/grammar.js

114 lines
1.9 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,
$.block_comment,
/\s/,
],
2024-11-20 19:29:09 -08:00
rules: {
2024-11-22 10:37:30 -08:00
program : $ => repeat(choice($.definition, $.preprocess)),
2024-11-20 19:29:09 -08:00
identifier : $ => /[a-zA-Z_]\w*/,
comment : $ => token(seq('--', /.*/)),
2024-11-21 13:14:46 -08:00
block_comment: $ => token(seq(
'[*',
repeat(choice(
/[^\[\]*]/,
/\[[^*]/,
/\*[^\]]/,
/\[\*/,
/\*\]/,
)),
'*]'
)),
2024-11-20 19:29:09 -08:00
param_block : $ => seq(
'(',
2024-11-20 21:46:51 -08:00
field('param', repeat($.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, ')'),
),
app : $ => repeat1($.term),
axiom : $ => 'axiom',
arrow : $ => prec.left(1, seq(
$.app_term,
choice('->', '→'),
$.expr,
)),
app_term : $ => choice(
$.labs,
$.pabs,
$.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
),
definition : $ => seq(
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, $.axiom),
';',
),
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
}
});