rendered paste body-----------------Grammar---------------------------
%tokens%
allChars = <<[\s\S]>>
startTextBlock = "<!"
endTextBlock = "!>"
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---------------
<!FDSFSDFS fds " { } ;
Hello, this is a; boo template
This is "some" ${more} template stuff
and ${more("<%%>"}
!><% for item in MomSucks{
print "${item}";
%><!
This is item ${item}
!><%
}
%>
--------------------------------
Parse tree from O:\SVN\DunnChurchill.Templates.Compiler\testscript.txt:
Template(2001)
TextBlock(2002)
startTextBlock(1002): "<!", line: 1, col: 1
TextBlockText(2004)
allChars(1001): "F", line: 1, col: 3
allChars(1001): "D", line: 1, col: 4
allChars(1001): "S", line: 1, col: 5
allChars(1001): "F", line: 1, col: 6
allChars(1001): "S", line: 1, col: 7
allChars(1001): "D", line: 1, col: 8
allChars(1001): "F", line: 1, col: 9
allChars(1001): "S", line: 1, col: 10
allChars(1001): " ", line: 1, col: 11
allChars(1001): "f", line: 1, col: 12
allChars(1001): "d", line: 1, col: 13
allChars(1001): "s", line: 1, col: 14
allChars(1001): " ", line: 1, col: 15
allChars(1001): """, line: 1, col: 16
allChars(1001): " ", line: 1, col: 17
allChars(1001): "{", line: 1, col: 18
allChars(1001): " ", line: 1, col: 19
allChars(1001): "}", line: 1, col: 20
allChars(1001): " ", line: 1, col: 21
allChars(1001): ";", line: 1, col: 22
allChars(1001): "
", line: 1, col: 23
allChars(1001): "(...)", line: 1, col: 24
allChars(1001): "H", line: 2, col: 1
allChars(1001): "e", line: 2, col: 2
allChars(1001): "l", line: 2, col: 3
allChars(1001): "l", line: 2, col: 4
allChars(1001): "o", line: 2, col: 5
allChars(1001): ",", line: 2, col: 6
allChars(1001): " ", line: 2, col: 7
allChars(1001): "t", line: 2, col: 8
allChars(1001): "h", line: 2, col: 9
allChars(1001): "i", line: 2, col: 10
allChars(1001): "s", line: 2, col: 11
allChars(1001): " ", line: 2, col: 12
allChars(1001): "i", line: 2, col: 13
allChars(1001): "s", line: 2, col: 14
allChars(1001): " ", line: 2, col: 15
allChars(1001): "a", line: 2, col: 16
allChars(1001): ";", line: 2, col: 17
allChars(1001): " ", line: 2, col: 18
allChars(1001): "b", line: 2, col: 19
allChars(1001): "o", line: 2, col: 20
allChars(1001): "o", line: 2, col: 21
allChars(1001): " ", line: 2, col: 22
allChars(1001): "t", line: 2, col: 23
allChars(1001): "e", line: 2, col: 24
allChars(1001): "m", line: 2, col: 25
allChars(1001): "p", line: 2, col: 26
allChars(1001): "l", line: 2, col: 27
allChars(1001): "a", line: 2, col: 28
allChars(1001): "t", line: 2, col: 29
allChars(1001): "e", line: 2, col: 30
allChars(1001): "
", line: 2, col: 31
allChars(1001): "(...)", line: 2, col: 32
allChars(1001): "T", line: 3, col: 1
allChars(1001): "h", line: 3, col: 2
allChars(1001): "i", line: 3, col: 3
allChars(1001): "s", line: 3, col: 4
allChars(1001): " ", line: 3, col: 5
allChars(1001): "i", line: 3, col: 6
allChars(1001): "s", line: 3, col: 7
allChars(1001): " ", line: 3, col: 8
stringLiteral(1007): ""some"", line: 3, col: 9
allChars(1001): " ", line: 3, col: 15
interpolationBlock(1006): "${more}", line: 3, col: 16
allChars(1001): " ", line: 3, col: 23
allChars(1001): "t", line: 3, col: 24
allChars(1001): "e", line: 3, col: 25
allChars(1001): "m", line: 3, col: 26
allChars(1001): "p", line: 3, col: 27
allChars(1001): "l", line: 3, col: 28
allChars(1001): "a", line: 3, col: 29
allChars(1001): "t", line: 3, col: 30
allChars(1001): "e", line: 3, col: 31
allChars(1001): " ", line: 3, col: 32
allChars(1001): "s", line: 3, col: 33
allChars(1001): "t", line: 3, col: 34
allChars(1001): "u", line: 3, col: 35
allChars(1001): "f", line: 3, col: 36
allChars(1001): "f", line: 3, col: 37
allChars(1001): "
", line: 3, col: 38
allChars(1001): "(...)", line: 3, col: 39
allChars(1001): "a", line: 4, col: 1
allChars(1001): "n", line: 4, col: 2
allChars(1001): "d", line: 4, col: 3
allChars(1001): " ", line: 4, col: 4
interpolationBlock(1006): "${more("<%%>"}", 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: 7, col: 3
TextBlockText(2004)
allChars(1001): "
", line: 7, col: 5
allChars(1001): "(...)", line: 7, col: 6
allChars(1001): "T", line: 8, col: 1
allChars(1001): "h", line: 8, col: 2
allChars(1001): "i", line: 8, col: 3
allChars(1001): "s", line: 8, col: 4
allChars(1001): " ", line: 8, col: 5
allChars(1001): "i", line: 8, col: 6
allChars(1001): "s", line: 8, col: 7
allChars(1001): " ", line: 8, col: 8
allChars(1001): "i", line: 8, col: 9
allChars(1001): "t", line: 8, col: 10
allChars(1001): "e", line: 8, col: 11
allChars(1001): "m", line: 8, col: 12
allChars(1001): " ", line: 8, col: 13
interpolationBlock(1006): "${item}", line: 8, col: 14
allChars(1001): "
", line: 8, col: 21
allChars(1001): "(...)", line: 8, col: 22
endTextBlock(1003): "!>", 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