feat(tree-sitter): add Tree-sitter grammar for Storybook DSL

This commit is contained in:
2026-02-09 22:06:25 +00:00
parent 734eb93f12
commit b100ded3d3
27 changed files with 13383 additions and 0 deletions

View File

@@ -0,0 +1,58 @@
==================
Simple character
==================
character Alice {
age: 7
}
---
(source_file
(declaration
(character
name: (identifier)
body: (block
(field
name: (dotted_path (identifier))
value: (value (integer)))))))
==================
Use declaration
==================
use schema::core::Item;
---
(source_file
(declaration
(use_declaration
(path_segments
(identifier)
(identifier)
(identifier)))))
==================
Prose block
==================
character Bob {
---backstory
This is Bob's story.
---
}
---
(source_file
(declaration
(character
name: (identifier)
body: (block
(field
(prose_block
marker: (prose_marker)
tag: (identifier)
content: (prose_content)
end: (prose_marker)))))))

View File

@@ -0,0 +1,180 @@
==================
Simple Behavior
==================
behavior SimpleBehavior {
walk_around
}
---
(source_file
(declaration
(behavior
name: (identifier)
root: (behavior_node
(action_node (identifier))))))
==================
Selector Behavior
==================
behavior SelectorBehavior {
? {
try_option_a
try_option_b
fallback
}
}
---
(source_file
(declaration
(behavior
name: (identifier)
root: (behavior_node
(selector_node
(behavior_node (action_node (identifier)))
(behavior_node (action_node (identifier)))
(behavior_node (action_node (identifier))))))))
==================
Sequence Behavior
==================
behavior SequenceBehavior {
> {
check_energy
move_to_location
perform_action
}
}
---
(source_file
(declaration
(behavior
name: (identifier)
root: (behavior_node
(sequence_node
(behavior_node (action_node (identifier)))
(behavior_node (action_node (identifier)))
(behavior_node (action_node (identifier))))))))
==================
Nested Behavior
==================
behavior NestedBehavior {
> {
? {
check_condition_a
check_condition_b
}
perform_action
}
}
---
(source_file
(declaration
(behavior
name: (identifier)
root: (behavior_node
(sequence_node
(behavior_node
(selector_node
(behavior_node (action_node (identifier)))
(behavior_node (action_node (identifier)))))
(behavior_node (action_node (identifier))))))))
==================
Repeat Behavior
==================
behavior RepeatBehavior {
* {
patrol
}
}
---
(source_file
(declaration
(behavior
name: (identifier)
root: (behavior_node
(repeat_node
(behavior_node (action_node (identifier))))))))
==================
Behavior with Subtree
==================
behavior WithSubtree {
> {
@helpers::check_preconditions
main_action
}
}
---
(source_file
(declaration
(behavior
name: (identifier)
root: (behavior_node
(sequence_node
(behavior_node
(subtree_node
(path
(path_segments
(identifier)
(identifier)))))
(behavior_node (action_node (identifier))))))))
==================
Complex Nested Behavior
==================
behavior ComplexBehavior {
? {
> {
check_threat
flee_to_safety
}
> {
check_resources
gather_resources
}
* {
idle
}
}
}
---
(source_file
(declaration
(behavior
name: (identifier)
root: (behavior_node
(selector_node
(behavior_node
(sequence_node
(behavior_node (action_node (identifier)))
(behavior_node (action_node (identifier)))))
(behavior_node
(sequence_node
(behavior_node (action_node (identifier)))
(behavior_node (action_node (identifier)))))
(behavior_node
(repeat_node
(behavior_node (action_node (identifier))))))))))

View File

