lexer.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. // Code generated by gocc; DO NOT EDIT.
  2. package lexer
  3. import (
  4. "io/ioutil"
  5. "unicode/utf8"
  6. "github.com/awalterschulze/gographviz/internal/token"
  7. )
  8. const (
  9. NoState = -1
  10. NumStates = 141
  11. NumSymbols = 184
  12. )
  13. type Lexer struct {
  14. src []byte
  15. pos int
  16. line int
  17. column int
  18. }
  19. func NewLexer(src []byte) *Lexer {
  20. lexer := &Lexer{
  21. src: src,
  22. pos: 0,
  23. line: 1,
  24. column: 1,
  25. }
  26. return lexer
  27. }
  28. func NewLexerFile(fpath string) (*Lexer, error) {
  29. src, err := ioutil.ReadFile(fpath)
  30. if err != nil {
  31. return nil, err
  32. }
  33. return NewLexer(src), nil
  34. }
  35. func (l *Lexer) Scan() (tok *token.Token) {
  36. tok = new(token.Token)
  37. if l.pos >= len(l.src) {
  38. tok.Type = token.EOF
  39. tok.Pos.Offset, tok.Pos.Line, tok.Pos.Column = l.pos, l.line, l.column
  40. return
  41. }
  42. start, startLine, startColumn, end := l.pos, l.line, l.column, 0
  43. tok.Type = token.INVALID
  44. state, rune1, size := 0, rune(-1), 0
  45. for state != -1 {
  46. if l.pos >= len(l.src) {
  47. rune1 = -1
  48. } else {
  49. rune1, size = utf8.DecodeRune(l.src[l.pos:])
  50. l.pos += size
  51. }
  52. nextState := -1
  53. if rune1 != -1 {
  54. nextState = TransTab[state](rune1)
  55. }
  56. state = nextState
  57. if state != -1 {
  58. switch rune1 {
  59. case '\n':
  60. l.line++
  61. l.column = 1
  62. case '\r':
  63. l.column = 1
  64. case '\t':
  65. l.column += 4
  66. default:
  67. l.column++
  68. }
  69. switch {
  70. case ActTab[state].Accept != -1:
  71. tok.Type = ActTab[state].Accept
  72. end = l.pos
  73. case ActTab[state].Ignore != "":
  74. start, startLine, startColumn = l.pos, l.line, l.column
  75. state = 0
  76. if start >= len(l.src) {
  77. tok.Type = token.EOF
  78. }
  79. }
  80. } else {
  81. if tok.Type == token.INVALID {
  82. end = l.pos
  83. }
  84. }
  85. }
  86. if end > start {
  87. l.pos = end
  88. tok.Lit = l.src[start:end]
  89. } else {
  90. tok.Lit = []byte{}
  91. }
  92. tok.Pos.Offset, tok.Pos.Line, tok.Pos.Column = start, startLine, startColumn
  93. return
  94. }
  95. func (l *Lexer) Reset() {
  96. l.pos = 0
  97. }
  98. /*
  99. Lexer symbols:
  100. 0: 'n'
  101. 1: 'o'
  102. 2: 'd'
  103. 3: 'e'
  104. 4: 'N'
  105. 5: 'o'
  106. 6: 'd'
  107. 7: 'e'
  108. 8: 'N'
  109. 9: 'O'
  110. 10: 'D'
  111. 11: 'E'
  112. 12: 'e'
  113. 13: 'd'
  114. 14: 'g'
  115. 15: 'e'
  116. 16: 'E'
  117. 17: 'd'
  118. 18: 'g'
  119. 19: 'e'
  120. 20: 'E'
  121. 21: 'D'
  122. 22: 'G'
  123. 23: 'E'
  124. 24: 'g'
  125. 25: 'r'
  126. 26: 'a'
  127. 27: 'p'
  128. 28: 'h'
  129. 29: 'G'
  130. 30: 'r'
  131. 31: 'a'
  132. 32: 'p'
  133. 33: 'h'
  134. 34: 'G'
  135. 35: 'R'
  136. 36: 'A'
  137. 37: 'P'
  138. 38: 'H'
  139. 39: 'd'
  140. 40: 'i'
  141. 41: 'g'
  142. 42: 'r'
  143. 43: 'a'
  144. 44: 'p'
  145. 45: 'h'
  146. 46: 'D'
  147. 47: 'i'
  148. 48: 'g'
  149. 49: 'r'
  150. 50: 'a'
  151. 51: 'p'
  152. 52: 'h'
  153. 53: 'd'
  154. 54: 'i'
  155. 55: 'G'
  156. 56: 'r'
  157. 57: 'a'
  158. 58: 'p'
  159. 59: 'h'
  160. 60: 'D'
  161. 61: 'i'
  162. 62: 'G'
  163. 63: 'r'
  164. 64: 'a'
  165. 65: 'p'
  166. 66: 'h'
  167. 67: 'D'
  168. 68: 'I'
  169. 69: 'G'
  170. 70: 'R'
  171. 71: 'A'
  172. 72: 'P'
  173. 73: 'H'
  174. 74: 's'
  175. 75: 'u'
  176. 76: 'b'
  177. 77: 'g'
  178. 78: 'r'
  179. 79: 'a'
  180. 80: 'p'
  181. 81: 'h'
  182. 82: 'S'
  183. 83: 'u'
  184. 84: 'b'
  185. 85: 'g'
  186. 86: 'r'
  187. 87: 'a'
  188. 88: 'p'
  189. 89: 'h'
  190. 90: 's'
  191. 91: 'u'
  192. 92: 'b'
  193. 93: 'G'
  194. 94: 'r'
  195. 95: 'a'
  196. 96: 'p'
  197. 97: 'h'
  198. 98: 'S'
  199. 99: 'u'
  200. 100: 'b'
  201. 101: 'G'
  202. 102: 'r'
  203. 103: 'a'
  204. 104: 'p'
  205. 105: 'h'
  206. 106: 'S'
  207. 107: 'U'
  208. 108: 'B'
  209. 109: 'G'
  210. 110: 'R'
  211. 111: 'A'
  212. 112: 'P'
  213. 113: 'H'
  214. 114: 's'
  215. 115: 't'
  216. 116: 'r'
  217. 117: 'i'
  218. 118: 'c'
  219. 119: 't'
  220. 120: 'S'
  221. 121: 't'
  222. 122: 'r'
  223. 123: 'i'
  224. 124: 'c'
  225. 125: 't'
  226. 126: 'S'
  227. 127: 'T'
  228. 128: 'R'
  229. 129: 'I'
  230. 130: 'C'
  231. 131: 'T'
  232. 132: '{'
  233. 133: '}'
  234. 134: ';'
  235. 135: '='
  236. 136: '['
  237. 137: ']'
  238. 138: ','
  239. 139: ':'
  240. 140: '-'
  241. 141: '>'
  242. 142: '-'
  243. 143: '-'
  244. 144: '_'
  245. 145: '-'
  246. 146: '.'
  247. 147: '-'
  248. 148: '.'
  249. 149: '\'
  250. 150: '"'
  251. 151: '\'
  252. 152: '"'
  253. 153: '"'
  254. 154: '='
  255. 155: '<'
  256. 156: '>'
  257. 157: '<'
  258. 158: '>'
  259. 159: '/'
  260. 160: '/'
  261. 161: '\n'
  262. 162: '#'
  263. 163: '\n'
  264. 164: '/'
  265. 165: '*'
  266. 166: '*'
  267. 167: '*'
  268. 168: '/'
  269. 169: ' '
  270. 170: '\t'
  271. 171: '\r'
  272. 172: '\n'
  273. 173: \u0001-'!'
  274. 174: '#'-'['
  275. 175: ']'-\u007f
  276. 176: 'a'-'z'
  277. 177: 'A'-'Z'
  278. 178: '0'-'9'
  279. 179: \u0080-\ufffc
  280. 180: \ufffe-\U0010ffff
  281. 181: \u0001-';'
  282. 182: '?'-\u00ff
  283. 183: .
  284. */