parser.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640
  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 TARGET .
  32. TARGET -> word PARAMETER | GETTER PARAMETER .
  33. GETTER -> get ORIGIN .
  34. ORIGIN -> word | SETTER | GETTER .
  35. Or with simple operators variant.
  36. PROGRAM -> STATEMENTS.
  37. CLOSED -> BLOCK | LIST | PARENTHESIS .
  38. STATEMENTS -> STATEMENT STATEMENTS | .
  39. STATEMENT -> CLOSED | EXPRESSION eos | eos .
  40. COMMAND -> WORDVALUE DETAILS .
  41. DETAILS -> OPERATION | PARAMETERS .
  42. OPERATION -> operator COMMAND .
  43. PARAMETERS -> PARAMETER PARAMETERS | .
  44. PARAMETER -> WORDVALUE | GETTER | SETTER | CLOSED .
  45. EXPRESSION -> COMMAND | GETTER | SETTER.
  46. PARENTHESIS -> openparen EXPRESSION closeparen .
  47. BLOCK -> openblock STATEMENTS closeblock .
  48. LIST -> openlist PARAMETERS closelist .
  49. VALUE -> string | int | float | symbol | type .
  50. WORDVALUE -> word | VALUE.
  51. SETTER -> set TARGET .
  52. TARGET -> word PARAMETER | GETTER PARAMETER .
  53. GETTER -> get ORIGIN .
  54. GETCALL -> comma COMMAND | .
  55. ORIGIN -> word | SETTER | GETTER .
  56. *
  57. * program -> statements
  58. * statements -> statement+
  59. * statement -> get / set / command
  60. *
  61. */
  62. type Parser struct {
  63. Lexer *Lexer
  64. current Token
  65. LoggerWrapper
  66. Errors []ParserError
  67. }
  68. // panic with this type on errors that would prevent the parser
  69. // from making progress.
  70. type ParserError struct {
  71. *Parser
  72. *Token
  73. Chain error
  74. }
  75. func (pe ParserError) Error() string {
  76. return fmt.Sprintf("%s %s", pe.Token.String(), pe.Chain.Error())
  77. }
  78. func (parser *Parser) SetLogger(logger Logger) {
  79. parser.LoggerWrapper = LoggerWrapper{logger}
  80. }
  81. func (parser *Parser) Errorf(message string, args ...interface{}) ParserError {
  82. err := fmt.Errorf(message, args...)
  83. pe := ParserError { Parser: parser, Token:&parser.current, Chain: err }
  84. parser.Errors = append(parser.Errors, pe)
  85. return pe
  86. }
  87. func (parser *Parser) Panicf(message string, args ...interface{}) {
  88. pe := parser.Errorf(message, args...)
  89. panic(pe)
  90. }
  91. func (parser *Parser) Advance() {
  92. token := parser.Lexer.Lex()
  93. parser.current = token
  94. parser.LogDebug("Next token: %s\n", token.String())
  95. }
  96. /* Skips tokens until a closer, namely ), }, ], EOX or EOF is found,
  97. * to skip parse errors, and to be able to continue parsing despite errors. */
  98. func (parser *Parser) SkipError() Token {
  99. parser.Advance()
  100. for {
  101. parser.Advance()
  102. if parser.NextIsErrorSkipped() {
  103. return parser.current
  104. }
  105. if parser.NextIs(TokenKindError, TokenKindNone) {
  106. parser.Panicf("Cannot recover from parse error. Parse ended.")
  107. }
  108. }
  109. return parser.current
  110. }
  111. /* Looks at the current token and advances the lexer if the token is of any of
  112. the token kinds given in kinds. In this case it will return the accepted
  113. token and advance the parser. Otherwise, it will call parser.Panicf with a
  114. * "Syntax error unexpected <token>".*/
  115. func (parser *Parser) Require(kinds ...TokenKind) Token {
  116. if parser.current.IsNone() {
  117. parser.Advance()
  118. }
  119. expected := ""
  120. sep := ""
  121. for _, kind := range kinds {
  122. if kind == parser.current.TokenKind {
  123. accepted := parser.current
  124. parser.Advance()
  125. parser.LogDebug("Require: Accepted token: %s\n", accepted.String())
  126. return accepted
  127. }
  128. expected = fmt.Sprintf("%s%s%s", expected, sep, kind.String())
  129. }
  130. parser.Panicf("error: expected one of the following: %s", expected)
  131. return Token{}
  132. }
  133. func (parser *Parser) NewAstError(message string, args ...interface{}) *Ast {
  134. sv := StringValue(fmt.Sprintf(message+" at token "+parser.current.String(), args))
  135. pos := parser.current.Position
  136. tok := NewToken(TokenKindError, sv, pos)
  137. parser.Errorf(message, args...)
  138. return NewAst(AstKindError, nil, EmptyAstArray(), tok)
  139. }
  140. // Also handles none or error vales of the token
  141. func (parser *Parser) NewAst(kind AstKind, parent * Ast, children []*Ast, value Token) *Ast{
  142. if value.IsNone() {
  143. return NewAstNone()
  144. }
  145. if value.IsError() {
  146. return NewAst(AstKindError, parent, children, value)
  147. }
  148. return NewAst(kind, parent, children, value)
  149. }
  150. func (parser *Parser) ParseValue() *Ast {
  151. parser.LogDebug("ParseValue: %s\n", parser.current.String())
  152. value := parser.Require(TokenKindInteger, TokenKindString,
  153. TokenKindBoolean, TokenKindNil, TokenKindFloat, TokenKindSymbol)
  154. return parser.NewAst(AstKindValue, nil, EmptyAstArray(), value)
  155. }
  156. func AstKindForToken(token Token) AstKind {
  157. switch token.TokenKind {
  158. case TokenKindInteger, TokenKindString, TokenKindBoolean,
  159. TokenKindNil, TokenKindFloat, TokenKindSymbol:
  160. return AstKindValue
  161. case TokenKindWord:
  162. return AstKindWord
  163. case TokenKindOperator:
  164. return AstKindWord
  165. case TokenKindType:
  166. return AstKindType
  167. default:
  168. return AstKindError
  169. }
  170. }
  171. func (parser *Parser) ParseWordValue() *Ast {
  172. parser.LogDebug("ParseWordValue: %s\n", parser.current.String())
  173. value := parser.Require(TokenKindInteger, TokenKindString,
  174. TokenKindBoolean, TokenKindNil, TokenKindFloat, TokenKindSymbol,
  175. TokenKindType, TokenKindWord)
  176. astKind := AstKindForToken(value)
  177. return parser.NewAst(astKind, nil, EmptyAstArray(), value)
  178. }
  179. func (parser *Parser) ParseArgument() *Ast {
  180. parser.LogDebug("ParseArgument: %s\n", parser.current.String())
  181. switch {
  182. case parser.NextIsGet(): return parser.ParseGet()
  183. case parser.NextIsSet(): return parser.ParseSet()
  184. case parser.NextIsClosed(): return parser.ParseClosed()
  185. case parser.NextIsWordValue(): return parser.ParseWordValue()
  186. default: parser.Panicf("error: in argument: expected $, =, }, word or value")
  187. return nil
  188. }
  189. }
  190. func (parser *Parser) ParseArguments(extra ... *Ast) *Ast {
  191. parser.LogDebug("ParseArguments: %s\n", parser.current.String())
  192. ast := NewAstWithToken(AstKindArguments, parser.current)
  193. var children []*Ast
  194. for _, arg := range extra {
  195. children = append(children, arg)
  196. }
  197. for parser.NextIsArgument() {
  198. child := parser.ParseArgument()
  199. children = append(children, child)
  200. }
  201. ast.AppendChildren(children...)
  202. return ast
  203. }
  204. func (parser *Parser) ParseList() *Ast {
  205. parser.LogDebug("ParseList: %s\n", parser.current.String())
  206. op := parser.Require(TokenKindOpenList)
  207. if op.IsError() {
  208. return parser.NewAstError("Unexpected value.")
  209. }
  210. ast := NewAstWithToken(AstKindList, op)
  211. args := parser.ParseArguments()
  212. if AstIsError(args) {
  213. return args
  214. }
  215. if cp := parser.Require(TokenKindCloseList); cp.IsError() {
  216. return parser.NewAstError("expected closing brackets")
  217. }
  218. ast.AppendChild(args)
  219. return ast
  220. }
  221. func (parser *Parser) ParseParenthesis() *Ast {
  222. parser.LogDebug("ParseParenthesis: %s\n", parser.current.String())
  223. op := parser.Require(TokenKindOpenParen)
  224. if op.IsError() {
  225. return parser.NewAstError("Unexpected value.")
  226. }
  227. ast := NewAstWithToken(AstKindParenthesis, op)
  228. expr := parser.ParseExpression()
  229. if expr.IsNone() {
  230. return parser.NewAstError("expected expression")
  231. }
  232. if AstIsError(expr) {
  233. return expr
  234. }
  235. if cp := parser.Require(TokenKindCloseParen); cp.IsError() {
  236. return parser.NewAstError("expected closing parenthesis")
  237. }
  238. ast.AppendChild(expr)
  239. return ast
  240. }
  241. func (parser *Parser) ParseBlock() *Ast {
  242. parser.LogDebug("ParseBlock: %s\n", parser.current.String())
  243. op := parser.Require(TokenKindOpenBlock)
  244. if op.IsError() {
  245. return parser.NewAstError("Unexpected value.")
  246. }
  247. ast := NewAstWithToken(AstKindBlock, op)
  248. stats := parser.ParseStatements()
  249. if stats.IsNone() {
  250. return parser.NewAstError("expected expression")
  251. }
  252. if AstIsError(stats) {
  253. return stats
  254. }
  255. if cp := parser.Require(TokenKindCloseBlock); cp.IsError() {
  256. return parser.NewAstError("expected closing block")
  257. }
  258. ast.AppendChild(stats)
  259. return ast
  260. }
  261. /* Parses the target of a set expression */
  262. func (parser *Parser) ParseTarget() *Ast {
  263. parser.LogDebug("ParseTarget: %s\n", parser.current.String())
  264. var target *Ast
  265. switch {
  266. case parser.NextIs(TokenKindWord, TokenKindType, TokenKindSymbol):
  267. // Direct target to a set
  268. token := parser.Require(TokenKindWord, TokenKindType, TokenKindSymbol)
  269. target = NewAstWithToken(AstKindTarget, token)
  270. case parser.NextIsGet():
  271. // Indirect target
  272. target = NewAstWithToken(AstKindTarget, parser.current)
  273. target.AppendChild(parser.ParseGet())
  274. case parser.NextIsClosed():
  275. // Indirect target
  276. target = NewAstWithToken(AstKindTarget, parser.current)
  277. target.AppendChild(parser.ParseClosed())
  278. default:
  279. parser.Panicf("Malformed setter.")
  280. return nil
  281. }
  282. argument := parser.ParseArgument()
  283. if argument.IsNone() {
  284. return parser.NewAstError("Expected argument to set")
  285. }
  286. target.AppendChild(argument)
  287. return target
  288. }
  289. /* Parses the origin of a get expression */
  290. func (parser *Parser) ParseOrigin() *Ast {
  291. parser.LogDebug("ParseOrigin: %s\n", parser.current.String())
  292. var target *Ast
  293. switch {
  294. case parser.NextIs(TokenKindWord, TokenKindType, TokenKindSymbol):
  295. // Direct target to a set
  296. token := parser.Require(TokenKindWord, TokenKindType, TokenKindSymbol)
  297. target = NewAstWithToken(AstKindTarget, token)
  298. case parser.NextIsGet():
  299. // Indirect target
  300. target = NewAstWithToken(AstKindTarget, parser.current)
  301. target.AppendChild(parser.ParseGet())
  302. case parser.NextIsClosed():
  303. // Indirect target
  304. target = NewAstWithToken(AstKindTarget, parser.current)
  305. target.AppendChild(parser.ParseClosed())
  306. default:
  307. parser.Panicf("Malformed getter")
  308. return nil
  309. }
  310. return target
  311. }
  312. func (parser *Parser) ParseSet() *Ast {
  313. parser.LogDebug("ParseSet: %s\n", parser.current.String())
  314. set := parser.Require(TokenKindSet)
  315. ast := NewAstWithToken(AstKindSet, set)
  316. target := parser.ParseTarget()
  317. ast.AppendChild(target)
  318. return ast
  319. }
  320. func (parser *Parser) ParseGet() *Ast {
  321. parser.LogDebug("ParseGet: %s\n", parser.current.String())
  322. get := parser.Require(TokenKindGet)
  323. ast := NewAstWithToken(AstKindGet, get)
  324. target := parser.ParseOrigin()
  325. ast.AppendChild(target)
  326. return ast
  327. }
  328. func (parser *Parser) ParseOperator(operand *Ast) *Ast {
  329. parser.LogDebug("ParseOperator: %s\n", parser.current.String())
  330. operator := parser.Require(TokenKindOperator)
  331. arguments := parser.ParseArguments(operand)
  332. command := NewAstWithToken(AstKindCommand, operator)
  333. command.AppendChild(arguments)
  334. return command
  335. }
  336. func (parser *Parser) ParseCommand() *Ast {
  337. parser.LogDebug("ParseCommand: %s\n", parser.current.String())
  338. wordvalue := parser.ParseWordValue()
  339. // operator command
  340. if parser.NextIs(TokenKindOperator) {
  341. return parser.ParseOperator(wordvalue)
  342. }
  343. arguments := parser.ParseArguments()
  344. command := NewAstWithToken(AstKindCommand, wordvalue.Token())
  345. command.AppendChild(arguments)
  346. return command
  347. }
  348. func (parser *Parser) ParseClosed() *Ast {
  349. parser.LogDebug("ParseClosed: %s\n", parser.current.String())
  350. switch {
  351. case parser.NextIs(TokenKindOpenBlock): return parser.ParseBlock()
  352. case parser.NextIs(TokenKindOpenParen): return parser.ParseParenthesis()
  353. case parser.NextIs(TokenKindOpenList): return parser.ParseList()
  354. default:
  355. parser.Panicf("Syntax error in closed, expected {, (, [")
  356. return nil
  357. }
  358. }
  359. func (parser *Parser) ParseExpression() *Ast {
  360. parser.LogDebug("ParseExpression: %s\n", parser.current.String())
  361. switch {
  362. case parser.NextIsWord(): return parser.ParseCommand()
  363. case parser.NextIsSet(): return parser.ParseSet()
  364. case parser.NextIsGet(): return parser.ParseGet()
  365. case parser.NextIsValue(): return parser.ParseCommand()
  366. default:
  367. parser.Panicf("Syntax error in expression, expected word, $, =, value")
  368. return nil
  369. }
  370. }
  371. func (parser *Parser) ParseExpressionStatement() *Ast {
  372. parser.LogDebug("ParseExpressionStatement: %s\n", parser.current.String())
  373. expr := parser.ParseExpression()
  374. if expr.IsNone() {
  375. return NewAstNone()
  376. }
  377. // Expression statements must end on EOX or EOF
  378. if eox := parser.Require(TokenKindEOX, TokenKindEOF); eox.IsError() {
  379. return parser.NewAstError("expected end of statement")
  380. }
  381. return expr
  382. }
  383. func (parser *Parser) ParseEmptyStatement() *Ast {
  384. parser.LogDebug("ParseEmptyStatement: %s\n", parser.current.String())
  385. if eox := parser.Require(TokenKindEOX, TokenKindEOF); eox.IsError() {
  386. return parser.NewAstError("expected end of statement")
  387. }
  388. return NewAstWithToken(AstKindStatement, parser.current)
  389. }
  390. func (parser Parser) NextIs(kinds ...TokenKind) bool {
  391. if (parser.current.TokenKind == TokenKindNone) {
  392. parser.Advance()
  393. }
  394. for _, kind := range kinds {
  395. if kind == parser.current.TokenKind {
  396. return true
  397. }
  398. }
  399. return false
  400. }
  401. func (parser Parser) NextIsClosed() bool {
  402. return parser.NextIs(TokenKindOpenBlock, TokenKindOpenList, TokenKindOpenParen)
  403. }
  404. func (parser Parser) NextIsWord() bool {
  405. return parser.NextIs(TokenKindWord)
  406. }
  407. func (parser Parser) NextIsGet() bool {
  408. return parser.NextIs(TokenKindGet)
  409. }
  410. func (parser Parser) NextIsSet() bool {
  411. return parser.NextIs(TokenKindSet)
  412. }
  413. func (parser Parser) NextIsValue() bool {
  414. return parser.NextIs(TokenKindString, TokenKindType,
  415. TokenKindInteger, TokenKindFloat, TokenKindBoolean, TokenKindNil,
  416. TokenKindSymbol)
  417. }
  418. func (parser Parser) NextIsOperator() bool {
  419. return parser.NextIs(TokenKindOperator)
  420. }
  421. func (parser Parser) NextIsWordValue() bool {
  422. return parser.NextIs(TokenKindWord, TokenKindString, TokenKindType,
  423. TokenKindInteger, TokenKindFloat, TokenKindBoolean, TokenKindNil,
  424. TokenKindSymbol)
  425. }
  426. func (parser Parser) NextIsArgument() bool {
  427. return parser.NextIs(TokenKindOpenBlock, TokenKindOpenList, TokenKindOpenParen,
  428. TokenKindSet, TokenKindGet, TokenKindWord, TokenKindString, TokenKindType,
  429. TokenKindInteger, TokenKindFloat, TokenKindBoolean, TokenKindNil,
  430. TokenKindSymbol)
  431. }
  432. func (parser Parser) NextIsErrorSkipped() bool {
  433. return parser.NextIs(TokenKindCloseBlock, TokenKindCloseList, TokenKindCloseParen,
  434. TokenKindEOX, TokenKindEOF)
  435. }
  436. func (parser Parser) NextIsEOX() bool {
  437. return parser.NextIs(TokenKindEOX)
  438. }
  439. func (parser Parser) NextIsEOF() bool {
  440. return parser.NextIs(TokenKindEOF)
  441. }
  442. func (parser Parser) NextIsExpression() bool {
  443. return parser.NextIs(TokenKindWord,
  444. TokenKindGet,
  445. TokenKindSet,
  446. TokenKindString,
  447. TokenKindType,
  448. TokenKindInteger,
  449. TokenKindFloat,
  450. TokenKindBoolean, TokenKindNil,
  451. TokenKindSymbol)
  452. }
  453. func (parser Parser) NextIsStatement() bool {
  454. return parser.NextIsExpression() || parser.NextIsClosed() || parser.NextIsEOX()
  455. }
  456. func (parser *Parser) ParseStatement() *Ast {
  457. parser.LogDebug("ParseStatement: %s\n", parser.current.String())
  458. switch {
  459. case parser.NextIsClosed(): return parser.ParseClosed()
  460. case parser.NextIsExpression(): return parser.ParseExpressionStatement()
  461. case parser.NextIsEOX(): return parser.ParseEmptyStatement()
  462. default:
  463. parser.Panicf("Expected closed, expression, or EOX in statement")
  464. return parser.NewAstError("Expected closed, expression, or EOX in statement")
  465. }
  466. }
  467. func (parser *Parser) ParseStatements() *Ast {
  468. parser.LogDebug("ParseStatements: %s\n", parser.current.String())
  469. ast := NewAstWithToken(AstKindStatements, parser.current)
  470. var children []*Ast
  471. for parser.NextIsStatement() {
  472. child := parser.ParseStatement()
  473. children = append(children, child)
  474. }
  475. ast.AppendChildren(children...)
  476. return ast
  477. }
  478. func (parser *Parser) ParseProgram() *Ast {
  479. parser.LogDebug("ParseProgram: %s\n", parser.current.String())
  480. stats := parser.ParseStatements()
  481. eof := parser.Require(TokenKindEOF)
  482. aeof := NewAstWithToken(AstKindEnd, eof)
  483. if eof.IsNone() {
  484. aeof = parser.NewAstError("Expected EOF, have: %s", parser.current.String())
  485. }
  486. children := []*Ast{stats, aeof}
  487. return NewAst(AstKindProgram, nil, children, NoToken())
  488. }
  489. func (parser *Parser) Parse() (ast *Ast) {
  490. defer func() {
  491. if err := recover() ; err != nil {
  492. if perr, ok := err.(ParserError) ; ok{
  493. ast = parser.NewAstError("Parse error, recovered: %s\n", perr)
  494. } else {
  495. panic(err)
  496. }
  497. }
  498. } ()
  499. parser.Advance()
  500. ast = parser.ParseProgram()
  501. return ast
  502. }
  503. func NewParser(lexer *Lexer) *Parser {
  504. parser := &Parser{Lexer: lexer, current: NoToken(), LoggerWrapper: LoggerWrapper{nil}}
  505. return parser
  506. }
  507. func NewParserFromString(input string) *Parser {
  508. lexer := NewLexerFromString(input)
  509. return NewParser(lexer)
  510. }
  511. func NewParserFromFilename(filename string) (*Parser, error) {
  512. lexer, err := NewLexerFromFilename(filename)
  513. if err != nil {
  514. return nil, err
  515. }
  516. return NewParser(lexer), nil
  517. }
  518. func (parser * Parser) NewKeyword(name string, tk TokenKind, val Value) *Keyword {
  519. return parser.Lexer.NewKeyword(name, tk, val)
  520. }
  521. func (parser * Parser) AddKeyword(kw * Keyword) *Keyword {
  522. return parser.Lexer.AddKeyword(kw)
  523. }
  524. func (parser * Parser) AddKeywords(keywords []*Keyword) {
  525. for _, kw := range keywords {
  526. parser.AddKeyword(kw)
  527. }
  528. }
  529. func (parser * Parser) AddDefaultKeywords() {
  530. parser.AddKeywords(DefaultKeywords)
  531. }