1 //! Example that takes the input
3 //! and builds the tree
5 //! - Marker(Operation)
6 //! - Marker(Operation)
7 //! - "1" Token(Number)
9 //! - Marker(Operation)
10 //! - "2" Token(Number)
12 //! - "3" Token(Number)
14 //! - "4" Token(Number)
16 use rowan
::{GreenNodeBuilder, NodeOrToken, SmolStr}
;
17 use std
::iter
::Peekable
;
19 #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
20 #[allow(non_camel_case_types)]
37 impl From
<SyntaxKind
> for rowan
::SyntaxKind
{
38 fn from(kind
: SyntaxKind
) -> Self {
43 #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
45 impl rowan
::Language
for Lang
{
46 type Kind
= SyntaxKind
;
47 fn kind_from_raw(raw
: rowan
::SyntaxKind
) -> Self::Kind
{
48 assert
!(raw
.0 <= ROOT
as u16);
49 unsafe { std::mem::transmute::<u16, SyntaxKind>(raw.0) }
51 fn kind_to_raw(kind
: Self::Kind
) -> rowan
::SyntaxKind
{
56 type SyntaxNode
= rowan
::SyntaxNode
<Lang
>;
58 type SyntaxToken
= rowan
::SyntaxToken
<Lang
>;
60 type SyntaxElement
= rowan
::NodeOrToken
<SyntaxNode
, SyntaxToken
>;
62 struct Parser
<I
: Iterator
<Item
= (SyntaxKind
, SmolStr
)>> {
63 builder
: GreenNodeBuilder
<'
static>,
66 impl<I
: Iterator
<Item
= (SyntaxKind
, SmolStr
)>> Parser
<I
> {
67 fn peek(&mut self) -> Option
<SyntaxKind
> {
68 while self.iter
.peek().map(|&(t
, _
)| t
== WHITESPACE
).unwrap_or(false) {
71 self.iter
.peek().map(|&(t
, _
)| t
)
74 if let Some((token
, string
)) = self.iter
.next() {
75 self.builder
.token(token
.into(), string
);
78 fn parse_val(&mut self) {
80 Some(NUMBER
) => self.bump(),
82 self.builder
.start_node(ERROR
.into());
84 self.builder
.finish_node();
88 fn handle_operation(&mut self, tokens
: &[SyntaxKind
], next
: fn(&mut Self)) {
89 let checkpoint
= self.builder
.checkpoint();
91 while self.peek().map(|t
| tokens
.contains(&t
)).unwrap_or(false) {
92 self.builder
.start_node_at(checkpoint
, OPERATION
.into());
95 self.builder
.finish_node();
98 fn parse_mul(&mut self) {
99 self.handle_operation(&[MUL
, DIV
], Self::parse_val
)
101 fn parse_add(&mut self) {
102 self.handle_operation(&[ADD
, SUB
], Self::parse_mul
)
104 fn parse(mut self) -> SyntaxNode
{
105 self.builder
.start_node(ROOT
.into());
107 self.builder
.finish_node();
109 SyntaxNode
::new_root(self.builder
.finish())
113 fn print(indent
: usize, element
: SyntaxElement
) {
114 let kind
: SyntaxKind
= element
.kind().into();
115 print
!("{:indent$}", "", indent
= indent
);
117 NodeOrToken
::Node(node
) => {
118 println
!("- {:?}", kind
);
119 for child
in node
.children_with_tokens() {
120 print(indent
+ 2, child
);
124 NodeOrToken
::Token(token
) => println
!("- {:?} {:?}", token
.text(), kind
),
130 builder
: GreenNodeBuilder
::new(),
133 (NUMBER
, "1".into()),
134 (WHITESPACE
, " ".into()),
136 (WHITESPACE
, " ".into()),
137 (NUMBER
, "2".into()),
138 (WHITESPACE
, " ".into()),
140 (WHITESPACE
, " ".into()),
141 (NUMBER
, "3".into()),
142 (WHITESPACE
, " ".into()),
144 (WHITESPACE
, " ".into()),
145 (NUMBER
, "4".into()),
151 print(0, ast
.into());