feat(tree-sitter): add Tree-sitter grammar for Storybook DSL
This commit is contained in:
58
tree-sitter-storybook/test/corpus/basic.txt
Normal file
58
tree-sitter-storybook/test/corpus/basic.txt
Normal 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)))))))
|
||||
180
tree-sitter-storybook/test/corpus/behaviors.txt
Normal file
180
tree-sitter-storybook/test/corpus/behaviors.txt
Normal 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))))))))))
|
||||
|
||||
577
tree-sitter-storybook/test/corpus/declarations.txt
Normal file
577
tree-sitter-storybook/test/corpus/declarations.txt
Normal 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)))))))
|
||||
Reference in New Issue
Block a user