All checks were successful
build-dsl-smoke / Build judge (push) Successful in 12s
build-dsl-smoke / debug / clang / linux (push) Successful in 6s
build-dsl-smoke / debug / gcc / linux (push) Successful in 8s
build-dsl-smoke / release / clang / linux (push) Successful in 8s
build-dsl-smoke / release / gcc / linux (push) Successful in 6s
build-dsl-smoke / sanitized / clang / linux (push) Successful in 8s
build-dsl-smoke / sanitized / gcc / linux (push) Successful in 7s
build-dsl-smoke / debug / clang / windows (push) Successful in 13s
build-dsl-smoke / debug-valgrind / gcc / linux (push) Successful in 14s
build-dsl-smoke / release / clang / windows (push) Successful in 16s
build-dsl-smoke / debug / msvc / windows (push) Successful in 18s
build-dsl-smoke / release / msvc / windows (push) Successful in 17s
build-dsl-smoke / SUMMARY (push) Successful in 4s
Release / Build & publish (push) Successful in 48s
Reviewed-on: #1
343 lines
7.6 KiB
JavaScript
343 lines
7.6 KiB
JavaScript
module.exports = grammar({
|
|
name: 'jdg',
|
|
|
|
extras: $ => [/\s+/, $.comment],
|
|
|
|
word: $ => $.identifier,
|
|
|
|
conflicts: $ => [],
|
|
|
|
rules: {
|
|
source_file: $ => repeat($._top_statement),
|
|
|
|
comment: $ => token(seq('//', /[^\n]*/)),
|
|
|
|
_top_statement: $ => choice(
|
|
$.include,
|
|
$.toolchains,
|
|
$.build_defaults,
|
|
$.structured_build,
|
|
$.legacy_build_platform,
|
|
$.legacy_build,
|
|
$.binary_decl,
|
|
$.sources_decl,
|
|
$.bool_decl,
|
|
$.timeout_decl,
|
|
$.memory_limit_decl,
|
|
$.group,
|
|
),
|
|
|
|
include: $ => seq(
|
|
'include',
|
|
field('path', $.string)
|
|
),
|
|
|
|
legacy_build: $ => prec(1, seq(
|
|
'build',
|
|
field('command', $.string)
|
|
)),
|
|
|
|
legacy_build_platform: $ => seq(
|
|
field('keyword', choice('build_linux', 'build_windows', 'build_darwin')),
|
|
field('command', $.string)
|
|
),
|
|
|
|
structured_build: $ => prec(2, seq(
|
|
'build',
|
|
field('name', $.string),
|
|
field('body', $.build_block)
|
|
)),
|
|
|
|
build_defaults: $ => seq(
|
|
'build_defaults',
|
|
field('body', $.build_block)
|
|
),
|
|
|
|
build_block: $ => seq(
|
|
'{',
|
|
repeat($._build_field),
|
|
'}'
|
|
),
|
|
|
|
_build_field: $ => choice(
|
|
$.build_scalar_field,
|
|
$.build_list_field,
|
|
$.build_profile_field,
|
|
$.build_warnings_field,
|
|
$.define_field,
|
|
$.os_override,
|
|
),
|
|
|
|
build_scalar_field: $ => seq(
|
|
field('name', choice('language', 'standard', 'output', 'wrapper')),
|
|
'=',
|
|
field('value', $.string)
|
|
),
|
|
|
|
build_list_field: $ => seq(
|
|
field('name', choice('sources', 'includes', 'sanitize', 'link', 'extra', 'platforms', 'compilers')),
|
|
'=',
|
|
field('value', repeat1($.string))
|
|
),
|
|
|
|
build_profile_field: $ => seq(
|
|
'profile',
|
|
'=',
|
|
field('value', $.profile_value)
|
|
),
|
|
profile_value: $ => choice('release', 'debug', 'sanitized'),
|
|
|
|
build_warnings_field: $ => seq(
|
|
'warnings',
|
|
'=',
|
|
field('value', $.warnings_value)
|
|
),
|
|
warnings_value: $ => choice('default', 'strict', 'pedantic'),
|
|
|
|
define_field: $ => seq(
|
|
'define',
|
|
'(',
|
|
field('key', $.string),
|
|
')',
|
|
'=',
|
|
field('value', $.string)
|
|
),
|
|
|
|
os_override: $ => seq(
|
|
field('os', $.os_name),
|
|
field('body', $.build_block)
|
|
),
|
|
os_name: $ => choice('linux', 'windows', 'darwin'),
|
|
|
|
toolchains: $ => seq(
|
|
'toolchains',
|
|
'{',
|
|
repeat($.toolchain_entry),
|
|
'}'
|
|
),
|
|
|
|
toolchain_entry: $ => seq(
|
|
field('name', choice($.identifier, $.string)),
|
|
'{',
|
|
repeat($._toolchain_field),
|
|
'}'
|
|
),
|
|
|
|
_toolchain_field: $ => choice(
|
|
$.toolchain_platforms_field,
|
|
$.toolchain_binary_field,
|
|
$.toolchain_class_field,
|
|
),
|
|
|
|
toolchain_platforms_field: $ => seq(
|
|
'platforms',
|
|
'=',
|
|
field('value', repeat1($.string))
|
|
),
|
|
toolchain_binary_field: $ => seq(
|
|
'binary',
|
|
'=',
|
|
field('value', $.string)
|
|
),
|
|
toolchain_class_field: $ => seq(
|
|
'class',
|
|
'=',
|
|
field('value', $.class_value)
|
|
),
|
|
class_value: $ => choice('gnu', 'msvc'),
|
|
|
|
binary_decl: $ => seq(
|
|
'binary',
|
|
'=',
|
|
field('value', $.string)
|
|
),
|
|
|
|
sources_decl: $ => seq(
|
|
'sources',
|
|
'=',
|
|
field('value', $.string)
|
|
),
|
|
|
|
bool_decl: $ => seq(
|
|
field('name', choice('normalize_crlf', 'trim_trailing_ws')),
|
|
'=',
|
|
field('value', $.bool)
|
|
),
|
|
|
|
timeout_decl: $ => seq(
|
|
'timeout',
|
|
field('value', $.duration)
|
|
),
|
|
|
|
memory_limit_decl: $ => seq(
|
|
'memory_limit',
|
|
'=',
|
|
field('value', $.size)
|
|
),
|
|
|
|
group: $ => seq(
|
|
'group',
|
|
'(',
|
|
field('name', $.string),
|
|
')',
|
|
'{',
|
|
repeat($._group_field),
|
|
'}'
|
|
),
|
|
|
|
_group_field: $ => choice(
|
|
$.group_weight_field,
|
|
$.group_timeout_field,
|
|
$.group_memory_field,
|
|
$.group_scoring_field,
|
|
$.group_wrapper_field,
|
|
$.env_decl,
|
|
$.test,
|
|
$.pattern,
|
|
),
|
|
|
|
group_weight_field: $ => seq('weight', '=', field('value', $.number)),
|
|
group_timeout_field: $ => seq('timeout', '=', field('value', $.duration)),
|
|
group_memory_field: $ => seq('memory_limit', '=', field('value', $.size)),
|
|
group_scoring_field: $ => seq('scoring', '=', field('value', $.scoring_value)),
|
|
scoring_value: $ => choice('partial', 'all_or_none'),
|
|
group_wrapper_field: $ => seq('wrapper', '=', field('value', $.string)),
|
|
|
|
env_decl: $ => seq(
|
|
'env',
|
|
'(',
|
|
field('key', $.string),
|
|
')',
|
|
'=',
|
|
field('value', $.string)
|
|
),
|
|
|
|
test: $ => seq(
|
|
'test',
|
|
'(',
|
|
field('name', $.string),
|
|
')',
|
|
'{',
|
|
repeat($._test_field),
|
|
'}'
|
|
),
|
|
|
|
_test_field: $ => choice(
|
|
$.test_stdin_field,
|
|
$.test_stdout_field,
|
|
$.test_stderr_field,
|
|
$.test_args_field,
|
|
$.test_exit_code_field,
|
|
$.test_timeout_field,
|
|
$.test_memory_field,
|
|
$.test_wrapper_field,
|
|
$.env_decl,
|
|
$.file_decl,
|
|
$.out_file_decl,
|
|
),
|
|
|
|
test_stdin_field: $ => seq('stdin', '=', field('value', $.string)),
|
|
test_stdout_field: $ => seq('stdout', $._matcher),
|
|
test_stderr_field: $ => seq('stderr', $._matcher),
|
|
test_args_field: $ => seq('args', '=', field('value', repeat1($.string))),
|
|
test_exit_code_field: $ => seq('exitCode', '=', field('value', $.integer)),
|
|
test_timeout_field: $ => seq('timeout', '=', field('value', $.duration)),
|
|
test_memory_field: $ => seq('memory_limit', '=', field('value', $.size)),
|
|
test_wrapper_field: $ => seq('wrapper', '=', field('value', $.string)),
|
|
|
|
file_decl: $ => seq(
|
|
'file',
|
|
'(',
|
|
field('key', $.string),
|
|
')',
|
|
'=',
|
|
field('value', $.string)
|
|
),
|
|
|
|
out_file_decl: $ => seq(
|
|
'outFile',
|
|
'(',
|
|
field('key', $.string),
|
|
')',
|
|
'=',
|
|
field('value', $.string)
|
|
),
|
|
|
|
_matcher: $ => choice(
|
|
$.exact_matcher,
|
|
$.numeric_matcher,
|
|
$.contains_matcher,
|
|
$.regex_matcher,
|
|
$.any_order_matcher,
|
|
),
|
|
|
|
exact_matcher: $ => seq('=', field('value', $.string)),
|
|
numeric_matcher: $ => seq(
|
|
'~',
|
|
field('epsilon', $.number),
|
|
'of',
|
|
field('value', $.string)
|
|
),
|
|
contains_matcher: $ => seq('contains', field('value', $.string)),
|
|
regex_matcher: $ => seq('matches', field('pattern', $.regex_string)),
|
|
any_order_matcher: $ => seq(
|
|
'anyOrder',
|
|
'{',
|
|
repeat1($.string),
|
|
'}'
|
|
),
|
|
|
|
pattern: $ => seq(
|
|
'pattern',
|
|
'{',
|
|
repeat($._pattern_field),
|
|
'}'
|
|
),
|
|
|
|
_pattern_field: $ => choice(
|
|
$.pattern_input_field,
|
|
$.pattern_output_field,
|
|
$.pattern_dirs_field,
|
|
$.pattern_args_field,
|
|
),
|
|
|
|
pattern_input_field: $ => seq('input', '=', field('value', $.string)),
|
|
pattern_output_field: $ => seq('output', '=', field('value', $.string)),
|
|
pattern_dirs_field: $ => seq('dirs', '=', field('value', $.string)),
|
|
pattern_args_field: $ => seq('args', '=', field('value', repeat1($.string))),
|
|
|
|
bool: $ => choice('true', 'false'),
|
|
|
|
number: $ => choice($.integer, $.float),
|
|
|
|
string: $ => choice(
|
|
$.heredoc_string,
|
|
$.simple_string,
|
|
),
|
|
|
|
simple_string: $ => token(seq(
|
|
'"',
|
|
repeat(choice(
|
|
/[^"\\\n]/,
|
|
seq('\\', /./)
|
|
)),
|
|
'"'
|
|
)),
|
|
|
|
heredoc_string: $ => token(seq(
|
|
'"""',
|
|
/([^"]|"[^"]|""[^"])*/,
|
|
'"""'
|
|
)),
|
|
|
|
regex_string: $ => $.simple_string,
|
|
|
|
identifier: $ => /[a-zA-Z_][a-zA-Z0-9_]*/,
|
|
|
|
integer: $ => token(/-?\d+/),
|
|
float: $ => token(/-?\d+\.\d+/),
|
|
duration: $ => token(/\d+(ms|s|m)/),
|
|
size: $ => token(/\d+(KiB|MiB|GiB|KB|MB|GB|B|K|M|G)/),
|
|
}
|
|
});
|