parser.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  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. CLOSED -> BLOCK | LIST | PARENTHESIS .
  20. STATEMENTS -> STATEMENT STATEMENTS | .
  21. STATEMENT -> CLOSED | EXPRESSION eos | eos .
  22. COMMAND -> word PARAMETERS.
  23. PARAMETERS -> PARAMETER PARAMETERS | .
  24. PARAMETER -> WORDVALUE | GETTER | SETTER | CLOSED .
  25. EXPRESSION -> COMMAND | GETTER | SETTER | VALUE.
  26. PARENTHESIS -> closeparen EXPRESSION openparen .
  27. BLOCK -> openblock STATEMENTS closeblock .
  28. LIST -> openlist PARAMETERS closelist .
  29. VALUE -> string | int | float | symbol | type .
  30. WORDVALUE -> word | VALUE.
  31. SETTER -> set word PARAMETER .
  32. GETTER -> get word .
  33. *
  34. * program -> statements
  35. * statements -> statement+
  36. * statement -> get / set / command
  37. *
  38. */
  39. type Parser struct {
  40. Lexer *Lexer
  41. current Token
  42. LoggerWrapper
  43. }
  44. func (parser *Parser) SetLogger(logger Logger) {
  45. parser.LoggerWrapper = LoggerWrapper{logger}
  46. }
  47. func (parser *Parser) Advance() {
  48. token := parser.Lexer.Lex()
  49. parser.current = token
  50. parser.LogDebug("Next token: %s\n", token.String())
  51. }
  52. /* Looks at the current token and advances the lexer if the token is of any of
  53. the token kinds given in kinds. In this case it will return the accepted
  54. token and advance the parser. Otherwise, if no token kind matches, the lexer
  55. does not advance and the current token remains the same, except if that was nil.*/
  56. func (parser *Parser) Accept(kinds ...TokenKind) Token {
  57. if parser.current.IsNone() {
  58. parser.Advance()
  59. }
  60. for _, kind := range kinds {
  61. if kind == parser.current.TokenKind {
  62. accepted := parser.current
  63. parser.Advance()
  64. parser.LogDebug("Accept: Accepted token: %s\n", accepted.String())
  65. return accepted
  66. }
  67. }
  68. if parser.current.TokenKind == TokenKindEOF {
  69. parser.LogDebug("Unexpected EOF\n")
  70. return parser.Lexer.MakeErrorfToken("Unexpected EOF in Accept")
  71. }
  72. parser.LogDebug("Accept: No Token: no %s in %v.", parser.current.TokenKind, kinds)
  73. return NoToken()
  74. }
  75. func (parser *Parser) ParseMany(kind AstKind, parent *Ast, parsefunc func(*Parser) *Ast) *Ast {
  76. children := EmptyAstArray()
  77. for sub := parsefunc(parser); parser.current.TokenKind != TokenKindEOF &&
  78. !sub.IsNone() && !sub.IsError(); sub = parsefunc(parser) {
  79. children = append(children, sub)
  80. }
  81. if kind == AstKindFlatten {
  82. if parent == nil {
  83. panic("Why nil?")
  84. }
  85. parent.AppendChildren(children...)
  86. return parent
  87. } else {
  88. return NewAst(kind, parent, children, NoToken())
  89. }
  90. }
  91. func (parser *Parser) NewAstError(message string, args ...interface{}) *Ast {
  92. sv := StringValue(fmt.Sprintf(message+" at token "+parser.current.String(), args))
  93. pos := parser.current.Position
  94. tok := NewToken(TokenKindError, sv, pos)
  95. return NewAst(AstKindError, nil, EmptyAstArray(), tok)
  96. }
  97. func (parser *Parser) ParseAny(astkind AstKind, parsefuncs ...(func(*Parser) *Ast)) *Ast {
  98. var ast * Ast
  99. if astkind != AstKindFlatten {
  100. ast = NewEmptyAst(astkind)
  101. }
  102. for _, parsefunc := range parsefuncs {
  103. parser.LogDebug("ParseAny: %s: trying: %s", astkind, GetFunctionName(parsefunc))
  104. sub := parsefunc(parser)
  105. if !sub.IsNone() {
  106. if astkind == AstKindFlatten {
  107. return sub
  108. } else if sub.IsFlatten() {
  109. return ast
  110. } else {
  111. ast.AppendChild(sub)
  112. }
  113. return ast
  114. }
  115. }
  116. return NewAstNone()
  117. }
  118. func (parser *Parser) ParseRequireAny(astkind AstKind, parsefuncs ...(func(*Parser) *Ast)) *Ast {
  119. ast := parser.ParseAny(astkind, parsefuncs...)
  120. if ast.IsNone() {
  121. err := parser.NewAstError("Unexpected token in %v", parsefuncs)
  122. return err
  123. }
  124. return ast
  125. }
  126. // Also handles none or error vales of the token
  127. func (parser *Parser) NewAst(kind AstKind, parent * Ast, children []*Ast, value Token) *Ast{
  128. if value.IsNone() {
  129. return NewAstNone()
  130. }
  131. if value.IsError() {
  132. return NewAst(AstKindError, parent, children, value)
  133. }
  134. return NewAst(kind, parent, children, value)
  135. }
  136. func (parser *Parser) ParseValue() *Ast {
  137. parser.LogDebug("ParseValue: %s\n", parser.current.String())
  138. value := parser.Accept(TokenKindInteger, TokenKindString,
  139. TokenKindBoolean, TokenKindNil, TokenKindFloat, TokenKindSymbol)
  140. return parser.NewAst(AstKindValue, nil, EmptyAstArray(), value)
  141. }
  142. func (parser *Parser) ParseWordValue() *Ast {
  143. parser.LogDebug("ParseWordValue: %s\n", parser.current.String())
  144. value := parser.Accept(TokenKindInteger, TokenKindString,
  145. TokenKindBoolean, TokenKindNil, TokenKindFloat, TokenKindSymbol,
  146. TokenKindType, TokenKindWord)
  147. return parser.NewAst(AstKindWordValue, nil, EmptyAstArray(), value)
  148. }
  149. func (parser *Parser) ParseArgument() *Ast {
  150. parser.LogDebug("ParseArgument: %s\n", parser.current.String())
  151. return parser.ParseAny(AstKindArgument,
  152. (*Parser).ParseGet,
  153. (*Parser).ParseSet,
  154. (*Parser).ParseClosed,
  155. (*Parser).ParseWordValue)
  156. }
  157. func (parser *Parser) ParseArguments() *Ast {
  158. parser.LogDebug("ParseArgument: %s\n", parser.current.String())
  159. return parser.ParseMany(AstKindArguments, nil, (*Parser).ParseArgument)
  160. }
  161. func (parser *Parser) ParseList() *Ast {
  162. parser.LogDebug("ParseList: %s\n", parser.current.String())
  163. op := parser.Accept(TokenKindOpenList)
  164. if op.IsNone() {
  165. return NewAstNone()
  166. }
  167. if op.IsError() {
  168. return parser.NewAstError("Unexpected value.")
  169. }
  170. ast := NewAstWithToken(AstKindList, op)
  171. args := parser.ParseArguments()
  172. if AstIsError(args) {
  173. return args
  174. }
  175. if cp := parser.Accept(TokenKindCloseList); cp.IsNone() || cp.IsError() {
  176. return parser.NewAstError("expected closing brackets")
  177. }
  178. ast.AppendChild(args)
  179. return ast
  180. }
  181. func (parser *Parser) ParseParenthesis() *Ast {
  182. parser.LogDebug("ParseParenthesis: %s\n", parser.current.String())
  183. op := parser.Accept(TokenKindOpenParen)
  184. if op.IsNone() {
  185. return NewAstNone()
  186. }
  187. if op.IsError() {
  188. return parser.NewAstError("Unexpected value.")
  189. }
  190. ast := NewAstWithToken(AstKindParenthesis, op)
  191. expr := parser.ParseExpression()
  192. if expr.IsNone() {
  193. return parser.NewAstError("expected expression")
  194. }
  195. if AstIsError(expr) {
  196. return expr
  197. }
  198. if cp := parser.Accept(TokenKindCloseParen); cp.IsNone() || cp.IsError() {
  199. return parser.NewAstError("expected closing parenthesis")
  200. }
  201. ast.AppendChild(expr)
  202. return ast
  203. }
  204. func (parser *Parser) ParseBlock() *Ast {
  205. parser.LogDebug("ParseBlock: %s\n", parser.current.String())
  206. op := parser.Accept(TokenKindOpenBlock)
  207. if op.IsNone() {
  208. return NewAstNone()
  209. }
  210. if op.IsError() {
  211. return parser.NewAstError("Unexpected value.")
  212. }
  213. ast := NewAstWithToken(AstKindBlock, op)
  214. stats := parser.ParseStatements()
  215. if stats.IsNone() {
  216. return parser.NewAstError("expected expression")
  217. }
  218. if AstIsError(stats) {
  219. return stats
  220. }
  221. if cp := parser.Accept(TokenKindCloseBlock); cp.IsNone() || cp.IsError() {
  222. return parser.NewAstError("expected closing block")
  223. }
  224. ast.AppendChild(stats)
  225. return ast
  226. }
  227. /* Parses the target of a set or get expression */
  228. func (parser *Parser) ParseTarget() *Ast {
  229. parser.LogDebug("ParseTarget: %s\n", parser.current.String())
  230. target := parser.Accept(TokenKindWord, TokenKindType, TokenKindSymbol)
  231. ast := NewAstWithToken(AstKindTarget, target)
  232. if target.IsNone() {
  233. paren := parser.ParseParenthesis()
  234. if paren.IsNone() {
  235. return parser.NewAstError("expected word, symbol or parenthesis")
  236. }
  237. ast.AppendChild(paren)
  238. }
  239. return ast
  240. }
  241. func (parser *Parser) ParseSet() *Ast {
  242. parser.LogDebug("ParseSet: %s\n", parser.current.String())
  243. set := parser.Accept(TokenKindSet)
  244. if set.IsNone() {
  245. return NewAstNone()
  246. }
  247. ast := NewAstWithToken(AstKindSet, set)
  248. target := parser.ParseTarget()
  249. ast.AppendChild(target)
  250. argument := parser.ParseArgument()
  251. if argument.IsNone() {
  252. return parser.NewAstError("Expected argument to set")
  253. }
  254. ast.AppendChild(argument)
  255. return ast
  256. }
  257. func (parser *Parser) ParseGet() *Ast {
  258. parser.LogDebug("ParseGet: %s\n", parser.current.String())
  259. get := parser.Accept(TokenKindGet)
  260. if get.IsNone() {
  261. return NewAstNone()
  262. }
  263. ast := NewAstWithToken(AstKindGet, get)
  264. target := parser.ParseTarget()
  265. ast.AppendChild(target)
  266. return ast
  267. }
  268. func (parser *Parser) ParseCommand() *Ast {
  269. parser.LogDebug("ParseCommand: %s\n", parser.current.String())
  270. word := parser.Accept(TokenKindWord, TokenKindType)
  271. if word.IsNone() {
  272. return NewAstNone()
  273. }
  274. arguments := parser.ParseArguments()
  275. command := NewAstWithToken(AstKindCommand, word)
  276. command.AppendChild(arguments)
  277. return command
  278. }
  279. func (parser *Parser) ParseClosed() *Ast {
  280. parser.LogDebug("ParseClosed: %s\n", parser.current.String())
  281. exp := parser.ParseAny(AstKindClosed, (*Parser).ParseParenthesis,
  282. (*Parser).ParseBlock, (*Parser).ParseList)
  283. return exp
  284. }
  285. func (parser *Parser) ParseExpression() *Ast {
  286. parser.LogDebug("ParseExpression: %s\n", parser.current.String())
  287. exp := parser.ParseRequireAny(AstKindExpression, (*Parser).ParseCommand,
  288. (*Parser).ParseSet,
  289. (*Parser).ParseGet, (*Parser).ParseValue )
  290. return exp
  291. }
  292. func (parser *Parser) ParseExpressionStatement() *Ast {
  293. parser.LogDebug("ParseExpressionStatement: %s\n", parser.current.String())
  294. expr := parser.ParseExpression()
  295. if expr.IsNone() {
  296. return NewAstNone()
  297. }
  298. if eox := parser.Accept(TokenKindEOX); eox.IsNone() {
  299. return parser.NewAstError("expected end of statement")
  300. }
  301. return NewAstNone()
  302. }
  303. func (parser *Parser) ParseEmptyStatement() *Ast {
  304. parser.LogDebug("ParseEmptyStatement: %s\n", parser.current.String())
  305. if eox := parser.Accept(TokenKindEOX); eox.IsNone() {
  306. return parser.NewAstError("expected end of statement")
  307. }
  308. return NewAstWithToken(AstKindStatement, parser.current)
  309. }
  310. func (parser *Parser) ParseStatement() *Ast {
  311. parser.LogDebug("ParseStatement: %s\n", parser.current.String())
  312. ast := parser.ParseAny(AstKindStatement,
  313. (*Parser).ParseClosed,
  314. (*Parser).ParseExpressionStatement,
  315. (*Parser).ParseEmptyStatement)
  316. return ast
  317. }
  318. func (parser *Parser) ParseStatements() *Ast {
  319. parser.LogDebug("ParseStatements: %s\n", parser.current.String())
  320. return parser.ParseMany(AstKindStatements, nil, (*Parser).ParseStatement)
  321. }
  322. func (parser *Parser) ParseProgram() *Ast {
  323. parser.LogDebug("ParseProgram: %s\n", parser.current.String())
  324. stats := parser.ParseStatements()
  325. // Be lenient with missing EOF for now...
  326. eof := parser.Accept(TokenKindEOF)
  327. aeof := NewAstWithToken(AstKindEnd, eof)
  328. if eof.IsNone() {
  329. aeof = parser.NewAstError("Expceted EOF, have: %s", parser.current.String())
  330. }
  331. children := []*Ast{stats, aeof}
  332. return NewAst(AstKindProgram, nil, children, NoToken())
  333. }
  334. func (parser *Parser) Parse() *Ast {
  335. ast := parser.ParseProgram()
  336. return ast
  337. }
  338. func NewParser(lexer *Lexer) *Parser {
  339. parser := &Parser{lexer, NoToken(), LoggerWrapper{nil}}
  340. return parser
  341. }
  342. func NewParserFromString(input string) *Parser {
  343. lexer := NewLexerFromString(input)
  344. return NewParser(lexer)
  345. }
  346. func NewParserFromFilename(filename string) (*Parser, error) {
  347. lexer, err := NewLexerFromFilename(filename)
  348. if err != nil {
  349. return nil, err
  350. }
  351. return NewParser(lexer), nil
  352. }