mirror of
https://github.com/soconnor0919/tree-sitter-test-script.git
synced 2026-02-05 00:06:41 -05:00
159 lines
2.8 KiB
JavaScript
159 lines
2.8 KiB
JavaScript
module.exports = grammar({
|
|
name: 'test_script',
|
|
|
|
rules: {
|
|
source_file: $ => repeat($._item),
|
|
|
|
_item: $ => choice(
|
|
$.command,
|
|
$.comment,
|
|
$._whitespace
|
|
),
|
|
|
|
// Test script commands
|
|
command: $ => choice(
|
|
$.load_command,
|
|
$.output_file_command,
|
|
$.compare_to_command,
|
|
$.output_list_command,
|
|
$.set_command,
|
|
$.eval_command,
|
|
$.output_command,
|
|
$.tick_command,
|
|
$.tock_command,
|
|
$.ticktock_command,
|
|
$.repeat_command,
|
|
$.while_command,
|
|
$.echo_command
|
|
),
|
|
|
|
// File operations
|
|
load_command: $ => seq(
|
|
'load',
|
|
$.filename,
|
|
','
|
|
),
|
|
|
|
output_file_command: $ => seq(
|
|
'output-file',
|
|
$.filename,
|
|
','
|
|
),
|
|
|
|
compare_to_command: $ => seq(
|
|
'compare-to',
|
|
$.filename,
|
|
','
|
|
),
|
|
|
|
// Output commands
|
|
output_list_command: $ => seq(
|
|
'output-list',
|
|
repeat1($.output_spec),
|
|
';'
|
|
),
|
|
|
|
output_command: $ => seq(
|
|
'output',
|
|
';'
|
|
),
|
|
|
|
// Simulation control
|
|
tick_command: $ => seq('tick', ','),
|
|
tock_command: $ => seq('tock', ','),
|
|
ticktock_command: $ => seq('ticktock', ';'),
|
|
|
|
eval_command: $ => seq('eval', ','),
|
|
|
|
// Variable assignment
|
|
set_command: $ => seq(
|
|
'set',
|
|
$.variable_reference,
|
|
$.value,
|
|
','
|
|
),
|
|
|
|
// Control flow
|
|
repeat_command: $ => seq(
|
|
'repeat',
|
|
$.number,
|
|
'{',
|
|
repeat($._item),
|
|
'}'
|
|
),
|
|
|
|
while_command: $ => seq(
|
|
'while',
|
|
$.condition,
|
|
'{',
|
|
repeat($._item),
|
|
'}'
|
|
),
|
|
|
|
// Echo command for debugging
|
|
echo_command: $ => seq(
|
|
'echo',
|
|
$.string,
|
|
';'
|
|
),
|
|
|
|
// Variable references (RAM[index], register names, etc.)
|
|
variable_reference: $ => choice(
|
|
$.memory_reference,
|
|
$.register_reference,
|
|
$.pin_reference
|
|
),
|
|
|
|
memory_reference: $ => seq(
|
|
'RAM',
|
|
'[',
|
|
$.index,
|
|
']'
|
|
),
|
|
|
|
register_reference: $ => choice(
|
|
'DRegister[]',
|
|
'ARegister[]',
|
|
'PC[]',
|
|
/[A-Z][a-zA-Z0-9_]*/
|
|
),
|
|
|
|
pin_reference: $ => /[a-zA-Z][a-zA-Z0-9_]*/,
|
|
|
|
// Output format specifications
|
|
output_spec: $ => seq(
|
|
$.variable_reference,
|
|
optional($.format_spec)
|
|
),
|
|
|
|
format_spec: $ => /%[BDSX]\d+\.\d+\.\d+/,
|
|
|
|
// Values
|
|
value: $ => choice(
|
|
$.number,
|
|
$.binary_value,
|
|
$.string
|
|
),
|
|
|
|
binary_value: $ => /%B[01]+/,
|
|
|
|
// Basic tokens
|
|
number: $ => /\d+/,
|
|
index: $ => /\d+/,
|
|
filename: $ => /[a-zA-Z0-9_.-]+\.[a-zA-Z0-9]+/,
|
|
string: $ => /"[^"]*"/,
|
|
condition: $ => /[^{]+/,
|
|
|
|
// Comments
|
|
comment: $ => token(seq('//', /.*/)),
|
|
|
|
// Whitespace
|
|
_whitespace: $ => /\s+/
|
|
},
|
|
|
|
extras: $ => [
|
|
/\s/,
|
|
$.comment
|
|
]
|
|
});
|