parser.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package muesli
  2. import (
  3. _ "bufio"
  4. _ "bytes"
  5. _ "errors"
  6. _ "fmt"
  7. _ "io"
  8. _ "os"
  9. _ "reflect"
  10. _ "runtime"
  11. _ "strings"
  12. _ "unicode"
  13. // "gitlab.com/beoran/woe/graphviz"
  14. // _ "gitlab.com/beoran/woe/monolog"
  15. )
  16. type AstKind int
  17. const (
  18. AstKindProgram = AstKind(iota)
  19. AstKindStatements
  20. AstKindStatement
  21. AstKindSet
  22. AstKindGet
  23. AstKindCommand
  24. AstKindArguments
  25. AstKindBlock
  26. AstKindList
  27. AstKindCapture
  28. AstKindWordValue
  29. AstKindWord
  30. AstKindType
  31. AstKindValue
  32. AstKindEox
  33. AstKindError
  34. )
  35. type Parser struct {
  36. Lexer Lexer
  37. Ast
  38. next *Token
  39. current *Token
  40. }
  41. func (parser *Parser) Peek() *Token {
  42. if parser.next == nil {
  43. token := parser.Lexer.Lex()
  44. parser.next = &token
  45. }
  46. return parser.next
  47. }
  48. func (parser *Parser) Next() *Token {
  49. next := parser.Peek()
  50. parser.current = next
  51. parser.next = nil
  52. parser.Peek()
  53. return parser.current
  54. }
  55. func (parser *Parser) Require(wanted TokenKind, astkind AstKind, parent *Ast) *Ast {
  56. token := parser.Next()
  57. if token.TokenKind == wanted {
  58. return parent.NewChild(astkind, token)
  59. }
  60. return parent.NewChild(AstKindError, token)
  61. }
  62. func (parser *Parser) ParseMany(
  63. astkind AstKind, parsefunc func(*Parser) *Ast) *Ast {
  64. ast := NewAst(astkind, nil, nil)
  65. for sub := parsefunc(parser); sub != nil && sub.AstKind != AstKindError; sub = parsefunc(parser) {
  66. ast.AppendChild(sub)
  67. }
  68. return ast
  69. }
  70. func (parser *Parser) NewAstError(message string) *Ast {
  71. sv := StringValue(message)
  72. pos := parser.current.Position
  73. tok := NewToken(TokenKindError, sv, pos)
  74. return NewAst(AstKindError, nil, &tok)
  75. }
  76. func (parser *Parser) ParseAny(astkind AstKind, parsefuncs ...(func(*Parser) *Ast)) *Ast {
  77. ast := NewAst(astkind, nil, nil)
  78. for _, parsefunc := range parsefuncs {
  79. sub := parsefunc(parser)
  80. if sub != nil {
  81. ast.AppendChild(sub)
  82. return ast
  83. }
  84. }
  85. err := parser.NewAstError("Unexpected token")
  86. ast.AppendChild(err)
  87. return ast
  88. }
  89. func (parser *Parser) ParseSet() *Ast {
  90. return nil
  91. }
  92. func (parser *Parser) ParseGet() *Ast {
  93. return nil
  94. }
  95. func (parser *Parser) ParseCommand() *Ast {
  96. return nil
  97. }
  98. func (parser *Parser) ParseStatement() *Ast {
  99. return parser.ParseAny(AstKindStatement,
  100. (*Parser).ParseSet, (*Parser).ParseGet, (*Parser).ParseCommand)
  101. }
  102. func (parser *Parser) ParseStatements() *Ast {
  103. return parser.ParseMany(AstKindStatements, (*Parser).ParseStatement)
  104. }
  105. func (parser *Parser) ParseProgram() *Ast {
  106. ast := NewAst(AstKindProgram, nil, nil)
  107. stats := parser.ParseStatements()
  108. ast.AppendChild(stats)
  109. return ast
  110. }
  111. func (parser *Parser) Parse() *Ast {
  112. ast := parser.ParseProgram()
  113. return ast
  114. }