parser.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  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. In Muesli, the program is first tokenized by a lexer. The lexer uses the first
  19. character, and only the first character of every token to determine it's type.
  20. Then, the tokens are parsed with a recursive descent parser with a structured
  21. syntax, which has been verified to be LL(1) on smlweb.cpsc.ucalgary.ca. This
  22. means the parser only needs one token of lookahead to be able to parse the
  23. syntax. The syntax can be described as follows:
  24. PROGRAM -> STATEMENTS .
  25. STATEMENTS -> STATEMENT STATEMENTS | .
  26. STATEMENT -> BLOCK | CHAIN eos | eos .
  27. CHAIN -> EXPRESSION OPERATIONS .
  28. OPERATIONS -> LINK | .
  29. LINK -> OPERATION | REDIRECT | METHOD .
  30. METHOD -> method EXPRESSION .
  31. REDIRECT -> redirect EXPRESSION .
  32. OPERATION -> operator EXPRESSION .
  33. EXPRESSION -> COMMAND | SUBSTITUTION | LITERAL .
  34. COMMAND -> NAME PARAMETERS.
  35. PARAMETERS -> PARAMETER PARAMETERS | .
  36. PARAMETER -> LITERAL | BLOCK | SUBSTITUTION | NAME .
  37. SUBSTITUTION -> GETTER | SETTER | LIST | PARENTHESIS .
  38. PARENTHESIS -> closeparen CHAIN openparen .
  39. BLOCK -> openblock STATEMENTS closeblock .
  40. LIST -> openlist PARAMETERS closelist .
  41. LITERAL -> string | int | float .
  42. NAME -> word | symbol | type .
  43. SETTER -> set PARAMETER PARAMETER .
  44. GETTER -> get PARAMETER .
  45. The semantics of a muesli program are based on this syntax and can be explained
  46. as follows:
  47. - A muesli program consists of statements, which are executed from top to
  48. bottom.
  49. - A statement is either a block, or a command chain terminated by end of
  50. statement, eos, or an empty statement terminated by eos. The period . and
  51. the unescaped newline characters are eos.
  52. - A block consist of statements between braces { }. The statements of a block
  53. are not executed but compiled to a block which can be called to execute them
  54. later.
  55. - A command chain consists of an expression optionally followed by links.
  56. A command chain is executed by executing it's expression and applying the,
  57. operator, redirect and method links from left to right.
  58. - A link is either operator, redirect or method.
  59. - An operator begins with a token with one of the following characters: -+/*^%~
  60. Next is an expression. The effect of an operator is to evaluate the
  61. links before it and after it as a substitution, and then look up the callable
  62. with the name of the operator and execute that.
  63. - A redirect starts with a token of the following characters: |&><@
  64. Next is an expression. The effect of a redirect is to evaluate the
  65. links before it and after it as a block, and then look up the callable
  66. with the name of the operator and execute that.
  67. - A method start with a token with one of the following characters: ,;
  68. Next is an expression. The effect of a method is to evaluate the
  69. links before it and after it as a list of ast expressions, shuffle them
  70. so the operator comes first, but the rest is kept in order, and then look up
  71. the callable with the name of the operator and execute that.
  72. - A command may be a direct command, an indirect command, or a literal value.
  73. - A direct command
  74. - A () parenthesis gets substituted inline by the value returned by executing it
  75. anywhere it occurs, also in the beginning of a command.
  76. - A bracketed list [ elem1 elem2 ... ] is syntactic sugar for (list elem1 elem 2)
  77. - A dollar getter $varname is syntactic sugar for (get varname)
  78. - A equals setter =varname value is syntactic sugar for (set varname value)
  79. - Therefore, parenthesis, lists, getters and setters are allowed anywhere,
  80. also in the beginning of the command with substitution semantics.
  81. - If a command starts with a substitution, it is an indirect command. The
  82. substitution is evaluated and it's value is looked up as the command name.
  83. In case the result is not a name, this is a run time error.
  84. In case the result is a list, each value of the list is executed as a command
  85. with the same parameters.
  86. - A literal evaluate to itself.
  87. - A name also evaluates as itself but is specific for direct commands.
  88. Keeping operations, simplified, adding fields with selectors.
  89. PROGRAM -> STATEMENTS .
  90. STATEMENTS -> STATEMENT STATEMENTS | .
  91. STATEMENT -> BLOCK | CHAIN eos | eos .
  92. CHAIN -> EXPRESSION OPERATIONS .
  93. OPERATIONS -> LINK | .
  94. LINK -> operator EXPRESSION .
  95. EXPRESSION -> COMMAND | SUBSTITUTION | LITERAL .
  96. COMMAND -> FIELD PARAMETERS.
  97. FIELD -> NAME SELECTORS .
  98. SELECTORS -> SELECTOR | .
  99. SELECTOR -> selector FIELD .
  100. PARAMETERS -> PARAMETER PARAMETERS | .
  101. PARAMETER -> LITERAL | BLOCK | SUBSTITUTION | FIELD .
  102. SUBSTITUTION -> GETTER | SETTER | LIST | PARENTHESIS .
  103. PARENTHESIS -> closeparen CHAIN openparen .
  104. BLOCK -> openblock STATEMENTS closeblock .
  105. LIST -> openlist PARAMETERS closelist .
  106. LITERAL -> string | int | float .
  107. NAME -> word | symbol | type .
  108. SETTER -> set PARAMETER PARAMETER .
  109. GETTER -> get PARAMETER .
  110. *
  111. * program -> statements
  112. * statements -> statement+
  113. * statement -> get / set / command
  114. *
  115. */
  116. type Parser struct {
  117. Lexer *Lexer
  118. current Token
  119. LoggerWrapper
  120. Errors []ParserError
  121. }
  122. // panic with this type on errors that would prevent the parser
  123. // from making progress.
  124. type ParserError struct {
  125. *Parser
  126. *Token
  127. Chain error
  128. }
  129. func (pe ParserError) Error() string {
  130. return fmt.Sprintf("%s %s", pe.Token.String(), pe.Chain.Error())
  131. }
  132. func (parser *Parser) SetLogger(logger Logger) {
  133. parser.LoggerWrapper = LoggerWrapper{logger}
  134. }
  135. func (parser *Parser) SetDefaultLogger() {
  136. lg := &testLogger{}
  137. parser.LoggerWrapper = LoggerWrapper{lg}
  138. }
  139. func (parser *Parser) SetVmLogger(vm * VM) {
  140. parser.LoggerWrapper = vm.Console.LoggerWrapper
  141. }
  142. func (parser *Parser) Errorf(message string, args ...interface{}) ParserError {
  143. err := fmt.Errorf(message, args...)
  144. pe := ParserError { Parser: parser, Token:&parser.current, Chain: err }
  145. parser.Errors = append(parser.Errors, pe)
  146. return pe
  147. }
  148. func (parser *Parser) Panicf(message string, args ...interface{}) {
  149. pe := parser.Errorf(message, args...)
  150. panic(pe)
  151. }
  152. func (parser *Parser) Advance() {
  153. token := parser.Lexer.Lex()
  154. parser.current = token
  155. parser.LogDebug("Next token: %s\n", token.String())
  156. }
  157. /* Skips tokens until a closer, namely ), }, ], EOX or EOF is found,
  158. * to skip parse errors, and to be able to continue parsing despite errors. */
  159. func (parser *Parser) SkipError() Token {
  160. parser.Advance()
  161. for {
  162. parser.Advance()
  163. if parser.NextIsErrorSkipped() {
  164. return parser.current
  165. }
  166. if parser.NextIs(TokenKindError, TokenKindNone) {
  167. parser.Panicf("Cannot recover from parse error. Parse ended.")
  168. }
  169. }
  170. return parser.current
  171. }
  172. /* Looks at the current token and advances the lexer if the token is of any of
  173. the token kinds given in kinds. In this case it will return the accepted
  174. token and advance the parser. Otherwise, it will call parser.Panicf with a
  175. * "Syntax error unexpected <token>".*/
  176. func (parser *Parser) Require(kinds ...TokenKind) Token {
  177. if parser.current.IsNone() {
  178. parser.Advance()
  179. }
  180. expected := ""
  181. sep := ""
  182. for _, kind := range kinds {
  183. if kind == parser.current.TokenKind {
  184. accepted := parser.current
  185. parser.Advance()
  186. parser.LogDebug("Require: Accepted token: %s\n", accepted.String())
  187. return accepted
  188. }
  189. expected = fmt.Sprintf("%s%s%s", expected, sep, kind.String())
  190. }
  191. parser.Panicf("error: expected one of the following: %s", expected)
  192. return Token{}
  193. }
  194. func (parser *Parser) NewAstError(message string, args ...interface{}) *Ast {
  195. sv := StringValue(fmt.Sprintf(message+" at token "+parser.current.String(), args))
  196. pos := parser.current.Position
  197. tok := NewToken(TokenKindError, sv, pos)
  198. parser.Errorf(message, args...)
  199. return NewAst(AstKindError, nil, EmptyAstArray(), tok)
  200. }
  201. // Also handles none or error vales of the token
  202. func (parser *Parser) NewAst(kind AstKind, parent * Ast, children []*Ast, value Token) *Ast{
  203. if value.IsNone() {
  204. return NewAstNone()
  205. }
  206. if value.IsError() {
  207. return NewAst(AstKindError, parent, children, value)
  208. }
  209. return NewAst(kind, parent, children, value)
  210. }
  211. func (parser *Parser) ParseValue() *Ast {
  212. parser.LogDebug("ParseValue: %s\n", parser.current.String())
  213. value := parser.Require(TokenKindInteger, TokenKindString,
  214. TokenKindBoolean, TokenKindNil, TokenKindFloat, TokenKindSymbol)
  215. return parser.NewAst(AstKindValue, nil, EmptyAstArray(), value)
  216. }
  217. func AstKindForToken(token Token) AstKind {
  218. switch token.TokenKind {
  219. case TokenKindInteger, TokenKindString, TokenKindBoolean,
  220. TokenKindNil, TokenKindFloat, TokenKindSymbol:
  221. return AstKindValue
  222. case TokenKindWord:
  223. return AstKindWord
  224. case TokenKindType:
  225. return AstKindType
  226. default:
  227. return AstKindError
  228. }
  229. }
  230. func (parser *Parser) ParseLiteral() *Ast {
  231. parser.LogDebug("ParseLiteral: %s\n", parser.current.String())
  232. value := parser.Require(TokenKindInteger, TokenKindString,
  233. TokenKindBoolean, TokenKindNil, TokenKindFloat)
  234. astKind := AstKindForToken(value)
  235. return parser.NewAst(astKind, nil, EmptyAstArray(), value)
  236. }
  237. func (parser *Parser) ParseName() *Ast {
  238. parser.LogDebug("ParseName: %s\n", parser.current.String())
  239. value := parser.Require(TokenKindWord, TokenKindType, TokenKindSymbol)
  240. astKind := AstKindForToken(value)
  241. return parser.NewAst(astKind, nil, EmptyAstArray(), value)
  242. }
  243. func (parser *Parser) ParseArgument() *Ast {
  244. parser.LogDebug("ParseArgument: %s\n", parser.current.String())
  245. switch {
  246. case parser.NextIsName(): return parser.ParseName()
  247. case parser.NextIsBlock(): return parser.ParseBlock()
  248. case parser.NextIsSubstitution(): return parser.ParseSubstitution()
  249. case parser.NextIsLiteral(): return parser.ParseLiteral()
  250. default: parser.Panicf("error: in argument: expected $, =, }, word or value")
  251. return nil
  252. }
  253. }
  254. func (parser *Parser) ParseArguments(extra ... *Ast) *Ast {
  255. parser.LogDebug("ParseArguments: %s\n", parser.current.String())
  256. ast := NewAstWithToken(AstKindArguments, parser.current)
  257. var children []*Ast
  258. for _, arg := range extra {
  259. children = append(children, arg)
  260. }
  261. for parser.NextIsArgument() {
  262. child := parser.ParseArgument()
  263. children = append(children, child)
  264. }
  265. ast.AppendChildren(children...)
  266. return ast
  267. }
  268. func (parser *Parser) ParseList() *Ast {
  269. parser.LogDebug("ParseList: %s\n", parser.current.String())
  270. op := parser.Require(TokenKindOpenList)
  271. if op.IsError() {
  272. return parser.NewAstError("Unexpected value.")
  273. }
  274. ast := NewAstWithToken(AstKindList, op)
  275. args := parser.ParseArguments()
  276. if AstIsError(args) {
  277. return args
  278. }
  279. if cp := parser.Require(TokenKindCloseList); cp.IsError() {
  280. return parser.NewAstError("expected closing brackets")
  281. }
  282. ast.AppendChild(args)
  283. return ast
  284. }
  285. func (parser *Parser) ParseParenthesis() *Ast {
  286. parser.LogDebug("ParseParenthesis: %s\n", parser.current.String())
  287. op := parser.Require(TokenKindOpenParen)
  288. if op.IsError() {
  289. return parser.NewAstError("Unexpected value.")
  290. }
  291. ast := NewAstWithToken(AstKindParenthesis, op)
  292. expr := parser.ParseChain()
  293. if expr.IsNone() {
  294. return parser.NewAstError("expected chain")
  295. }
  296. if AstIsError(expr) {
  297. return expr
  298. }
  299. if cp := parser.Require(TokenKindCloseParen); cp.IsError() {
  300. return parser.NewAstError("expected closing parenthesis")
  301. }
  302. ast.AppendChild(expr)
  303. return ast
  304. }
  305. func (parser *Parser) ParseBlock() *Ast {
  306. parser.LogDebug("ParseBlock: %s\n", parser.current.String())
  307. op := parser.Require(TokenKindOpenBlock)
  308. if op.IsError() {
  309. return parser.NewAstError("Unexpected value.")
  310. }
  311. ast := NewAstWithToken(AstKindBlock, op)
  312. stats := parser.ParseStatements()
  313. if stats.IsNone() {
  314. return parser.NewAstError("expected expression")
  315. }
  316. if AstIsError(stats) {
  317. return stats
  318. }
  319. if cp := parser.Require(TokenKindCloseBlock); cp.IsError() {
  320. return parser.NewAstError("expected closing block")
  321. }
  322. ast.AppendChild(stats)
  323. return ast
  324. }
  325. func (parser *Parser) RequireName() Token {
  326. return parser.Require(TokenKindWord, TokenKindType, TokenKindSymbol)
  327. }
  328. /* Parses the target of a set expression */
  329. func (parser *Parser) ParseTarget() *Ast {
  330. parser.LogDebug("ParseTarget: %s\n", parser.current.String())
  331. var target *Ast
  332. switch {
  333. case parser.NextIsName():
  334. // Direct target to a set
  335. token := parser.RequireName()
  336. target = NewAstWithToken(AstKindTarget, token)
  337. case parser.NextIsSubstitution():
  338. // Indirect target
  339. target = NewAstWithToken(AstKindTarget, parser.current)
  340. target.AppendChild(parser.ParseSubstitution())
  341. default:
  342. parser.Panicf("Malformed setter.")
  343. return nil
  344. }
  345. argument := parser.ParseArgument()
  346. if argument.IsNone() {
  347. return parser.NewAstError("Expected argument to set")
  348. }
  349. target.AppendChild(argument)
  350. return target
  351. }
  352. /* Parses the origin of a get expression */
  353. func (parser *Parser) ParseOrigin() *Ast {
  354. parser.LogDebug("ParseOrigin: %s\n", parser.current.String())
  355. var target *Ast
  356. switch {
  357. case parser.NextIsName():
  358. // Direct target to a set
  359. token := parser.RequireName()
  360. target = NewAstWithToken(AstKindTarget, token)
  361. case parser.NextIsSubstitution():
  362. target = NewAstWithToken(AstKindTarget, parser.current)
  363. target.AppendChild(parser.ParseSubstitution())
  364. default:
  365. parser.Panicf("Malformed getter")
  366. return nil
  367. }
  368. return target
  369. }
  370. func (parser *Parser) ParseSet() *Ast {
  371. parser.LogDebug("ParseSet: %s\n", parser.current.String())
  372. set := parser.Require(TokenKindSet)
  373. ast := NewAstWithToken(AstKindSet, set)
  374. target := parser.ParseTarget()
  375. ast.AppendChild(target)
  376. return ast
  377. }
  378. func (parser *Parser) ParseGet() *Ast {
  379. parser.LogDebug("ParseGet: %s\n", parser.current.String())
  380. get := parser.Require(TokenKindGet)
  381. ast := NewAstWithToken(AstKindGet, get)
  382. target := parser.ParseOrigin()
  383. ast.AppendChild(target)
  384. return ast
  385. }
  386. func (parser *Parser) ParseCommand() *Ast {
  387. parser.LogDebug("ParseCommand: %s\n", parser.current.String())
  388. word := parser.Require(TokenKindWord, TokenKindType)
  389. arguments := parser.ParseArguments()
  390. command := NewAstWithToken(AstKindCommand, word)
  391. command.AppendChild(arguments)
  392. return command
  393. }
  394. func (parser *Parser) ParseSubstitution() *Ast {
  395. parser.LogDebug("ParseSubstitution: %s\n", parser.current.String())
  396. switch {
  397. case parser.NextIs(TokenKindOpenParen): return parser.ParseParenthesis()
  398. case parser.NextIs(TokenKindOpenList): return parser.ParseList()
  399. case parser.NextIs(TokenKindGet): return parser.ParseGet()
  400. case parser.NextIs(TokenKindSet): return parser.ParseSet()
  401. default:
  402. parser.Panicf("Syntax error in substitution, expected $, =, (, [")
  403. return nil
  404. }
  405. }
  406. func (parser *Parser) ParseExpression() *Ast {
  407. parser.LogDebug("ParseExpression: %s\n", parser.current.String())
  408. switch {
  409. case parser.NextIsWord(): return parser.ParseCommand()
  410. case parser.NextIsSubstitution(): return parser.ParseSubstitution()
  411. case parser.NextIsLiteral(): return parser.ParseLiteral()
  412. default:
  413. parser.Panicf("Syntax error in expression, expected word, $, =, value")
  414. return nil
  415. }
  416. }
  417. func (parser *Parser) ParseExpressionStatement() *Ast {
  418. parser.LogDebug("ParseExpressionStatement: %s\n", parser.current.String())
  419. expr := parser.ParseExpression()
  420. if expr.IsNone() {
  421. return NewAstNone()
  422. }
  423. // Expression statements must end on EOX or EOF
  424. if eox := parser.Require(TokenKindEOX, TokenKindEOF); eox.IsError() {
  425. return parser.NewAstError("expected end of statement")
  426. }
  427. return expr
  428. }
  429. func (parser *Parser) ParseEmptyStatement() *Ast {
  430. parser.LogDebug("ParseEmptyStatement: %s\n", parser.current.String())
  431. if eox := parser.Require(TokenKindEOX, TokenKindEOF); eox.IsError() {
  432. return parser.NewAstError("expected end of statement")
  433. }
  434. return NewAstWithToken(AstKindStatement, parser.current)
  435. }
  436. func (parser Parser) NextIs(kinds ...TokenKind) bool {
  437. if (parser.current.TokenKind == TokenKindNone) {
  438. parser.Advance()
  439. }
  440. for _, kind := range kinds {
  441. if kind == parser.current.TokenKind {
  442. return true
  443. }
  444. }
  445. return false
  446. }
  447. func (parser Parser) NextIsBlock() bool {
  448. return parser.NextIs(TokenKindOpenBlock)
  449. }
  450. func (parser Parser) NextIsSubstitution() bool {
  451. return parser.NextIs(TokenKindOpenList, TokenKindOpenParen,
  452. TokenKindSet, TokenKindGet)
  453. }
  454. func (parser Parser) NextIsWord() bool {
  455. return parser.NextIs(TokenKindWord)
  456. }
  457. func (parser Parser) NextIsGet() bool {
  458. return parser.NextIs(TokenKindGet)
  459. }
  460. func (parser Parser) NextIsSet() bool {
  461. return parser.NextIs(TokenKindSet)
  462. }
  463. func (parser Parser) NextIsLiteral() bool {
  464. return parser.NextIs(TokenKindString, TokenKindInteger, TokenKindFloat,
  465. TokenKindBoolean, TokenKindNil)
  466. }
  467. func (parser Parser) NextIsName() bool {
  468. return parser.NextIs(TokenKindWord, TokenKindType, TokenKindSymbol)
  469. }
  470. func (parser Parser) NextIsOperator() bool {
  471. return parser.NextIs(TokenKindOperator, TokenKindRedirect, TokenKindMethod)
  472. }
  473. func (parser Parser) NextIsArgument() bool {
  474. return parser.NextIsName() || parser.NextIsLiteral() ||
  475. parser.NextIsSubstitution() || parser.NextIsBlock()
  476. }
  477. func (parser Parser) NextIsCommand() bool {
  478. return parser.NextIsName()
  479. }
  480. func (parser Parser) NextIsErrorSkipped() bool {
  481. return parser.NextIs(TokenKindCloseBlock, TokenKindCloseList, TokenKindCloseParen,
  482. TokenKindEOX, TokenKindEOF)
  483. }
  484. func (parser Parser) NextIsEOX() bool {
  485. return parser.NextIs(TokenKindEOX)
  486. }
  487. func (parser Parser) NextIsEOF() bool {
  488. return parser.NextIs(TokenKindEOF)
  489. }
  490. func (parser Parser) NextIsExpression() bool {
  491. return parser.NextIsCommand() || parser.NextIsSubstitution() ||
  492. parser.NextIsLiteral()
  493. }
  494. func (parser Parser) NextIsChain() bool {
  495. return parser.NextIsExpression()
  496. }
  497. func (parser Parser) NextIsStatement() bool {
  498. return parser.NextIsChain() || parser.NextIsBlock() || parser.NextIsEOX()
  499. }
  500. func (parser *Parser) newMethodChain(oper Token, expr1, expr2 *Ast) *Ast {
  501. chain := NewAstWithToken(AstKindOperation, oper)
  502. chain.AppendChildren(expr1)
  503. chain.AppendChild(NewAstWithToken(AstKindForToken(expr2.Token()), expr2.Token()))
  504. chain.AppendChildren(expr2.Children()...)
  505. parser.LogDebug("New method chain: %v", chain)
  506. return chain
  507. }
  508. func (parser *Parser) newChain(oper Token, expr1, expr2 *Ast) * Ast {
  509. var astkind AstKind = AstKindParenthesis
  510. if oper.TokenKind == TokenKindRedirect {
  511. parser.LogDebug("New redirect chain.")
  512. astkind = AstKindStatements
  513. } else if oper.TokenKind == TokenKindMethod {
  514. return parser.newMethodChain(oper, expr1, expr2)
  515. }
  516. subst1 := NewAstWithToken(astkind, oper)
  517. subst1.AppendChildren(expr1)
  518. subst2 := NewAstWithToken(astkind, oper)
  519. subst2.AppendChildren(expr2)
  520. chain := NewAstWithToken(AstKindOperation, oper)
  521. chain.AppendChildren(subst1, subst2)
  522. return chain
  523. }
  524. func (parser *Parser) composeChain(oper Token, chain, nextExpr *Ast) * Ast {
  525. var astkind AstKind = AstKindParenthesis
  526. if oper.TokenKind == TokenKindRedirect {
  527. parser.LogDebug("Composed redirect chain: %v", chain)
  528. astkind = AstKindStatements
  529. } else if oper.TokenKind == TokenKindMethod {
  530. chain.AppendChild(NewAstWithToken(AstKindForToken(nextExpr.Token()), nextExpr.Token()))
  531. chain.AppendChildren(nextExpr.Children()...)
  532. parser.LogDebug("Composed method chain: %v", chain)
  533. return chain
  534. } else {
  535. parser.LogDebug("Composed normal chain: %v", chain)
  536. }
  537. subst := NewAstWithToken(astkind, oper)
  538. subst.AppendChildren(nextExpr)
  539. newChain := NewAstWithToken(AstKindOperation, oper)
  540. newChain.AppendChildren(chain, subst)
  541. return newChain
  542. }
  543. func (parser *Parser) ParseChain() *Ast {
  544. expression := parser.ParseExpression()
  545. if !parser.NextIsOperator() {
  546. return expression
  547. }
  548. var expressions = []*Ast{ expression }
  549. var operators = []Token {}
  550. for parser.NextIsOperator() {
  551. oper := parser.Require(TokenKindOperator, TokenKindRedirect, TokenKindMethod)
  552. expression := parser.ParseExpression()
  553. if expression == nil {
  554. parser.Panicf("Expected expression after operator.")
  555. }
  556. expressions = append(expressions, expression)
  557. operators = append(operators, oper)
  558. }
  559. // Now there are N expressions and N - 1 operators, iterate
  560. // for easy composition
  561. var chain *Ast
  562. parser.LogDebug("Working on operator chain: %v %v", operators, expressions)
  563. for i, j := 0, 0 ; i < len(expressions) && j < len(operators) ; i, j = i + 1 , j + 1 {
  564. expression := expressions[i]
  565. oper := operators[j]
  566. if chain == nil {
  567. expression2 := expressions[i+1]
  568. chain = parser.newChain(oper, expression, expression2)
  569. i++
  570. } else {
  571. chain = parser.composeChain(oper, chain, expression)
  572. }
  573. }
  574. return chain
  575. }
  576. func (parser *Parser) ParseStatement() *Ast {
  577. parser.LogDebug("ParseStatement: %s\n", parser.current.String())
  578. switch {
  579. case parser.NextIsBlock(): return parser.ParseBlock()
  580. case parser.NextIsExpression(): return parser.ParseChain()
  581. case parser.NextIsEOX(): return parser.ParseEmptyStatement()
  582. default:
  583. parser.Panicf("Expected block, command, or EOX in statement")
  584. return parser.NewAstError("Expected closed, expression, or EOX in statement")
  585. }
  586. }
  587. func (parser *Parser) ParseStatements() *Ast {
  588. parser.LogDebug("ParseStatements: %s\n", parser.current.String())
  589. ast := NewAstWithToken(AstKindStatements, parser.current)
  590. var children []*Ast
  591. for parser.NextIsStatement() {
  592. child := parser.ParseStatement()
  593. children = append(children, child)
  594. }
  595. ast.AppendChildren(children...)
  596. return ast
  597. }
  598. func (parser *Parser) ParseProgram() *Ast {
  599. parser.LogDebug("ParseProgram: %s\n", parser.current.String())
  600. stats := parser.ParseStatements()
  601. eof := parser.Require(TokenKindEOF)
  602. aeof := NewAstWithToken(AstKindEnd, eof)
  603. if eof.IsNone() {
  604. aeof = parser.NewAstError("Expected EOF, have: %s", parser.current.String())
  605. }
  606. children := []*Ast{stats, aeof}
  607. return NewAst(AstKindProgram, nil, children, NoToken())
  608. }
  609. func (parser *Parser) Parse() (ast *Ast) {
  610. defer func() {
  611. if err := recover() ; err != nil {
  612. if perr, ok := err.(ParserError) ; ok{
  613. ast = parser.NewAstError("Parse error, recovered: %s\n", perr)
  614. } else {
  615. panic(err)
  616. }
  617. }
  618. } ()
  619. parser.Advance()
  620. ast = parser.ParseProgram()
  621. return ast
  622. }
  623. func NewParser(lexer *Lexer) *Parser {
  624. parser := &Parser{Lexer: lexer, current: NoToken(), LoggerWrapper: LoggerWrapper{nil}}
  625. return parser
  626. }
  627. func NewParserFromString(input string) *Parser {
  628. lexer := NewLexerFromString(input)
  629. return NewParser(lexer)
  630. }
  631. func NewParserFromFilename(filename string) (*Parser, error) {
  632. lexer, err := NewLexerFromFilename(filename)
  633. if err != nil {
  634. return nil, err
  635. }
  636. return NewParser(lexer), nil
  637. }
  638. func (parser * Parser) NewKeyword(name string, tk TokenKind, val Value) *Keyword {
  639. return parser.Lexer.NewKeyword(name, tk, val)
  640. }
  641. func (parser * Parser) AddKeyword(kw * Keyword) *Keyword {
  642. return parser.Lexer.AddKeyword(kw)
  643. }
  644. func (parser * Parser) AddKeywords(keywords []*Keyword) {
  645. for _, kw := range keywords {
  646. parser.AddKeyword(kw)
  647. }
  648. }
  649. func (parser * Parser) AddDefaultKeywords() {
  650. parser.AddKeywords(DefaultKeywords)
  651. }