# Copyright 2016 Oliver Cope
# 
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
# http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

text = <(~'$' anything)+>:x

escaped_dollar = '$$' -> '$'
lone_dollar = '$'

simple_expr = <identifier (('.' identifier) | ('[' slice ']'))*>:x -> Interpolation('$' + x, x)
delimited_expr = '{' <member*>:x '}' -> Interpolation('${' + x + '}', x)
undelimited_text = ~('{' | '}') anything
member = (<undelimited_text+>) | delimited_expr
identifier = <(letter | '_') (letterOrDigit | '_')*>
slice = index? (':' index? (':' index?)?)?

index = digit+ | '-' digit+

interpolation = '$' (simple_expr | delimited_expr ):x -> x
escaped_interpolation = '$!' (simple_expr | delimited_expr ):x -> x.noescape()

text_with_interpolations = (text | escaped_interpolation | interpolation | escaped_dollar | lone_dollar)*
