parser.go 2.5 KB

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