alexschneider / teascript

5 stars 2 forks source link

Infinite loop in the parser #61

Closed alexschneider closed 9 years ago

alexschneider commented 9 years ago

These things appear occasionally, but I managed to get this string of tokens (it's invalid, but shouldn't cause any sort of issue like this) to do so consistently. I spent about 45 minutes debugging and wasn't able to figure it out - perhaps someone else sees something I don't.

Maybe we could add a check to all of our while loops to make sure that after every iteration, it did some work. I suspect that that's where our issue is from - either that or there is some path in parseExpression that doesn't consume any tokens that just keeps getting run through when it hits the right thing.

Tokens:

[ { lexeme: 'x', kind: 'ID', start: 0, lineNumber: 1 },
  { lexeme: ':=', kind: ':=', start: 2, lineNumber: 1 },
  { lexeme: '5', kind: 'INTLIT', start: 5, lineNumber: 1 },
  { lexeme: 'newline', kind: 'newline', start: 5, lineNumber: 1 },
  { lexeme: 'foo', kind: 'ID', start: 0, lineNumber: 2 },
  { lexeme: ':=', kind: ':=', start: 4, lineNumber: 2 },
  { lexeme: '123456789', kind: 'INTLIT', start: 7, lineNumber: 2 },
  { lexeme: 'newline', kind: 'newline', start: 7, lineNumber: 2 },
  { lexeme: 'bar', kind: 'ID', start: 0, lineNumber: 4 },
  { lexeme: ':=', kind: ':=', start: 4, lineNumber: 4 },
  { lexeme: '11', kind: 'INTLIT', start: 7, lineNumber: 4 },
  { lexeme: 'newline', kind: 'newline', start: 7, lineNumber: 4 },
  { lexeme: 'abc', kind: 'ID', start: 0, lineNumber: 5 },
  { lexeme: ':=', kind: ':=', start: 4, lineNumber: 5 },
  { lexeme: 'newline', kind: 'newline', start: 7, lineNumber: 5 },
  { lexeme: 'defg', kind: 'ID', start: 0, lineNumber: 6 },
  { lexeme: ':=', kind: ':=', start: 5, lineNumber: 6 },
  { lexeme: 'newline', kind: 'newline', start: 8, lineNumber: 6 },
  { lexeme: 'y', kind: 'ID', start: 0, lineNumber: 8 },
  { lexeme: ':=', kind: ':=', start: 2, lineNumber: 8 },
  { lexeme: '1.23', kind: 'FLOATLIT', start: 5, lineNumber: 8 },
  { lexeme: 'newline', kind: 'newline', start: 5, lineNumber: 8 },
  { lexeme: 'z', kind: 'ID', start: 0, lineNumber: 9 },
  { lexeme: ':=', kind: ':=', start: 2, lineNumber: 9 },
  { lexeme: '0.345', kind: 'FLOATLIT', start: 5, lineNumber: 9 },
  { lexeme: 'newline', kind: 'newline', start: 5, lineNumber: 9 },
  { lexeme: 'bool1', kind: 'ID', start: 0, lineNumber: 11 },
  { lexeme: ':=', kind: ':=', start: 6, lineNumber: 11 },
  { lexeme: 'true', kind: 'true', start: 9, lineNumber: 11 },
  { lexeme: 'newline', kind: 'newline', start: 9, lineNumber: 11 },
  { lexeme: 'bool2', kind: 'ID', start: 0, lineNumber: 12 },
  { lexeme: ':=', kind: ':=', start: 6, lineNumber: 12 },
  { lexeme: 'false', kind: 'false', start: 9, lineNumber: 12 },
  { lexeme: 'newline', kind: 'newline', start: 9, lineNumber: 12 },
  { lexeme: 'set1', kind: 'ID', start: 0, lineNumber: 14 },
  { lexeme: ':=', kind: ':=', start: 5, lineNumber: 14 },
  { lexeme: '<', kind: '<', start: 8, lineNumber: 14 },
  { lexeme: '1', kind: 'INTLIT', start: 9, lineNumber: 14 },
  { lexeme: ',', kind: ',', start: 10, lineNumber: 14 },
  { lexeme: '2', kind: 'INTLIT', start: 12, lineNumber: 14 },
  { lexeme: ',', kind: ',', start: 13, lineNumber: 14 },
  { lexeme: '3', kind: 'INTLIT', start: 15, lineNumber: 14 },
  { lexeme: '>', kind: '>', start: 16, lineNumber: 14 },
  { lexeme: 'newline', kind: 'newline', start: 16, lineNumber: 14 },
  { lexeme: 'set2', kind: 'ID', start: 0, lineNumber: 16 },
  { lexeme: ':=', kind: ':=', start: 5, lineNumber: 16 },
  { lexeme: '<', kind: '<', start: 8, lineNumber: 16 },
  { lexeme: '1', kind: 'INTLIT', start: 9, lineNumber: 16 },
  { lexeme: ',', kind: ',', start: 10, lineNumber: 16 },
  { lexeme: '2', kind: 'INTLIT', start: 12, lineNumber: 16 },
  { lexeme: ',', kind: ',', start: 13, lineNumber: 16 },
  { lexeme: '3', kind: 'INTLIT', start: 15, lineNumber: 16 },
  { lexeme: ',', kind: ',', start: 16, lineNumber: 16 },
  { lexeme: '<', kind: '<', start: 18, lineNumber: 16 },
  { lexeme: '4', kind: 'INTLIT', start: 19, lineNumber: 16 },
  { lexeme: ',', kind: ',', start: 20, lineNumber: 16 },
  { lexeme: '5', kind: 'INTLIT', start: 22, lineNumber: 16 },
  { lexeme: ',', kind: ',', start: 23, lineNumber: 16 },
  { lexeme: '6', kind: 'INTLIT', start: 25, lineNumber: 16 },
  { lexeme: '>', kind: '>', start: 26, lineNumber: 16 },
  { lexeme: ',', kind: ',', start: 27, lineNumber: 16 },
  { lexeme: '<', kind: '<', start: 29, lineNumber: 16 },
  { lexeme: '7', kind: 'INTLIT', start: 30, lineNumber: 16 },
  { lexeme: ',', kind: ',', start: 31, lineNumber: 16 },
  { lexeme: '8', kind: 'INTLIT', start: 33, lineNumber: 16 },
  { lexeme: ',', kind: ',', start: 34, lineNumber: 16 },
  { lexeme: '<', kind: '<', start: 36, lineNumber: 16 },
  { lexeme: '9', kind: 'INTLIT', start: 37, lineNumber: 16 },
  { lexeme: ',', kind: ',', start: 38, lineNumber: 16 },
  { lexeme: '10', kind: 'INTLIT', start: 40, lineNumber: 16 },
  { lexeme: ',', kind: ',', start: 42, lineNumber: 16 },
  { lexeme: '11', kind: 'INTLIT', start: 44, lineNumber: 16 },
  { lexeme: '>', kind: '>', start: 46, lineNumber: 16 },
  { lexeme: '>', kind: '>', start: 47, lineNumber: 16 },
  { lexeme: '>', kind: '>', start: 48, lineNumber: 16 },
  { lexeme: 'newline', kind: 'newline', start: 48, lineNumber: 16 },
  { lexeme: 'comma_example1', kind: 'ID', start: 0, lineNumber: 19 },
  { lexeme: ':=', kind: ':=', start: 15, lineNumber: 19 },
  { lexeme: '{', kind: '{', start: 18, lineNumber: 19 },
  { lexeme: 'a', kind: 'ID', start: 19, lineNumber: 19 },
  { lexeme: ':', kind: ':', start: 20, lineNumber: 19 },
  { lexeme: '1', kind: 'INTLIT', start: 21, lineNumber: 19 },
  { lexeme: ',', kind: ',', start: 22, lineNumber: 19 },
  { lexeme: 'b', kind: 'ID', start: 24, lineNumber: 19 },
  { lexeme: ':', kind: ':', start: 25, lineNumber: 19 },
  { lexeme: '2', kind: 'INTLIT', start: 26, lineNumber: 19 },
  { lexeme: ',', kind: ',', start: 27, lineNumber: 19 },
  { lexeme: '}', kind: '}', start: 28, lineNumber: 19 },
  { lexeme: 'newline', kind: 'newline', start: 28, lineNumber: 19 },
  { lexeme: 'comma_example2', kind: 'ID', start: 0, lineNumber: 20 },
  { lexeme: ':=', kind: ':=', start: 15, lineNumber: 20 },
  { lexeme: '<', kind: '<', start: 18, lineNumber: 20 },
  { lexeme: '1', kind: 'INTLIT', start: 19, lineNumber: 20 },
  { lexeme: ',', kind: ',', start: 20, lineNumber: 20 },
  { lexeme: '2', kind: 'INTLIT', start: 21, lineNumber: 20 },
  { lexeme: ',', kind: ',', start: 22, lineNumber: 20 },
  { lexeme: '>', kind: '>', start: 23, lineNumber: 20 },
  { lexeme: 'newline', kind: 'newline', start: 23, lineNumber: 20 },
  { lexeme: 'comma_example3', kind: 'ID', start: 0, lineNumber: 21 },
  { lexeme: ':=', kind: ':=', start: 15, lineNumber: 21 },
  { lexeme: '[', kind: '[', start: 18, lineNumber: 21 },
  { lexeme: '1', kind: 'INTLIT', start: 19, lineNumber: 21 },
  { lexeme: ',', kind: ',', start: 20, lineNumber: 21 },
  { lexeme: '2', kind: 'INTLIT', start: 21, lineNumber: 21 },
  { lexeme: ',', kind: ',', start: 22, lineNumber: 21 },
  { lexeme: ']', kind: ']', start: 23, lineNumber: 21 },
  { lexeme: 'newline', kind: 'newline', start: 23, lineNumber: 21 },
  { lexeme: 'combo', kind: 'ID', start: 0, lineNumber: 23 },
  { lexeme: ':=', kind: ':=', start: 6, lineNumber: 23 },
  { lexeme: '[', kind: '[', start: 9, lineNumber: 23 },
  { lexeme: '<', kind: '<', start: 10, lineNumber: 23 },
  { lexeme: 'a', kind: 'ID', start: 11, lineNumber: 23 },
  { lexeme: ',', kind: ',', start: 12, lineNumber: 23 },
  { lexeme: 'b', kind: 'ID', start: 14, lineNumber: 23 },
  { lexeme: ',', kind: ',', start: 15, lineNumber: 23 },
  { lexeme: 'c', kind: 'ID', start: 17, lineNumber: 23 },
  { lexeme: '>', kind: '>', start: 18, lineNumber: 23 },
  { lexeme: ',', kind: ',', start: 19, lineNumber: 23 },
  { lexeme: '{', kind: '{', start: 21, lineNumber: 23 },
  { lexeme: 'foo', kind: 'ID', start: 22, lineNumber: 23 },
  { lexeme: ':', kind: ':', start: 25, lineNumber: 23 },
  { lexeme: 'newline', kind: 'newline', start: 27, lineNumber: 23 },
  { lexeme: 'multiline_combo',
    kind: 'ID',
    start: 0,
    lineNumber: 25 },
  { lexeme: ':=', kind: ':=', start: 16, lineNumber: 25 },
  { lexeme: '[', kind: '[', start: 19, lineNumber: 25 },
  { lexeme: 'newline', kind: 'newline', start: 19, lineNumber: 25 },
  { lexeme: '{', kind: '{', start: 2, lineNumber: 26 },
  { lexeme: 'newline', kind: 'newline', start: 2, lineNumber: 26 },
  { lexeme: 'a', kind: 'ID', start: 4, lineNumber: 27 },
  { lexeme: ':', kind: ':', start: 5, lineNumber: 27 },
  { lexeme: 'b', kind: 'ID', start: 7, lineNumber: 27 },
  { lexeme: ',', kind: ',', start: 8, lineNumber: 27 },
  { lexeme: 'newline', kind: 'newline', start: 8, lineNumber: 27 },
  { lexeme: 'c', kind: 'ID', start: 4, lineNumber: 28 },
  { lexeme: ':', kind: ':', start: 5, lineNumber: 28 },
  { lexeme: 'd', kind: 'ID', start: 7, lineNumber: 28 },
  { lexeme: 'newline', kind: 'newline', start: 7, lineNumber: 28 },
  { lexeme: '}', kind: '}', start: 2, lineNumber: 29 },
  { lexeme: ',', kind: ',', start: 3, lineNumber: 29 },
  { lexeme: 'newline', kind: 'newline', start: 3, lineNumber: 29 },
  { lexeme: '<', kind: '<', start: 2, lineNumber: 30 },
  { lexeme: '1', kind: 'INTLIT', start: 3, lineNumber: 30 },
  { lexeme: ',', kind: ',', start: 4, lineNumber: 30 },
  { lexeme: '2', kind: 'INTLIT', start: 6, lineNumber: 30 },
  { lexeme: ',', kind: ',', start: 7, lineNumber: 30 },
  { lexeme: '3', kind: 'INTLIT', start: 9, lineNumber: 30 },
  { lexeme: '>', kind: '>', start: 10, lineNumber: 30 },
  { lexeme: ',', kind: ',', start: 11, lineNumber: 30 },
  { lexeme: 'newline', kind: 'newline', start: 11, lineNumber: 30 },
  { lexeme: '{', kind: '{', start: 2, lineNumber: 31 },
  { lexeme: 'e', kind: 'ID', start: 3, lineNumber: 31 },
  { lexeme: ':', kind: ':', start: 4, lineNumber: 31 },
  { lexeme: 'f', kind: 'ID', start: 5, lineNumber: 31 },
  { lexeme: ',', kind: ',', start: 6, lineNumber: 31 },
  { lexeme: 'g', kind: 'ID', start: 8, lineNumber: 31 },
  { lexeme: ':', kind: ':', start: 9, lineNumber: 31 },
  { lexeme: 'h', kind: 'ID', start: 10, lineNumber: 31 },
  { lexeme: '}', kind: '}', start: 11, lineNumber: 31 },
  { lexeme: ',', kind: ',', start: 12, lineNumber: 31 },
  { lexeme: 'newline', kind: 'newline', start: 12, lineNumber: 31 },
  { lexeme: '[', kind: '[', start: 2, lineNumber: 32 },
  { lexeme: '5', kind: 'INTLIT', start: 3, lineNumber: 32 },
  { lexeme: ',', kind: ',', start: 4, lineNumber: 32 },
  { lexeme: '6', kind: 'INTLIT', start: 6, lineNumber: 32 },
  { lexeme: ',', kind: ',', start: 7, lineNumber: 32 },
  { lexeme: '[', kind: '[', start: 9, lineNumber: 32 },
  { lexeme: '7', kind: 'INTLIT', start: 10, lineNumber: 32 },
  { lexeme: ',', kind: ',', start: 11, lineNumber: 32 },
  { lexeme: '[', kind: '[', start: 13, lineNumber: 32 },
  { lexeme: '8', kind: 'INTLIT', start: 14, lineNumber: 32 },
  { lexeme: ',', kind: ',', start: 15, lineNumber: 32 },
  { lexeme: '9', kind: 'INTLIT', start: 16, lineNumber: 32 },
  { lexeme: ']', kind: ']', start: 17, lineNumber: 32 },
  { lexeme: ']', kind: ']', start: 18, lineNumber: 32 },
  { lexeme: ']', kind: ']', start: 19, lineNumber: 32 },
  { lexeme: 'newline', kind: 'newline', start: 19, lineNumber: 32 },
  { lexeme: ']', kind: ']', start: 0, lineNumber: 33 },
  { lexeme: 'newline', kind: 'newline', start: 0, lineNumber: 33 },
  { lexeme: 'nil', kind: 'ID', start: 0, lineNumber: 35 },
  { lexeme: ':=', kind: ':=', start: 4, lineNumber: 35 },
  { lexeme: 'none', kind: 'none', start: 7, lineNumber: 35 },
  { lexeme: 'newline', kind: 'newline', start: 7, lineNumber: 35 },
  { lexeme: 'a', kind: 'ID', start: 0, lineNumber: 37 },
  { lexeme: ':=', kind: ':=', start: 2, lineNumber: 37 },
  { lexeme: '[', kind: '[', start: 5, lineNumber: 37 },
  { lexeme: '1', kind: 'INTLIT', start: 6, lineNumber: 37 },
  { lexeme: ',', kind: ',', start: 7, lineNumber: 37 },
  { lexeme: 'x', kind: 'ID', start: 9, lineNumber: 37 },
  { lexeme: '*', kind: '*', start: 10, lineNumber: 37 },
  { lexeme: '5', kind: 'INTLIT', start: 11, lineNumber: 37 },
  { lexeme: ',', kind: ',', start: 12, lineNumber: 37 },
  { lexeme: '12', kind: 'INTLIT', start: 14, lineNumber: 37 },
  { lexeme: ']', kind: ']', start: 16, lineNumber: 37 },
  { lexeme: 'newline', kind: 'newline', start: 16, lineNumber: 37 },
  { lexeme: 'b', kind: 'ID', start: 0, lineNumber: 38 },
  { lexeme: ':=', kind: ':=', start: 2, lineNumber: 38 },
  { lexeme: '{', kind: '{', start: 5, lineNumber: 38 },
  { lexeme: 'a', kind: 'ID', start: 6, lineNumber: 38 },
  { lexeme: ':', kind: ':', start: 7, lineNumber: 38 },
  { lexeme: '123', kind: 'INTLIT', start: 9, lineNumber: 38 },
  { lexeme: ',', kind: ',', start: 12, lineNumber: 38 },
  { lexeme: 'b', kind: 'ID', start: 14, lineNumber: 38 },
  { lexeme: ':', kind: ':', start: 15, lineNumber: 38 },
  { lexeme: '55', kind: 'INTLIT', start: 17, lineNumber: 38 },
  { lexeme: '*', kind: '*', start: 19, lineNumber: 38 },
  { lexeme: '123', kind: 'INTLIT', start: 20, lineNumber: 38 },
  { lexeme: ',', kind: ',', start: 23, lineNumber: 38 },
  { lexeme: 'c', kind: 'ID', start: 25, lineNumber: 38 },
  { lexeme: ':', kind: ':', start: 26, lineNumber: 38 },
  { lexeme: '33', kind: 'INTLIT', start: 28, lineNumber: 38 },
  { lexeme: '}', kind: '}', start: 30, lineNumber: 38 },
  { lexeme: 'newline', kind: 'newline', start: 30, lineNumber: 38 },
  { lexeme: 'x', kind: 'ID', start: 0, lineNumber: 42 },
  { lexeme: '=', kind: '=', start: 2, lineNumber: 42 },
  { lexeme: '1', kind: 'INTLIT', start: 4, lineNumber: 42 },
  { lexeme: 'newline', kind: 'newline', start: 4, lineNumber: 42 },
  { lexeme: 'foo', kind: 'ID', start: 0, lineNumber: 43 },
  { lexeme: '=', kind: '=', start: 4, lineNumber: 43 },
  { lexeme: '987654321', kind: 'INTLIT', start: 6, lineNumber: 43 },
  { lexeme: 'newline', kind: 'newline', start: 6, lineNumber: 43 },
  { lexeme: 'bar', kind: 'ID', start: 0, lineNumber: 45 },
  { lexeme: '=', kind: '=', start: 4, lineNumber: 45 },
  { lexeme: '22', kind: 'INTLIT', start: 6, lineNumber: 45 },
  { lexeme: 'newline', kind: 'newline', start: 6, lineNumber: 45 },
  { lexeme: 'abc', kind: 'ID', start: 0, lineNumber: 46 },
  { lexeme: '=', kind: '=', start: 4, lineNumber: 46 },
  { lexeme: 'newline', kind: 'newline', start: 6, lineNumber: 46 },
  { lexeme: 'defg', kind: 'ID', start: 0, lineNumber: 47 },
  { lexeme: '=', kind: '=', start: 5, lineNumber: 47 },
  { lexeme: 'newline', kind: 'newline', start: 7, lineNumber: 47 },
  { lexeme: 'y', kind: 'ID', start: 0, lineNumber: 49 },
  { lexeme: '=', kind: '=', start: 2, lineNumber: 49 },
  { lexeme: '32.1', kind: 'FLOATLIT', start: 4, lineNumber: 49 },
  { lexeme: 'newline', kind: 'newline', start: 4, lineNumber: 49 },
  { lexeme: 'bool1', kind: 'ID', start: 0, lineNumber: 51 },
  { lexeme: '=', kind: '=', start: 6, lineNumber: 51 },
  { lexeme: 'false', kind: 'false', start: 8, lineNumber: 51 },
  { lexeme: 'newline', kind: 'newline', start: 8, lineNumber: 51 },
  { lexeme: 'nil', kind: 'ID', start: 0, lineNumber: 53 },
  { lexeme: '=', kind: '=', start: 4, lineNumber: 53 },
  { lexeme: '2', kind: 'INTLIT', start: 6, lineNumber: 53 },
  { lexeme: 'newline', kind: 'newline', start: 6, lineNumber: 53 },
  { lexeme: 'nil', kind: 'ID', start: 0, lineNumber: 54 },
  { lexeme: '=', kind: '=', start: 4, lineNumber: 54 },
  { lexeme: 'none', kind: 'none', start: 6, lineNumber: 54 },
  { lexeme: 'newline', kind: 'newline', start: 6, lineNumber: 54 },
  { kind: 'EOF', lexeme: 'EOF', start: 0 } ]
rtoal commented 9 years ago

If you have an infinite loop in your parser, then the way to debug it is to print out the token each time you call match(). It will show you where you are getting stuck. Also maybe print out the name of the parsing function you are entering.

alexschneider commented 9 years ago

Actually looking at it, match doesn't look like it always consumes a token - specifically if there's an error. I'm 99% sure I fixed this, so perhaps a merge reverted it and I didn't catch it.