gitweb - printer_comments.go
1 package main
2
3 import (
4 "vimagination.zapto.org/parser"
5 )
6
7 var (
8 commentsQuotedExceptDouble = "\n\\\""
9 commentsQuotedExceptSingle = "\n\\'"
10 )
11
12 func commentsPlain(t *parser.Tokeniser) (parser.Token, parser.TokenFunc) {
13 for {
14 switch c := t.ExceptRun("\"'`/"); c {
15 case '"', '\'':
16 er := commentsQuotedExceptSingle
17 if c == '"' {
18 er = commentsQuotedExceptDouble
19 }
20 QuoteLoop:
21 for {
22 switch t.ExceptRun(er) {
23 case -1, '\n':
24 return t.Error()
25 case '\\':
26 t.Except("")
27 t.Except("")
28 case c:
29 t.Except("")
30 break QuoteLoop
31 }
32 }
33 case '`':
34 return parser.Token{
35 Data: t.Get(),
36 }, commentsMultilineQuoted
37 case '/':
38 return parser.Token{
39 Data: t.Get(),
40 }, comments
41 default:
42 return commentsOutputRest(t)
43 }
44 }
45 }
46
47 func commentsMultilineQuoted(t *parser.Tokeniser) (parser.Token, parser.TokenFunc) {
48 if t.ExceptRun("`") == '`' {
49 t.Except("")
50 return commentsPlain(t)
51 }
52 return commentsOutputRest(t)
53 }
54
55 func comments(t *parser.Tokeniser) (parser.Token, parser.TokenFunc) {
56 t.Except("")
57 if t.Accept("/") {
58 t.ExceptRun("\n")
59 return parser.Token{
60 Type: TokenComment,
61 Data: t.Get(),
62 }, commentsPlain
63 } else if t.Accept("*") {
64 return commentsMultiline(t)
65 }
66 return commentsPlain(t)
67 }
68
69 func commentsMultiline(t *parser.Tokeniser) (parser.Token, parser.TokenFunc) {
70 for {
71 if t.ExceptRun("*") == '*' {
72 t.Except("")
73 if t.Accept("/") {
74 return parser.Token{
75 Type: TokenComment,
76 Data: t.Get(),
77 }, commentsPlain
78 }
79 } else {
80 return commentsOutputRest(t)
81 }
82 }
83 }
84
85 func commentsOutputRest(t *parser.Tokeniser) (parser.Token, parser.TokenFunc) {
86 t.ExceptRun("")
87 return parser.Token{
88 Data: t.Get(),
89 }, (*parser.Tokeniser).Done
90 }
91