parser.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  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. /* Grammar:
  17. Desrired syntax (verified LL(1) on smlweb.cpsc.ucalgary.ca)
  18. PROGRAM -> STATEMENTS.
  19. STATEMENTS -> STATEMENT STATEMENTS | .
  20. STATEMENT -> EXPRESSION eos | BLOCK .
  21. WORDOPS -> WORDOP WORDOPS | .
  22. EXPRESSION -> SETTER | GETTER | COMMAND.
  23. COMMAND -> WORDVALUE PARAMETERS.
  24. PARAMETERS -> PARAMETER PARAMETERS | .
  25. PARAMETER -> WORDVALUE | PARENTHESIS | GETTER | ARRARY | BLOCK .
  26. PARENTHESIS -> '(' EXPRESSION ')' .
  27. BLOCK -> '{' STATEMENTS '}' .
  28. WORDVALUE -> word | VALUE.
  29. VALUE -> string | integer | float | symbol.
  30. SETTER -> set word PARAMETERS .
  31. GETTER -> get word .
  32. *
  33. * program -> statements
  34. * statements -> statement+
  35. * statement -> get / set / command
  36. *
  37. */
  38. type Parser struct {
  39. Lexer *Lexer
  40. current *Token
  41. LoggerWrapper
  42. }
  43. func (parser *Parser) SetLogger(logger Logger) {
  44. parser.LoggerWrapper = LoggerWrapper{logger}
  45. }
  46. func (parser *Parser) Advance() {
  47. token := parser.Lexer.Lex()
  48. parser.current = &token
  49. parser.LogDebug("Next token: %s\n", token.String())
  50. }
  51. /* Looks at the current token and advances the lexer if the token is of any of
  52. the token kinds given in kinds. In this case it will return the accepted
  53. token and advance the parser. Otherwise, if no token kind matches, the lexer
  54. does not advance and the current token remains the same, except if that was nil.*/
  55. func (parser *Parser) Accept(kinds ...TokenKind) *Token {
  56. if parser.current == nil {
  57. parser.Advance()
  58. }
  59. for _, kind := range kinds {
  60. if kind == parser.current.TokenKind {
  61. accepted := parser.current
  62. parser.Advance()
  63. return accepted
  64. }
  65. }
  66. return nil
  67. }
  68. func (parser *Parser) ParseMany(astkind AstKind, parsefunc func(*Parser) *Ast) *Ast {
  69. ast := NewAst(astkind, nil, nil)
  70. for sub := parsefunc(parser); sub != nil && sub.AstKind != AstKindError; sub = parsefunc(parser) {
  71. ast.AppendChild(sub)
  72. }
  73. return ast
  74. }
  75. func (parser *Parser) NewAstError(message string) *Ast {
  76. sv := StringValue(message + " at token " + parser.current.String())
  77. pos := parser.current.Position
  78. tok := NewToken(TokenKindError, sv, pos)
  79. return NewAst(AstKindError, nil, &tok)
  80. }
  81. func (parser *Parser) ParseAny(astkind AstKind, parsefuncs ...(func(*Parser) *Ast)) *Ast {
  82. ast := NewAst(astkind, nil, nil)
  83. for _, parsefunc := range parsefuncs {
  84. sub := parsefunc(parser)
  85. if sub != nil {
  86. ast.AppendChild(sub)
  87. return ast
  88. }
  89. }
  90. return nil
  91. }
  92. func (parser *Parser) ParseRequireAny(astkind AstKind, parsefuncs ...(func(*Parser) *Ast)) *Ast {
  93. ast := parser.ParseAny(astkind, parsefuncs...)
  94. if ast == nil {
  95. err := parser.NewAstError("Unexpected token")
  96. return err
  97. }
  98. return ast
  99. }
  100. func (parser *Parser) ParseValue() *Ast {
  101. value := parser.Accept(TokenKindInteger, TokenKindString,
  102. TokenKindBoolean, TokenKindFloat, TokenKindSymbol)
  103. if value == nil {
  104. return nil
  105. }
  106. return NewAst(AstKindValue, nil, value)
  107. }
  108. func (parser *Parser) ParseWordValue() *Ast {
  109. value := parser.Accept(TokenKindInteger, TokenKindString,
  110. TokenKindBoolean, TokenKindFloat, TokenKindSymbol, TokenKindWord)
  111. if value == nil {
  112. return nil
  113. }
  114. return NewAst(AstKindWordValue, nil, value)
  115. }
  116. func (parser *Parser) ParseArgument() *Ast {
  117. return parser.ParseAny(AstKindArgument,
  118. (*Parser).ParseWordValue,
  119. (*Parser).ParseGet,
  120. (*Parser).ParseSet,
  121. (*Parser).ParseParenthesis,
  122. (*Parser).ParseList,
  123. (*Parser).ParseBlock)
  124. }
  125. func (parser *Parser) ParseArguments() *Ast {
  126. return parser.ParseMany(AstKindArguments, (*Parser).ParseArgument)
  127. }
  128. func (parser *Parser) ParseList() *Ast {
  129. op := parser.Accept(TokenKindOpenList)
  130. if op == nil {
  131. return nil
  132. }
  133. ast := NewAst(AstKindList, nil, op)
  134. args := parser.ParseArguments()
  135. if args.AstKind == AstKindError {
  136. return args
  137. }
  138. if cp := parser.Accept(TokenKindCloseList); cp == nil {
  139. return parser.NewAstError("expected closing brackets")
  140. }
  141. ast.AppendChild(args)
  142. return ast
  143. }
  144. func (parser *Parser) ParseParenthesis() *Ast {
  145. op := parser.Accept(TokenKindOpenParen)
  146. if op == nil {
  147. return nil
  148. }
  149. ast := NewAst(AstKindParenthesis, nil, op)
  150. expr := parser.ParseExpression()
  151. if expr == nil {
  152. return parser.NewAstError("expected expression")
  153. }
  154. if expr.AstKind == AstKindError {
  155. return expr
  156. }
  157. if cp := parser.Accept(TokenKindCloseParen); cp == nil {
  158. return parser.NewAstError("expected closing parenthesis")
  159. }
  160. ast.AppendChild(expr)
  161. return ast
  162. }
  163. func (parser *Parser) ParseBlock() *Ast {
  164. op := parser.Accept(TokenKindOpenBlock)
  165. if op == nil {
  166. return nil
  167. }
  168. ast := NewAst(AstKindBlock, nil, op)
  169. stats := parser.ParseStatements()
  170. if stats == nil {
  171. return parser.NewAstError("expected expression")
  172. }
  173. if stats.AstKind == AstKindError {
  174. return stats
  175. }
  176. if cp := parser.Accept(TokenKindCloseBlock); cp == nil {
  177. return parser.NewAstError("expected closing block")
  178. }
  179. ast.AppendChild(stats)
  180. return ast
  181. }
  182. /* Parses the target of a set or get expression */
  183. func (parser *Parser) ParseTarget() *Ast {
  184. target := parser.Accept(TokenKindWord, TokenKindSymbol)
  185. ast := NewAst(AstKindTarget, nil, target)
  186. if target == nil {
  187. paren := parser.ParseParenthesis()
  188. if paren == nil {
  189. return parser.NewAstError("expected word, symbol or parenthesis")
  190. }
  191. ast.AppendChild(paren)
  192. }
  193. return ast
  194. }
  195. func (parser *Parser) ParseSet() *Ast {
  196. set := parser.Accept(TokenKindSet)
  197. if set == nil {
  198. return nil
  199. }
  200. ast := NewAst(AstKindGet, nil, set)
  201. target := parser.ParseTarget()
  202. ast.AppendChild(target)
  203. argument := parser.ParseArgument()
  204. if argument == nil {
  205. return parser.NewAstError("Expected argument to set")
  206. }
  207. ast.AppendChild(argument)
  208. return ast
  209. }
  210. func (parser *Parser) ParseGet() *Ast {
  211. get := parser.Accept(TokenKindGet)
  212. if get == nil {
  213. return nil
  214. }
  215. ast := NewAst(AstKindGet, nil, get)
  216. target := parser.ParseTarget()
  217. ast.AppendChild(target)
  218. return ast
  219. }
  220. func (parser *Parser) ParseCommand() *Ast {
  221. word := parser.Accept(TokenKindWord)
  222. if word == nil {
  223. return nil
  224. }
  225. arguments := parser.ParseArguments()
  226. command := NewAst(AstKindCommand, nil, word)
  227. command.AppendChild(arguments)
  228. return command
  229. }
  230. func (parser *Parser) ParseExpression() *Ast {
  231. exp := parser.ParseRequireAny(AstKindExpression, (*Parser).ParseSet,
  232. (*Parser).ParseGet, (*Parser).ParseCommand)
  233. return exp
  234. }
  235. func (parser *Parser) ParseEmptyStatement() *Ast {
  236. eox := parser.Accept(TokenKindEOX)
  237. if eox == nil {
  238. return nil
  239. }
  240. ast := NewAst(AstKindEnd, nil, eox)
  241. return ast
  242. }
  243. func (parser *Parser) ParseStatement() *Ast {
  244. ast := parser.ParseAny(AstKindStatement,
  245. (*Parser).ParseBlock,
  246. (*Parser).ParseSet,
  247. (*Parser).ParseGet,
  248. (*Parser).ParseCommand,
  249. (*Parser).ParseParenthesis)
  250. if eox := parser.Accept(TokenKindEOX); eox == nil {
  251. return parser.NewAstError("expected end of statement")
  252. }
  253. return ast
  254. }
  255. func (parser *Parser) ParseStatements() *Ast {
  256. return parser.ParseMany(AstKindStatements, (*Parser).ParseStatement)
  257. }
  258. func (parser *Parser) ParseProgram() *Ast {
  259. ast := NewAst(AstKindProgram, nil, nil)
  260. stats := parser.ParseStatements()
  261. eof := parser.Accept(TokenKindEOF)
  262. aeof := NewAst(AstKindEnd, nil, eof)
  263. // be lenient with missing EOF for now...
  264. ast.AppendChild(stats)
  265. ast.AppendChild(aeof)
  266. return ast
  267. }
  268. func (parser *Parser) Parse() *Ast {
  269. ast := parser.ParseProgram()
  270. return ast
  271. }
  272. func NewParser(lexer *Lexer) *Parser {
  273. parser := &Parser{lexer, nil, LoggerWrapper{nil}}
  274. return parser
  275. }
  276. func NewParserFromString(input string) *Parser {
  277. lexer := NewLexerFromString(input)
  278. return NewParser(lexer)
  279. }
  280. func NewParserFromFilename(filename string) (*Parser, error) {
  281. lexer, err := NewLexerFromFileName(filename)
  282. if err != nil {
  283. return nil, err
  284. }
  285. return NewParser(lexer), nil
  286. }