parser.go 19 KB

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