-----------------Grammar--------------------------- %tokens% allChars = <<[\s\S]>> startTextBlock = "" startCodeBlock = "<%" endCodeBlock = "%>" interpolationBlock = <<\$\{.*?\}>> stringLiteral = <<\".*?\">> %productions% Template = (TextBlock|CodeBlock)+; TextBlock = startTextBlock TextBlockText endTextBlock; CodeBlock = startCodeBlock CodeBlockText endCodeBlock; TextBlockText = (allChars|interpolationBlock|startCodeBlock|endCodeBlock|stringLiteral)+; CodeBlockText = (allChars|stringLiteral|startTextBlock|endTextBlock)+; -----------Input--------------- "} !><% for item in MomSucks{ print "${item}"; %><% } %> -------------------------------- Parse tree from O:\SVN\DunnChurchill.Templates.Compiler\testscript.txt: Template(2001) TextBlock(2002) startTextBlock(1002): ""}", line: 4, col: 5 allChars(1001): " ", line: 4, col: 19 allChars(1001): "(...)", line: 4, col: 20 endTextBlock(1003): "!>", line: 5, col: 1 CodeBlock(2003) startCodeBlock(1004): "<%", line: 5, col: 3 CodeBlockText(2005) allChars(1001): " ", line: 5, col: 5 allChars(1001): "f", line: 5, col: 6 allChars(1001): "o", line: 5, col: 7 allChars(1001): "r", line: 5, col: 8 allChars(1001): " ", line: 5, col: 9 allChars(1001): "i", line: 5, col: 10 allChars(1001): "t", line: 5, col: 11 allChars(1001): "e", line: 5, col: 12 allChars(1001): "m", line: 5, col: 13 allChars(1001): " ", line: 5, col: 14 allChars(1001): "i", line: 5, col: 15 allChars(1001): "n", line: 5, col: 16 allChars(1001): " ", line: 5, col: 17 allChars(1001): "M", line: 5, col: 18 allChars(1001): "o", line: 5, col: 19 allChars(1001): "m", line: 5, col: 20 allChars(1001): "S", line: 5, col: 21 allChars(1001): "u", line: 5, col: 22 allChars(1001): "c", line: 5, col: 23 allChars(1001): "k", line: 5, col: 24 allChars(1001): "s", line: 5, col: 25 allChars(1001): "{", line: 5, col: 26 allChars(1001): " ", line: 5, col: 27 allChars(1001): "(...)", line: 5, col: 28 allChars(1001): "p", line: 6, col: 1 allChars(1001): "r", line: 6, col: 2 allChars(1001): "i", line: 6, col: 3 allChars(1001): "n", line: 6, col: 4 allChars(1001): "t", line: 6, col: 5 allChars(1001): " ", line: 6, col: 6 stringLiteral(1007): ""${item}"", line: 6, col: 7 allChars(1001): ";", line: 6, col: 16 allChars(1001): " ", line: 6, col: 17 allChars(1001): "(...)", line: 6, col: 18 endCodeBlock(1005): "%>", line: 7, col: 1 TextBlock(2002) startTextBlock(1002): "", line: 9, col: 1 CodeBlock(2003) startCodeBlock(1004): "<%", line: 9, col: 3 CodeBlockText(2005) allChars(1001): " ", line: 9, col: 5 allChars(1001): "(...)", line: 9, col: 6 allChars(1001): "}", line: 10, col: 1 allChars(1001): " ", line: 10, col: 2 allChars(1001): "(...)", line: 10, col: 3 endCodeBlock(1005): "%>", line: 11, col: 1