parser.go 17 KB

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