rdpar.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. package rdpar
  2. import "io"
  3. import "unicode"
  4. import "fmt"
  5. import "strings"
  6. import "strconv"
  7. type Kind int
  8. const (
  9. KindError Kind = -1
  10. KindNone Kind = 0
  11. KindBool Kind = iota + 1
  12. KindInt
  13. KindFloat
  14. KindWord
  15. KindString
  16. KindLast
  17. )
  18. type Value interface {
  19. // Kind() Kind
  20. }
  21. type Predicate func(c rune) bool
  22. type Converter func(s string) Value
  23. type Pos struct {
  24. Name *string
  25. Line int
  26. Col int
  27. }
  28. func (p Pos) String() string {
  29. name := "<stdin>"
  30. if p.Name != nil {
  31. name = *p.Name
  32. }
  33. return fmt.Sprintf("%s:%d:%d", name, p.Line, p.Col)
  34. }
  35. type State struct {
  36. Kind
  37. Token strings.Builder
  38. }
  39. type Parser struct {
  40. Pos
  41. Stack []State
  42. io.RuneScanner
  43. }
  44. func (p *Parser) WrapError(err error) Value {
  45. return (fmt.Errorf("%s:%w", p.Pos.String(), err))
  46. }
  47. func (p *Parser) Errorf(f string, args ...interface{}) Value {
  48. return p.WrapError(fmt.Errorf(f, args...))
  49. }
  50. func (p *Parser) Accept() string {
  51. res := p.Buffer().String()
  52. p.Pop()
  53. return res
  54. }
  55. func (p *Parser) ConvertFloat(s string) Value {
  56. f, err := strconv.ParseFloat(s, 64)
  57. if err != nil {
  58. return p.WrapError(err)
  59. }
  60. return float64(f)
  61. }
  62. func (p *Parser) ConvertInt(s string) Value {
  63. i, err := strconv.ParseInt(s, 0, 64)
  64. if err != nil {
  65. return p.WrapError(err)
  66. }
  67. return int64(i)
  68. }
  69. func (p *Parser) AcceptConvert(conv Converter) Value {
  70. return conv(p.Accept())
  71. }
  72. func (p Parser) State() Kind {
  73. return p.Stack[len(p.Stack)-1].Kind
  74. }
  75. func (p Parser) Buffer() *strings.Builder {
  76. return &(p.Stack[len(p.Stack)-1].Token)
  77. }
  78. func (p *Parser) Push(kind Kind) {
  79. s := State{Kind: kind}
  80. p.Stack = append(p.Stack, s)
  81. }
  82. func (p *Parser) Switch(kind Kind) {
  83. p.Stack[len(p.Stack)-1].Kind = kind
  84. }
  85. func (p *Parser) Pop() bool {
  86. if len(p.Stack) > 0 {
  87. p.Stack = p.Stack[0 : len(p.Stack)-1]
  88. return false
  89. }
  90. return true
  91. }
  92. func (p Parser) AppendToken(r rune) {
  93. p.Buffer().WriteRune(r)
  94. }
  95. func (p *Parser) Read() (r rune, ev Value) {
  96. r, _, err := p.ReadRune()
  97. if err != nil {
  98. return r, p.WrapError(err)
  99. }
  100. if r == '\n' {
  101. p.Line++
  102. p.Col = 0
  103. }
  104. p.Col++
  105. return r, nil
  106. }
  107. func (p *Parser) Unread() {
  108. // Do not bother to change pos here
  109. p.UnreadRune()
  110. }
  111. func (p *Parser) Peek() (r rune, ev Value) {
  112. r, err := p.Read()
  113. p.Unread()
  114. return r, err
  115. }
  116. func (p *Parser) ParseWord(end string) Value {
  117. c, err := p.Peek()
  118. if err != nil {
  119. return err
  120. }
  121. if !unicode.IsLetter(c) {
  122. return nil
  123. }
  124. p.Push(1)
  125. for {
  126. c, err = p.Read()
  127. if err != nil {
  128. return err
  129. }
  130. if strings.ContainsRune(end, c) {
  131. p.Unread()
  132. res := p.Accept()
  133. return string(res)
  134. } else {
  135. p.AppendToken(c)
  136. }
  137. }
  138. }
  139. func (p *Parser) Skip(in string) (err Value) {
  140. for {
  141. r, err := p.Read()
  142. if err != nil {
  143. return err
  144. }
  145. if !strings.ContainsRune(in, r) {
  146. p.Unread()
  147. return nil
  148. }
  149. }
  150. }
  151. func IsError(v Value) bool {
  152. if v == nil {
  153. return false
  154. }
  155. _, ok := v.(error)
  156. return ok
  157. }
  158. func (p *Parser) ParseNum(end string) Value {
  159. isFloat := false
  160. if ok := p.PeekIs(unicode.IsDigit); ok == nil || IsError(ok) {
  161. return ok
  162. }
  163. p.Push(KindInt)
  164. for {
  165. r, err := p.Read()
  166. if err != nil {
  167. return err
  168. }
  169. if strings.ContainsRune(end, r) {
  170. sval := p.Accept()
  171. if isFloat {
  172. fval, err := strconv.ParseFloat(sval, 64)
  173. if err != nil {
  174. return p.WrapError(err)
  175. }
  176. return float64(fval)
  177. } else {
  178. ival, err := strconv.ParseInt(sval, 0, 64)
  179. if err != nil {
  180. return p.WrapError(err)
  181. }
  182. return int64(ival)
  183. }
  184. } else if strings.ContainsRune("+-", r) {
  185. if p.Buffer().Len() > 0 {
  186. return p.Errorf("Sign only allowed at beginning of number")
  187. }
  188. p.AppendToken(r)
  189. } else if strings.ContainsRune("0123456789", r) {
  190. p.AppendToken(r)
  191. } else if r == '.' || r == 'e' {
  192. if isFloat {
  193. return p.Errorf("Incorrect floating point literal")
  194. }
  195. p.AppendToken(r)
  196. isFloat = true
  197. } else {
  198. return p.Errorf("Unexpected character in integer.")
  199. }
  200. }
  201. }
  202. func (p *Parser) PeekIs(pred func(rune) bool) (ok Value) {
  203. c, err := p.Peek()
  204. if err != nil {
  205. return err
  206. }
  207. if !pred(c) {
  208. return bool(false)
  209. }
  210. return bool(true)
  211. }
  212. func (p *Parser) PeekStart(start rune) (ok Value) {
  213. c, err := p.Peek()
  214. if err != nil {
  215. return err
  216. }
  217. if c != start {
  218. return bool(false)
  219. }
  220. return bool(true)
  221. }
  222. // uses the default \ escape
  223. func (p *Parser) ParseString(start, end rune) Value {
  224. escaped := false
  225. r, err := p.Peek()
  226. if err != nil {
  227. return err
  228. }
  229. if r != start {
  230. return nil
  231. }
  232. r, err = p.Read() // skip quote
  233. if err != nil {
  234. return err
  235. }
  236. p.Push(1)
  237. for {
  238. r, err = p.Read()
  239. if err != nil {
  240. return err
  241. }
  242. if r == '\\' {
  243. if escaped {
  244. p.AppendToken('\\')
  245. p.AppendToken('\\')
  246. escaped = false
  247. } else {
  248. escaped = true
  249. }
  250. } else if escaped {
  251. p.AppendToken('\\')
  252. p.AppendToken(r)
  253. escaped = false
  254. } else if r == end {
  255. sval := "\"" + p.Accept() + "\""
  256. str, err := strconv.Unquote(sval)
  257. if err != nil {
  258. return p.WrapError(err)
  259. }
  260. return string(str)
  261. } else {
  262. p.AppendToken(r)
  263. }
  264. }
  265. }
  266. // Raw string, only the end and the escape can be escaped
  267. func (p *Parser) ParseRawString(start, end, esc rune) Value {
  268. escaped := false
  269. r, err := p.Peek()
  270. if err != nil {
  271. return err
  272. }
  273. if r != start {
  274. return nil
  275. }
  276. r, err = p.Read() // skip quote
  277. if err != nil {
  278. return err
  279. }
  280. p.Push(1)
  281. for {
  282. r, err = p.Read()
  283. if err != nil {
  284. return err
  285. }
  286. if r == esc {
  287. if escaped {
  288. p.AppendToken(r)
  289. escaped = false
  290. } else {
  291. escaped = true
  292. }
  293. } else if r == end {
  294. if escaped {
  295. p.AppendToken(r)
  296. escaped = false
  297. } else {
  298. return p.Accept()
  299. }
  300. } else {
  301. p.AppendToken(r)
  302. }
  303. }
  304. }