parser.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package parser
  2. import (
  3. "github/runnignwater/monkey/ast"
  4. "github/runnignwater/monkey/lexer"
  5. "github/runnignwater/monkey/token"
  6. )
  7. /**
  8. * @Author: simon
  9. * @Author: ynwdlxm@163.com
  10. * @Date: 2022/10/2 下午9:55
  11. * @Desc:
  12. */
  13. type Parser struct {
  14. l *lexer.Lexer // point to the instance of the lexer
  15. curToken token.Token // point to the current token
  16. peekToken token.Token // point to the next token
  17. }
  18. func New(l *lexer.Lexer) *Parser {
  19. p := &Parser{l: l}
  20. // Read two tokens, so curToken and peekToken are both set
  21. p.nextToken()
  22. p.nextToken()
  23. return p
  24. }
  25. func (p *Parser) nextToken() {
  26. p.curToken = p.peekToken
  27. p.peekToken = p.l.NextToken()
  28. }
  29. func (p *Parser) ParseProgram() *ast.Program {
  30. program := &ast.Program{}
  31. program.Statements = []ast.Statement{}
  32. for p.curToken.Type != token.EOF {
  33. stmt := p.parseStatement()
  34. if stmt != nil {
  35. program.Statements = append(program.Statements, stmt)
  36. }
  37. p.nextToken()
  38. }
  39. return program
  40. }
  41. func (p *Parser) parseStatement() ast.Statement {
  42. switch p.curToken.Type {
  43. case token.LET:
  44. return p.parseLetStatement()
  45. default:
  46. return nil
  47. }
  48. }
  49. // let <identifier> = <expression>;
  50. func (p *Parser) parseLetStatement() *ast.LetStatement {
  51. stmt := &ast.LetStatement{Token: p.curToken}
  52. if !p.expectPeek(token.IDENT) {
  53. return nil
  54. }
  55. stmt.Name = &ast.Identifier{Token: p.curToken, Value: p.curToken.Literal}
  56. if !p.expectPeek(token.ASSIGN) {
  57. return nil
  58. }
  59. // TODO: we're skipping the expression until we
  60. // we encounter a semicolon
  61. for !p.curTokenIs(token.SEMICOLON) {
  62. p.nextToken()
  63. }
  64. return stmt
  65. }
  66. func (p *Parser) curTokenIs(t token.TypeToken) bool {
  67. return p.curToken.Type == t
  68. }
  69. func (p *Parser) peekTokenIs(t token.TypeToken) bool {
  70. return p.peekToken.Type == t
  71. }
  72. func (p *Parser) expectPeek(t token.TypeToken) bool {
  73. if p.peekTokenIs(t) {
  74. p.nextToken()
  75. return true
  76. } else {
  77. return false
  78. }
  79. }