@@ -0,0 +1,577 @@
==================
Use declaration - simple
==================
use schema::core::Item;
---
(source_file
(declaration
(use_declaration
(path_segments
(identifier)
(identifier)
(identifier)))))
==================
Use declaration - grouped import
==================
use schema::core::{Item1, Item2, Item3};
---
(source_file
(declaration
(use_declaration
(path_segments
(identifier)
(identifier))
(identifier)
(identifier)
(identifier))))
==================
Use declaration - wildcard
==================
use schema::beings::*;
---
(source_file
(declaration
(use_declaration
(path_segments
(identifier)
(identifier)))))
==================
Character - full featured
==================
character Alice: Human from Curious {
age: 7
height: 4.2
name: "Alice Liddell"
curious: true
age_range: 5..10
---backstory
A curious young girl.
---
}
---
(source_file
(declaration
(character
name: (identifier)
species: (identifier)
template: (template_clause (identifier))
body: (block
(field
name: (dotted_path (identifier))
value: (value (integer)))
(field
name: (dotted_path (identifier))
value: (value (float)))
(field
name: (dotted_path (identifier))
value: (value (string)))
(field
name: (dotted_path (identifier))
value: (value (boolean)))
(field
name: (dotted_path (identifier))
value: (value (range (integer) (integer))))
(field
(prose_block
marker: (prose_marker)
tag: (identifier)
content: (prose_content)
end: (prose_marker)))))))
==================
Template with includes
==================
template BaseCharacter strict {
include Physical
include Mental
age: 0
name: ""
}
---
(source_file
(declaration
(template
name: (identifier)
(include (identifier))
(include (identifier))
(field
name: (dotted_path (identifier))
value: (value (integer)))
(field
name: (dotted_path (identifier))
value: (value (string))))))
==================
Life arc with states and transitions
==================
life_arc Journey {
---description
The character's journey.
---
state young {
on enter {
age: 5
}
on age >= 18 -> adult
}
state adult {
on retire is true -> retired
}
state retired {
}
}
---
(source_file
(declaration
(life_arc
name: (identifier)
(field
(prose_block
marker: (prose_marker)
tag: (identifier)
content: (prose_content)
end: (prose_marker)))
(arc_state
name: (identifier)
(on_enter
(block
(field
name: (dotted_path (identifier))
value: (value (integer)))))
(transition
condition: (expression
(comparison
(expression (primary_expression (path (path_segments (identifier)))))
(expression (primary_expression (integer)))))
target: (identifier)))
(arc_state
name: (identifier)
(transition
condition: (expression
(comparison
(expression (primary_expression (path (path_segments (identifier)))))
(expression (primary_expression (boolean)))))
target: (identifier)))
(arc_state
name: (identifier)))))
==================
Schedule with time blocks
==================
schedule DailyRoutine {
08:00 -> 09:00: breakfast {
location: kitchen
}
09:00 -> 12:00: work {
duration: 3h
}
}
---
(source_file
(declaration
(schedule
name: (identifier)
(schedule_block
start: (time)
end: (time)
activity: (identifier)
(block
(field
name: (dotted_path (identifier))
value: (value (path (path_segments (identifier)))))))
(schedule_block
start: (time)
end: (time)
activity: (identifier)
(block
(field
name: (dotted_path (identifier))
value: (value (duration))))))))
==================
Behavior tree - all node types
==================
behavior GuardBehavior {
? {
patrol
> {
detect_threat
alert(priority: high, "Guard duty")
}
* {
watch
}
@base::behaviors::Idle
}
}
---
(source_file
(declaration
(behavior
name: (identifier)
root: (behavior_node
(selector_node
(behavior_node (action_node (identifier)))
(behavior_node
(sequence_node
(behavior_node (action_node (identifier)))
(behavior_node
(action_node
(identifier)
(action_param
(dotted_path (identifier))
(value (path (path_segments (identifier)))))
(action_param
(value (string)))))))
(behavior_node
(repeat_node
(behavior_node (action_node (identifier)))))
(behavior_node
(subtree_node
(path
(path_segments
(identifier)
(identifier)
(identifier))))))))))
==================
Institution
==================
institution Wonderland {
type: "fantasy_realm"
ruler: "Queen of Hearts"
}
---
(source_file
(declaration
(institution
name: (identifier)
(block
(field
name: (dotted_path (identifier))
value: (value (string)))
(field
name: (dotted_path (identifier))
value: (value (string)))))))
==================
Relationship with participants
==================
relationship Friendship {
Alice {
bond_strength: 5
}
WhiteRabbit as friend {
trust: 0.8
}
Caterpillar
}
---
(source_file
(declaration
(relationship
name: (identifier)
(participant
(path (path_segments (identifier)))
(block
(field
name: (dotted_path (identifier))
value: (value (integer)))))
(participant
(path (path_segments (identifier)))
(identifier)
(block
(field
name: (dotted_path (identifier))
value: (value (float)))))
(participant
(path (path_segments (identifier)))))))
==================
Location
==================
location TeaParty {
description: "A mad tea party"
capacity: 10
}
---
(source_file
(declaration
(location
name: (identifier)
(block
(field
name: (dotted_path (identifier))
value: (value (string)))
(field
name: (dotted_path (identifier))
value: (value (integer)))))))
==================
Species with includes
==================
species Cat {
include Mammal
purrs: true
lives: 9
}
---
(source_file
(declaration
(species
name: (identifier)
(include (identifier))
(field
name: (dotted_path (identifier))
value: (value (boolean)))
(field
name: (dotted_path (identifier))
value: (value (integer))))))
==================
Enum declaration
==================
enum EmotionalState {
happy, sad, angry, confused, curious
}
---
(source_file
(declaration
(enum_declaration
name: (identifier)
(identifier)
(identifier)
(identifier)
(identifier)
(identifier))))
==================
Override syntax
==================
character SpecialAlice {
base: @Alice {
remove backstory
append age_category: "child"
curious: false
}
}
---
(source_file
(declaration
(character
name: (identifier)
body: (block
(field
name: (dotted_path (identifier))
value: (value
(override
(path (path_segments (identifier)))
(override_op (identifier))
(override_op
(field
name: (dotted_path (identifier))
value: (value (string))))
(override_op
(field
name: (dotted_path (identifier))
value: (value (boolean)))))))))))
==================
Complex expressions in conditions
==================
life_arc ComplexLogic {
state test {
on self.age > 18 and other.trust >= 0.5 -> trusted
on not self.valid or self.expired is true -> invalid
}
state trusted {
}
state invalid {
}
}
---
(source_file
(declaration
(life_arc
name: (identifier)
(arc_state
name: (identifier)
(transition
condition: (expression
(and_expression
(expression
(comparison
(expression
(field_access
(expression (primary_expression))
(identifier)))
(expression (primary_expression (integer)))))
(expression
(comparison
(expression
(field_access
(expression (primary_expression))
(identifier)))
(expression (primary_expression (float)))))))
target: (identifier))
(transition
condition: (expression
(or_expression
(expression
(not_expression
(expression
(field_access
(expression (primary_expression))
(identifier)))))
(expression
(comparison
(expression
(field_access
(expression (primary_expression))
(identifier)))
(expression (primary_expression (boolean)))))))
target: (identifier)))
(arc_state
name: (identifier))
(arc_state
name: (identifier)))))
==================
List and object values
==================
character DataRich {
tags: ["smart", "brave", "curious"]
stats: {
strength: 10
intelligence: 15
}
matrix: [[1, 2], [3, 4]]
}
---
(source_file
(declaration
(character
name: (identifier)
body: (block
(field
name: (dotted_path (identifier))
value: (value
(list
(value (string))
(value (string))
(value (string)))))
(field
name: (dotted_path (identifier))
value: (value
(object
(block
(field
name: (dotted_path (identifier))
value: (value (integer)))
(field
name: (dotted_path (identifier))
value: (value (integer)))))))
(field
name: (dotted_path (identifier))
value: (value
(list
(value
(list
(value (integer))
(value (integer))))
(value
(list
(value (integer))
(value (integer)))))))))))
==================
Dotted field paths
==================
character Nested {
appearance.hair.color: "blonde"
stats.mental.intelligence: 15
}
---
(source_file
(declaration
(character
name: (identifier)
body: (block
(field
name: (dotted_path
(identifier)
(identifier)
(identifier))
value: (value (string)))
(field
name: (dotted_path
(identifier)
(identifier)
(identifier))
value: (value (integer)))))))