@@ -103,7 +103,14 @@ namespace rift {
103103 while (m_currentToken) {
104104 switch (m_currentToken.type ) {
105105 case TokenType::SEGMENT: {
106- nodes.push_back (std::make_unique<SegmentNode>(m_currentToken));
106+ // check if previous token is a segment
107+ if (!nodes.empty () && nodes.back ()->type () == Node::Type::Segment) {
108+ // append to the last segment node
109+ auto * segNode = static_cast <SegmentNode*>(nodes.back ().get ());
110+ segNode->value () += m_currentToken.value ;
111+ } else {
112+ nodes.push_back (std::make_unique<SegmentNode>(m_currentToken));
113+ }
107114 UNWRAP_ADVANCE ()
108115 } break ;
109116 case TokenType::LEFT_BRACE: {
@@ -112,7 +119,26 @@ namespace rift {
112119 if (res.isErr ()) {
113120 return res;
114121 }
115- nodes.push_back (std::move (res.unwrap ()));
122+ auto resNode = std::move (res.unwrap ());
123+ if (resNode->type () == Node::Type::Value) {
124+ auto * valNode = static_cast <ValueNode*>(resNode.get ());
125+ // if it's a string, add the value to previous segment node (if any)
126+ if (valNode->value ().type () == Value::Type::String) {
127+ if (!nodes.empty () && nodes.back ()->type () == Node::Type::Segment) {
128+ // append to the last segment node
129+ auto * segNode = static_cast <SegmentNode*>(nodes.back ().get ());
130+ segNode->value () += valNode->value ().toString ();
131+ } else {
132+ // create a new segment node
133+ nodes.push_back (std::make_unique<SegmentNode>(valNode->value ().toString (), valNode->fromIndex (), valNode->toIndex ()));
134+ }
135+
136+ // consume the right brace
137+ CONSUME_TOKEN (TokenType::RIGHT_BRACE)
138+ break ;
139+ }
140+ }
141+ nodes.push_back (std::move (resNode));
116142 CONSUME_TOKEN (TokenType::RIGHT_BRACE);
117143 } break ;
118144 default : {
0 commit comments