parser.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  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. Errors []ParserError
  44. }
  45. // panic with this type on errors that would prevent the parser
  46. // from making progress.
  47. type ParserError struct {
  48. *Parser
  49. *Token
  50. Error error
  51. }
  52. func (parser *Parser) SetLogger(logger Logger) {
  53. parser.LoggerWrapper = LoggerWrapper{logger}
  54. }
  55. func (parser *Parser) Errorf(message string, args ...string) ParserError {
  56. err := fmt.Errorf(message+" at token "+parser.current.String(), args)
  57. pe := ParserError { Parser: parser, Token:&parser.current, Error: err }
  58. parser.Errors = append(parser.Errors, pe)
  59. return pe
  60. }
  61. func (parser *Parser) Panicf(message string, args ...string) {
  62. pe := parser.Errorf(message, args...)
  63. panic(pe)
  64. }
  65. func (parser *Parser) Advance() {
  66. token := parser.Lexer.Lex()
  67. parser.current = token
  68. parser.LogDebug("Next token: %s\n", token.String())
  69. }
  70. /* Looks at the current token and advances the lexer if the token is of any of
  71. the token kinds given in kinds. In this case it will return the accepted
  72. token and advance the parser. Otherwise, if no token kind matches, the lexer
  73. does not advance and the current token remains the same, except if that was nil.*/
  74. func (parser *Parser) Accept(kinds ...TokenKind) Token {
  75. if parser.current.IsNone() {
  76. parser.Advance()
  77. }
  78. for _, kind := range kinds {
  79. if kind == parser.current.TokenKind {
  80. accepted := parser.current
  81. parser.Advance()
  82. parser.LogDebug("Accept: Accepted token: %s\n", accepted.String())
  83. return accepted
  84. }
  85. }
  86. if parser.current.TokenKind == TokenKindEOF {
  87. parser.LogDebug("Unexpected EOF\n")
  88. return parser.Lexer.MakeErrorfToken("Unexpected EOF in Accept")
  89. }
  90. parser.LogDebug("Accept: No Token: no %s in %v.", parser.current.TokenKind, kinds)
  91. return NoToken()
  92. }
  93. func (parser *Parser) ParseMany(kind AstKind, parent *Ast, parsefunc func(*Parser) *Ast) *Ast {
  94. children := EmptyAstArray()
  95. for sub := parsefunc(parser); parser.current.TokenKind != TokenKindEOF &&
  96. !sub.IsNone() && !sub.IsError(); sub = parsefunc(parser) {
  97. children = append(children, sub)
  98. }
  99. if kind == AstKindFlatten {
  100. if parent == nil {
  101. panic("Why nil?")
  102. }
  103. parent.AppendChildren(children...)
  104. return parent
  105. } else {
  106. return NewAst(kind, parent, children, NoToken())
  107. }
  108. }
  109. func (parser *Parser) NewAstError(message string, args ...interface{}) *Ast {
  110. sv := StringValue(fmt.Sprintf(message+" at token "+parser.current.String(), args))
  111. pos := parser.current.Position
  112. tok := NewToken(TokenKindError, sv, pos)
  113. return NewAst(AstKindError, nil, EmptyAstArray(), tok)
  114. }
  115. func (parser *Parser) ParseAny(astkind AstKind, parsefuncs ...(func(*Parser) *Ast)) *Ast {
  116. var ast * Ast
  117. if astkind != AstKindFlatten {
  118. ast = NewEmptyAst(astkind)
  119. }
  120. for _, parsefunc := range parsefuncs {
  121. parser.LogDebug("ParseAny: %s: trying: %s", astkind, GetFunctionName(parsefunc))
  122. sub := parsefunc(parser)
  123. if !sub.IsNone() {
  124. if astkind == AstKindFlatten {
  125. return sub
  126. } else if sub.IsFlatten() {
  127. return ast
  128. } else {
  129. ast.AppendChild(sub)
  130. }
  131. return ast
  132. }
  133. }
  134. return NewAstNone()
  135. }
  136. func (parser *Parser) ParseRequireAny(astkind AstKind, parsefuncs ...(func(*Parser) *Ast)) *Ast {
  137. ast := parser.ParseAny(astkind, parsefuncs...)
  138. if ast.IsNone() {
  139. err := parser.NewAstError("Unexpected token in %v", parsefuncs)
  140. return err
  141. }
  142. return ast
  143. }
  144. // Also handles none or error vales of the token
  145. func (parser *Parser) NewAst(kind AstKind, parent * Ast, children []*Ast, value Token) *Ast{
  146. if value.IsNone() {
  147. return NewAstNone()
  148. }
  149. if value.IsError() {
  150. return NewAst(AstKindError, parent, children, value)
  151. }
  152. return NewAst(kind, parent, children, value)
  153. }
  154. func (parser *Parser) ParseValue() *Ast {
  155. parser.LogDebug("ParseValue: %s\n", parser.current.String())
  156. value := parser.Accept(TokenKindInteger, TokenKindString,
  157. TokenKindBoolean, TokenKindNil, TokenKindFloat, TokenKindSymbol)
  158. return parser.NewAst(AstKindValue, nil, EmptyAstArray(), value)
  159. }
  160. func (parser *Parser) ParseWordValue() *Ast {
  161. parser.LogDebug("ParseWordValue: %s\n", parser.current.String())
  162. value := parser.Accept(TokenKindInteger, TokenKindString,
  163. TokenKindBoolean, TokenKindNil, TokenKindFloat, TokenKindSymbol,
  164. TokenKindType, TokenKindWord)
  165. return parser.NewAst(AstKindWordValue, nil, EmptyAstArray(), value)
  166. }
  167. func (parser *Parser) ParseArgument() *Ast {
  168. parser.LogDebug("ParseArgument: %s\n", parser.current.String())
  169. return parser.ParseAny(AstKindArgument,
  170. (*Parser).ParseGet,
  171. (*Parser).ParseSet,
  172. (*Parser).ParseClosed,
  173. (*Parser).ParseWordValue)
  174. }
  175. func (parser *Parser) ParseArguments() *Ast {
  176. parser.LogDebug("ParseArgument: %s\n", parser.current.String())
  177. return parser.ParseMany(AstKindArguments, nil, (*Parser).ParseArgument)
  178. }
  179. func (parser *Parser) ParseList() *Ast {
  180. parser.LogDebug("ParseList: %s\n", parser.current.String())
  181. op := parser.Accept(TokenKindOpenList)
  182. if op.IsNone() {
  183. return NewAstNone()
  184. }
  185. if op.IsError() {
  186. return parser.NewAstError("Unexpected value.")
  187. }
  188. ast := NewAstWithToken(AstKindList, op)
  189. args := parser.ParseArguments()
  190. if AstIsError(args) {
  191. return args
  192. }
  193. if cp := parser.Accept(TokenKindCloseList); cp.IsNone() || cp.IsError() {
  194. return parser.NewAstError("expected closing brackets")
  195. }
  196. ast.AppendChild(args)
  197. return ast
  198. }
  199. func (parser *Parser) ParseParenthesis() *Ast {
  200. parser.LogDebug("ParseParenthesis: %s\n", parser.current.String())
  201. op := parser.Accept(TokenKindOpenParen)
  202. if op.IsNone() {
  203. return NewAstNone()
  204. }
  205. if op.IsError() {
  206. return parser.NewAstError("Unexpected value.")
  207. }
  208. ast := NewAstWithToken(AstKindParenthesis, op)
  209. expr := parser.ParseExpression()
  210. if expr.IsNone() {
  211. return parser.NewAstError("expected expression")
  212. }
  213. if AstIsError(expr) {
  214. return expr
  215. }
  216. if cp := parser.Accept(TokenKindCloseParen); cp.IsNone() || cp.IsError() {
  217. return parser.NewAstError("expected closing parenthesis")
  218. }
  219. ast.AppendChild(expr)
  220. return ast
  221. }
  222. func (parser *Parser) ParseBlock() *Ast {
  223. parser.LogDebug("ParseBlock: %s\n", parser.current.String())
  224. op := parser.Accept(TokenKindOpenBlock)
  225. if op.IsNone() {
  226. return NewAstNone()
  227. }
  228. if op.IsError() {
  229. return parser.NewAstError("Unexpected value.")
  230. }
  231. ast := NewAstWithToken(AstKindBlock, op)
  232. stats := parser.ParseStatements()
  233. if stats.IsNone() {
  234. return parser.NewAstError("expected expression")
  235. }
  236. if AstIsError(stats) {
  237. return stats
  238. }
  239. if cp := parser.Accept(TokenKindCloseBlock); cp.IsNone() || cp.IsError() {
  240. return parser.NewAstError("expected closing block")
  241. }
  242. ast.AppendChild(stats)
  243. return ast
  244. }
  245. /* Parses the target of a set or get expression */
  246. func (parser *Parser) ParseTarget() *Ast {
  247. parser.LogDebug("ParseTarget: %s\n", parser.current.String())
  248. target := parser.Accept(TokenKindWord, TokenKindType, TokenKindSymbol)
  249. ast := NewAstWithToken(AstKindTarget, target)
  250. if target.IsNone() {
  251. paren := parser.ParseParenthesis()
  252. if paren.IsNone() {
  253. return parser.NewAstError("expected word, symbol or parenthesis")
  254. }
  255. ast.AppendChild(paren)
  256. }
  257. return ast
  258. }
  259. func (parser *Parser) ParseSet() *Ast {
  260. parser.LogDebug("ParseSet: %s\n", parser.current.String())
  261. set := parser.Accept(TokenKindSet)
  262. if set.IsNone() {
  263. return NewAstNone()
  264. }
  265. ast := NewAstWithToken(AstKindSet, set)
  266. target := parser.ParseTarget()
  267. ast.AppendChild(target)
  268. argument := parser.ParseArgument()
  269. if argument.IsNone() {
  270. return parser.NewAstError("Expected argument to set")
  271. }
  272. ast.AppendChild(argument)
  273. return ast
  274. }
  275. func (parser *Parser) ParseGet() *Ast {
  276. parser.LogDebug("ParseGet: %s\n", parser.current.String())
  277. get := parser.Accept(TokenKindGet)
  278. if get.IsNone() {
  279. return NewAstNone()
  280. }
  281. ast := NewAstWithToken(AstKindGet, get)
  282. target := parser.ParseTarget()
  283. ast.AppendChild(target)
  284. return ast
  285. }
  286. func (parser *Parser) ParseCommand() *Ast {
  287. parser.LogDebug("ParseCommand: %s\n", parser.current.String())
  288. word := parser.Accept(TokenKindWord, TokenKindType)
  289. if word.IsNone() {
  290. return NewAstNone()
  291. }
  292. arguments := parser.ParseArguments()
  293. command := NewAstWithToken(AstKindCommand, word)
  294. command.AppendChild(arguments)
  295. return command
  296. }
  297. func (parser *Parser) ParseClosed() *Ast {
  298. parser.LogDebug("ParseClosed: %s\n", parser.current.String())
  299. exp := parser.ParseAny(AstKindClosed, (*Parser).ParseParenthesis,
  300. (*Parser).ParseBlock, (*Parser).ParseList)
  301. return exp
  302. }
  303. func (parser *Parser) ParseExpression() *Ast {
  304. parser.LogDebug("ParseExpression: %s\n", parser.current.String())
  305. exp := parser.ParseRequireAny(AstKindExpression, (*Parser).ParseCommand,
  306. (*Parser).ParseSet,
  307. (*Parser).ParseGet, (*Parser).ParseValue )
  308. return exp
  309. }
  310. func (parser *Parser) ParseExpressionStatement() *Ast {
  311. parser.LogDebug("ParseExpressionStatement: %s\n", parser.current.String())
  312. expr := parser.ParseExpression()
  313. if expr.IsNone() {
  314. return NewAstNone()
  315. }
  316. if eox := parser.Accept(TokenKindEOX); eox.IsNone() {
  317. return parser.NewAstError("expected end of statement")
  318. }
  319. return NewAstNone()
  320. }
  321. func (parser *Parser) ParseEmptyStatement() *Ast {
  322. parser.LogDebug("ParseEmptyStatement: %s\n", parser.current.String())
  323. if eox := parser.Accept(TokenKindEOX); eox.IsNone() {
  324. return parser.NewAstError("expected end of statement")
  325. }
  326. return NewAstWithToken(AstKindStatement, parser.current)
  327. }
  328. func (parser Parser) NextIs(kinds ...TokenKind) bool {
  329. for _, kind := range kinds {
  330. if kind == parser.current.TokenKind {
  331. return true
  332. }
  333. }
  334. return false
  335. }
  336. func (parser Parser) NextIsClosed() bool {
  337. return parser.NextIs(TokenKindOpenBlock, TokenKindOpenList, TokenKindOpenParen)
  338. }
  339. func (parser Parser) NextIsWord() bool {
  340. return parser.NextIs(TokenKindWord)
  341. }
  342. func (parser Parser) NextIsGetter() bool {
  343. return parser.NextIs(TokenKindGet)
  344. }
  345. func (parser Parser) NextIsSetter() bool {
  346. return parser.NextIs(TokenKindSet)
  347. }
  348. func (parser Parser) NextIsValue() bool {
  349. return parser.NextIs(TokenKindString, TokenKindType,
  350. TokenKindInteger, TokenKindFloat, TokenKindBoolean,
  351. TokenKindSymbol)
  352. }
  353. func (parser Parser) NextIsEOX() bool {
  354. return parser.NextIs(TokenKindEOX)
  355. }
  356. func (parser Parser) NextIsEOF() bool {
  357. return parser.NextIs(TokenKindEOF)
  358. }
  359. func (parser Parser) NextIsExpression() bool {
  360. return parser.NextIs(TokenKindWord,
  361. TokenKindGet,
  362. TokenKindSet,
  363. TokenKindString,
  364. TokenKindType,
  365. TokenKindInteger,
  366. TokenKindFloat,
  367. TokenKindBoolean,
  368. TokenKindSymbol)
  369. }
  370. func (parser *Parser) ParseStatement() *Ast {
  371. parser.LogDebug("ParseStatement: %s\n", parser.current.String())
  372. switch {
  373. case parser.NextIsClosed(): return parser.ParseClosed()
  374. case parser.NextIsExpression(): return parser.ParseExpressionStatement()
  375. case parser.NextIsEOX(): return parser.ParseEmptyStatement()
  376. case parser.NextIsEOF(): return NewAstNone()
  377. default:
  378. parser.Panicf("Unexpected token in statement")
  379. return parser.NewAstError("Unexpected token in statement")
  380. }
  381. }
  382. func (parser *Parser) ParseStatements() *Ast {
  383. parser.LogDebug("ParseStatements: %s\n", parser.current.String())
  384. return parser.ParseMany(AstKindStatements, nil, (*Parser).ParseStatement)
  385. }
  386. func (parser *Parser) ParseProgram() *Ast {
  387. parser.LogDebug("ParseProgram: %s\n", parser.current.String())
  388. stats := parser.ParseStatements()
  389. // Be lenient with missing EOF for now...
  390. eof := parser.Accept(TokenKindEOF)
  391. aeof := NewAstWithToken(AstKindEnd, eof)
  392. if eof.IsNone() {
  393. aeof = parser.NewAstError("Expceted EOF, have: %s", parser.current.String())
  394. }
  395. children := []*Ast{stats, aeof}
  396. return NewAst(AstKindProgram, nil, children, NoToken())
  397. }
  398. func (parser *Parser) Parse() *Ast {
  399. ast := parser.ParseProgram()
  400. return ast
  401. }
  402. func NewParser(lexer *Lexer) *Parser {
  403. parser := &Parser{Lexer: lexer, current: NoToken(), LoggerWrapper: LoggerWrapper{nil}}
  404. return parser
  405. }
  406. func NewParserFromString(input string) *Parser {
  407. lexer := NewLexerFromString(input)
  408. return NewParser(lexer)
  409. }
  410. func NewParserFromFilename(filename string) (*Parser, error) {
  411. lexer, err := NewLexerFromFilename(filename)
  412. if err != nil {
  413. return nil, err
  414. }
  415. return NewParser(lexer), nil
  416. }