parser.go 17 KB

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