expression.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805
  1. package parser
  2. import (
  3. "github.com/dop251/goja/ast"
  4. "github.com/dop251/goja/file"
  5. "github.com/dop251/goja/token"
  6. "github.com/dop251/goja/unistring"
  7. )
  8. func (self *_parser) parseIdentifier() *ast.Identifier {
  9. literal := self.parsedLiteral
  10. idx := self.idx
  11. self.next()
  12. return &ast.Identifier{
  13. Name: literal,
  14. Idx: idx,
  15. }
  16. }
  17. func (self *_parser) parsePrimaryExpression() ast.Expression {
  18. literal, parsedLiteral := self.literal, self.parsedLiteral
  19. idx := self.idx
  20. switch self.token {
  21. case token.IDENTIFIER:
  22. self.next()
  23. if len(literal) > 1 {
  24. tkn, strict := token.IsKeyword(literal)
  25. if tkn == token.KEYWORD {
  26. if !strict {
  27. self.error(idx, "Unexpected reserved word")
  28. }
  29. }
  30. }
  31. return &ast.Identifier{
  32. Name: parsedLiteral,
  33. Idx: idx,
  34. }
  35. case token.NULL:
  36. self.next()
  37. return &ast.NullLiteral{
  38. Idx: idx,
  39. Literal: literal,
  40. }
  41. case token.BOOLEAN:
  42. self.next()
  43. value := false
  44. switch parsedLiteral {
  45. case "true":
  46. value = true
  47. case "false":
  48. value = false
  49. default:
  50. self.error(idx, "Illegal boolean literal")
  51. }
  52. return &ast.BooleanLiteral{
  53. Idx: idx,
  54. Literal: literal,
  55. Value: value,
  56. }
  57. case token.STRING:
  58. self.next()
  59. return &ast.StringLiteral{
  60. Idx: idx,
  61. Literal: literal,
  62. Value: parsedLiteral,
  63. }
  64. case token.NUMBER:
  65. self.next()
  66. value, err := parseNumberLiteral(literal)
  67. if err != nil {
  68. self.error(idx, err.Error())
  69. value = 0
  70. }
  71. return &ast.NumberLiteral{
  72. Idx: idx,
  73. Literal: literal,
  74. Value: value,
  75. }
  76. case token.SLASH, token.QUOTIENT_ASSIGN:
  77. return self.parseRegExpLiteral()
  78. case token.LEFT_BRACE:
  79. return self.parseObjectLiteral()
  80. case token.LEFT_BRACKET:
  81. return self.parseArrayLiteral()
  82. case token.LEFT_PARENTHESIS:
  83. self.expect(token.LEFT_PARENTHESIS)
  84. expression := self.parseExpression()
  85. self.expect(token.RIGHT_PARENTHESIS)
  86. return expression
  87. case token.THIS:
  88. self.next()
  89. return &ast.ThisExpression{
  90. Idx: idx,
  91. }
  92. case token.FUNCTION:
  93. return self.parseFunction(false)
  94. }
  95. self.errorUnexpectedToken(self.token)
  96. self.nextStatement()
  97. return &ast.BadExpression{From: idx, To: self.idx}
  98. }
  99. func (self *_parser) parseRegExpLiteral() *ast.RegExpLiteral {
  100. offset := self.chrOffset - 1 // Opening slash already gotten
  101. if self.token == token.QUOTIENT_ASSIGN {
  102. offset -= 1 // =
  103. }
  104. idx := self.idxOf(offset)
  105. pattern, _, err := self.scanString(offset, false)
  106. endOffset := self.chrOffset
  107. if err == nil {
  108. pattern = pattern[1 : len(pattern)-1]
  109. }
  110. flags := ""
  111. if !isLineTerminator(self.chr) && !isLineWhiteSpace(self.chr) {
  112. self.next()
  113. if self.token == token.IDENTIFIER { // gim
  114. flags = self.literal
  115. self.next()
  116. endOffset = self.chrOffset - 1
  117. }
  118. } else {
  119. self.next()
  120. }
  121. literal := self.str[offset:endOffset]
  122. return &ast.RegExpLiteral{
  123. Idx: idx,
  124. Literal: literal,
  125. Pattern: pattern,
  126. Flags: flags,
  127. }
  128. }
  129. func (self *_parser) parseVariableDeclaration(declarationList *[]*ast.VariableExpression) ast.Expression {
  130. if self.token != token.IDENTIFIER {
  131. idx := self.expect(token.IDENTIFIER)
  132. self.nextStatement()
  133. return &ast.BadExpression{From: idx, To: self.idx}
  134. }
  135. name := self.parsedLiteral
  136. idx := self.idx
  137. self.next()
  138. node := &ast.VariableExpression{
  139. Name: name,
  140. Idx: idx,
  141. }
  142. if declarationList != nil {
  143. *declarationList = append(*declarationList, node)
  144. }
  145. if self.token == token.ASSIGN {
  146. self.next()
  147. node.Initializer = self.parseAssignmentExpression()
  148. }
  149. return node
  150. }
  151. func (self *_parser) parseVariableDeclarationList(var_ file.Idx) []ast.Expression {
  152. var declarationList []*ast.VariableExpression // Avoid bad expressions
  153. var list []ast.Expression
  154. for {
  155. list = append(list, self.parseVariableDeclaration(&declarationList))
  156. if self.token != token.COMMA {
  157. break
  158. }
  159. self.next()
  160. }
  161. self.scope.declare(&ast.VariableDeclaration{
  162. Var: var_,
  163. List: declarationList,
  164. })
  165. return list
  166. }
  167. func (self *_parser) parseObjectPropertyKey() (string, unistring.String) {
  168. idx, tkn, literal, parsedLiteral := self.idx, self.token, self.literal, self.parsedLiteral
  169. var value unistring.String
  170. self.next()
  171. switch tkn {
  172. case token.IDENTIFIER:
  173. value = parsedLiteral
  174. case token.NUMBER:
  175. var err error
  176. _, err = parseNumberLiteral(literal)
  177. if err != nil {
  178. self.error(idx, err.Error())
  179. } else {
  180. value = unistring.String(literal)
  181. }
  182. case token.STRING:
  183. value = parsedLiteral
  184. default:
  185. // null, false, class, etc.
  186. if isId(tkn) {
  187. value = unistring.String(literal)
  188. }
  189. }
  190. return literal, value
  191. }
  192. func (self *_parser) parseObjectProperty() ast.Property {
  193. literal, value := self.parseObjectPropertyKey()
  194. if literal == "get" && self.token != token.COLON {
  195. idx := self.idx
  196. _, value := self.parseObjectPropertyKey()
  197. parameterList := self.parseFunctionParameterList()
  198. node := &ast.FunctionLiteral{
  199. Function: idx,
  200. ParameterList: parameterList,
  201. }
  202. self.parseFunctionBlock(node)
  203. return ast.Property{
  204. Key: value,
  205. Kind: "get",
  206. Value: node,
  207. }
  208. } else if literal == "set" && self.token != token.COLON {
  209. idx := self.idx
  210. _, value := self.parseObjectPropertyKey()
  211. parameterList := self.parseFunctionParameterList()
  212. node := &ast.FunctionLiteral{
  213. Function: idx,
  214. ParameterList: parameterList,
  215. }
  216. self.parseFunctionBlock(node)
  217. return ast.Property{
  218. Key: value,
  219. Kind: "set",
  220. Value: node,
  221. }
  222. }
  223. self.expect(token.COLON)
  224. return ast.Property{
  225. Key: value,
  226. Kind: "value",
  227. Value: self.parseAssignmentExpression(),
  228. }
  229. }
  230. func (self *_parser) parseObjectLiteral() ast.Expression {
  231. var value []ast.Property
  232. idx0 := self.expect(token.LEFT_BRACE)
  233. for self.token != token.RIGHT_BRACE && self.token != token.EOF {
  234. property := self.parseObjectProperty()
  235. value = append(value, property)
  236. if self.token != token.RIGHT_BRACE {
  237. self.expect(token.COMMA)
  238. } else {
  239. break
  240. }
  241. }
  242. idx1 := self.expect(token.RIGHT_BRACE)
  243. return &ast.ObjectLiteral{
  244. LeftBrace: idx0,
  245. RightBrace: idx1,
  246. Value: value,
  247. }
  248. }
  249. func (self *_parser) parseArrayLiteral() ast.Expression {
  250. idx0 := self.expect(token.LEFT_BRACKET)
  251. var value []ast.Expression
  252. for self.token != token.RIGHT_BRACKET && self.token != token.EOF {
  253. if self.token == token.COMMA {
  254. self.next()
  255. value = append(value, nil)
  256. continue
  257. }
  258. value = append(value, self.parseAssignmentExpression())
  259. if self.token != token.RIGHT_BRACKET {
  260. self.expect(token.COMMA)
  261. }
  262. }
  263. idx1 := self.expect(token.RIGHT_BRACKET)
  264. return &ast.ArrayLiteral{
  265. LeftBracket: idx0,
  266. RightBracket: idx1,
  267. Value: value,
  268. }
  269. }
  270. func (self *_parser) parseArgumentList() (argumentList []ast.Expression, idx0, idx1 file.Idx) {
  271. idx0 = self.expect(token.LEFT_PARENTHESIS)
  272. if self.token != token.RIGHT_PARENTHESIS {
  273. for {
  274. argumentList = append(argumentList, self.parseAssignmentExpression())
  275. if self.token != token.COMMA {
  276. break
  277. }
  278. self.next()
  279. }
  280. }
  281. idx1 = self.expect(token.RIGHT_PARENTHESIS)
  282. return
  283. }
  284. func (self *_parser) parseCallExpression(left ast.Expression) ast.Expression {
  285. argumentList, idx0, idx1 := self.parseArgumentList()
  286. return &ast.CallExpression{
  287. Callee: left,
  288. LeftParenthesis: idx0,
  289. ArgumentList: argumentList,
  290. RightParenthesis: idx1,
  291. }
  292. }
  293. func (self *_parser) parseDotMember(left ast.Expression) ast.Expression {
  294. period := self.expect(token.PERIOD)
  295. literal := self.parsedLiteral
  296. idx := self.idx
  297. if self.token != token.IDENTIFIER && !isId(self.token) {
  298. self.expect(token.IDENTIFIER)
  299. self.nextStatement()
  300. return &ast.BadExpression{From: period, To: self.idx}
  301. }
  302. self.next()
  303. return &ast.DotExpression{
  304. Left: left,
  305. Identifier: ast.Identifier{
  306. Idx: idx,
  307. Name: literal,
  308. },
  309. }
  310. }
  311. func (self *_parser) parseBracketMember(left ast.Expression) ast.Expression {
  312. idx0 := self.expect(token.LEFT_BRACKET)
  313. member := self.parseExpression()
  314. idx1 := self.expect(token.RIGHT_BRACKET)
  315. return &ast.BracketExpression{
  316. LeftBracket: idx0,
  317. Left: left,
  318. Member: member,
  319. RightBracket: idx1,
  320. }
  321. }
  322. func (self *_parser) parseNewExpression() ast.Expression {
  323. idx := self.expect(token.NEW)
  324. if self.token == token.PERIOD {
  325. self.next()
  326. prop := self.parseIdentifier()
  327. if prop.Name == "target" {
  328. if !self.scope.inFunction {
  329. self.error(idx, "new.target expression is not allowed here")
  330. }
  331. return &ast.MetaProperty{
  332. Meta: &ast.Identifier{
  333. Name: unistring.String(token.NEW.String()),
  334. Idx: idx,
  335. },
  336. Property: prop,
  337. }
  338. }
  339. self.errorUnexpectedToken(token.IDENTIFIER)
  340. }
  341. callee := self.parseLeftHandSideExpression()
  342. node := &ast.NewExpression{
  343. New: idx,
  344. Callee: callee,
  345. }
  346. if self.token == token.LEFT_PARENTHESIS {
  347. argumentList, idx0, idx1 := self.parseArgumentList()
  348. node.ArgumentList = argumentList
  349. node.LeftParenthesis = idx0
  350. node.RightParenthesis = idx1
  351. }
  352. return node
  353. }
  354. func (self *_parser) parseLeftHandSideExpression() ast.Expression {
  355. var left ast.Expression
  356. if self.token == token.NEW {
  357. left = self.parseNewExpression()
  358. } else {
  359. left = self.parsePrimaryExpression()
  360. }
  361. for {
  362. if self.token == token.PERIOD {
  363. left = self.parseDotMember(left)
  364. } else if self.token == token.LEFT_BRACKET {
  365. left = self.parseBracketMember(left)
  366. } else {
  367. break
  368. }
  369. }
  370. return left
  371. }
  372. func (self *_parser) parseLeftHandSideExpressionAllowCall() ast.Expression {
  373. allowIn := self.scope.allowIn
  374. self.scope.allowIn = true
  375. defer func() {
  376. self.scope.allowIn = allowIn
  377. }()
  378. var left ast.Expression
  379. if self.token == token.NEW {
  380. left = self.parseNewExpression()
  381. } else {
  382. left = self.parsePrimaryExpression()
  383. }
  384. for {
  385. if self.token == token.PERIOD {
  386. left = self.parseDotMember(left)
  387. } else if self.token == token.LEFT_BRACKET {
  388. left = self.parseBracketMember(left)
  389. } else if self.token == token.LEFT_PARENTHESIS {
  390. left = self.parseCallExpression(left)
  391. } else {
  392. break
  393. }
  394. }
  395. return left
  396. }
  397. func (self *_parser) parsePostfixExpression() ast.Expression {
  398. operand := self.parseLeftHandSideExpressionAllowCall()
  399. switch self.token {
  400. case token.INCREMENT, token.DECREMENT:
  401. // Make sure there is no line terminator here
  402. if self.implicitSemicolon {
  403. break
  404. }
  405. tkn := self.token
  406. idx := self.idx
  407. self.next()
  408. switch operand.(type) {
  409. case *ast.Identifier, *ast.DotExpression, *ast.BracketExpression:
  410. default:
  411. self.error(idx, "Invalid left-hand side in assignment")
  412. self.nextStatement()
  413. return &ast.BadExpression{From: idx, To: self.idx}
  414. }
  415. return &ast.UnaryExpression{
  416. Operator: tkn,
  417. Idx: idx,
  418. Operand: operand,
  419. Postfix: true,
  420. }
  421. }
  422. return operand
  423. }
  424. func (self *_parser) parseUnaryExpression() ast.Expression {
  425. switch self.token {
  426. case token.PLUS, token.MINUS, token.NOT, token.BITWISE_NOT:
  427. fallthrough
  428. case token.DELETE, token.VOID, token.TYPEOF:
  429. tkn := self.token
  430. idx := self.idx
  431. self.next()
  432. return &ast.UnaryExpression{
  433. Operator: tkn,
  434. Idx: idx,
  435. Operand: self.parseUnaryExpression(),
  436. }
  437. case token.INCREMENT, token.DECREMENT:
  438. tkn := self.token
  439. idx := self.idx
  440. self.next()
  441. operand := self.parseUnaryExpression()
  442. switch operand.(type) {
  443. case *ast.Identifier, *ast.DotExpression, *ast.BracketExpression:
  444. default:
  445. self.error(idx, "Invalid left-hand side in assignment")
  446. self.nextStatement()
  447. return &ast.BadExpression{From: idx, To: self.idx}
  448. }
  449. return &ast.UnaryExpression{
  450. Operator: tkn,
  451. Idx: idx,
  452. Operand: operand,
  453. }
  454. }
  455. return self.parsePostfixExpression()
  456. }
  457. func (self *_parser) parseMultiplicativeExpression() ast.Expression {
  458. next := self.parseUnaryExpression
  459. left := next()
  460. for self.token == token.MULTIPLY || self.token == token.SLASH ||
  461. self.token == token.REMAINDER {
  462. tkn := self.token
  463. self.next()
  464. left = &ast.BinaryExpression{
  465. Operator: tkn,
  466. Left: left,
  467. Right: next(),
  468. }
  469. }
  470. return left
  471. }
  472. func (self *_parser) parseAdditiveExpression() ast.Expression {
  473. next := self.parseMultiplicativeExpression
  474. left := next()
  475. for self.token == token.PLUS || self.token == token.MINUS {
  476. tkn := self.token
  477. self.next()
  478. left = &ast.BinaryExpression{
  479. Operator: tkn,
  480. Left: left,
  481. Right: next(),
  482. }
  483. }
  484. return left
  485. }
  486. func (self *_parser) parseShiftExpression() ast.Expression {
  487. next := self.parseAdditiveExpression
  488. left := next()
  489. for self.token == token.SHIFT_LEFT || self.token == token.SHIFT_RIGHT ||
  490. self.token == token.UNSIGNED_SHIFT_RIGHT {
  491. tkn := self.token
  492. self.next()
  493. left = &ast.BinaryExpression{
  494. Operator: tkn,
  495. Left: left,
  496. Right: next(),
  497. }
  498. }
  499. return left
  500. }
  501. func (self *_parser) parseRelationalExpression() ast.Expression {
  502. next := self.parseShiftExpression
  503. left := next()
  504. allowIn := self.scope.allowIn
  505. self.scope.allowIn = true
  506. defer func() {
  507. self.scope.allowIn = allowIn
  508. }()
  509. switch self.token {
  510. case token.LESS, token.LESS_OR_EQUAL, token.GREATER, token.GREATER_OR_EQUAL:
  511. tkn := self.token
  512. self.next()
  513. return &ast.BinaryExpression{
  514. Operator: tkn,
  515. Left: left,
  516. Right: self.parseRelationalExpression(),
  517. Comparison: true,
  518. }
  519. case token.INSTANCEOF:
  520. tkn := self.token
  521. self.next()
  522. return &ast.BinaryExpression{
  523. Operator: tkn,
  524. Left: left,
  525. Right: self.parseRelationalExpression(),
  526. }
  527. case token.IN:
  528. if !allowIn {
  529. return left
  530. }
  531. tkn := self.token
  532. self.next()
  533. return &ast.BinaryExpression{
  534. Operator: tkn,
  535. Left: left,
  536. Right: self.parseRelationalExpression(),
  537. }
  538. }
  539. return left
  540. }
  541. func (self *_parser) parseEqualityExpression() ast.Expression {
  542. next := self.parseRelationalExpression
  543. left := next()
  544. for self.token == token.EQUAL || self.token == token.NOT_EQUAL ||
  545. self.token == token.STRICT_EQUAL || self.token == token.STRICT_NOT_EQUAL {
  546. tkn := self.token
  547. self.next()
  548. left = &ast.BinaryExpression{
  549. Operator: tkn,
  550. Left: left,
  551. Right: next(),
  552. Comparison: true,
  553. }
  554. }
  555. return left
  556. }
  557. func (self *_parser) parseBitwiseAndExpression() ast.Expression {
  558. next := self.parseEqualityExpression
  559. left := next()
  560. for self.token == token.AND {
  561. tkn := self.token
  562. self.next()
  563. left = &ast.BinaryExpression{
  564. Operator: tkn,
  565. Left: left,
  566. Right: next(),
  567. }
  568. }
  569. return left
  570. }
  571. func (self *_parser) parseBitwiseExclusiveOrExpression() ast.Expression {
  572. next := self.parseBitwiseAndExpression
  573. left := next()
  574. for self.token == token.EXCLUSIVE_OR {
  575. tkn := self.token
  576. self.next()
  577. left = &ast.BinaryExpression{
  578. Operator: tkn,
  579. Left: left,
  580. Right: next(),
  581. }
  582. }
  583. return left
  584. }
  585. func (self *_parser) parseBitwiseOrExpression() ast.Expression {
  586. next := self.parseBitwiseExclusiveOrExpression
  587. left := next()
  588. for self.token == token.OR {
  589. tkn := self.token
  590. self.next()
  591. left = &ast.BinaryExpression{
  592. Operator: tkn,
  593. Left: left,
  594. Right: next(),
  595. }
  596. }
  597. return left
  598. }
  599. func (self *_parser) parseLogicalAndExpression() ast.Expression {
  600. next := self.parseBitwiseOrExpression
  601. left := next()
  602. for self.token == token.LOGICAL_AND {
  603. tkn := self.token
  604. self.next()
  605. left = &ast.BinaryExpression{
  606. Operator: tkn,
  607. Left: left,
  608. Right: next(),
  609. }
  610. }
  611. return left
  612. }
  613. func (self *_parser) parseLogicalOrExpression() ast.Expression {
  614. next := self.parseLogicalAndExpression
  615. left := next()
  616. for self.token == token.LOGICAL_OR {
  617. tkn := self.token
  618. self.next()
  619. left = &ast.BinaryExpression{
  620. Operator: tkn,
  621. Left: left,
  622. Right: next(),
  623. }
  624. }
  625. return left
  626. }
  627. func (self *_parser) parseConditionlExpression() ast.Expression {
  628. left := self.parseLogicalOrExpression()
  629. if self.token == token.QUESTION_MARK {
  630. self.next()
  631. consequent := self.parseAssignmentExpression()
  632. self.expect(token.COLON)
  633. return &ast.ConditionalExpression{
  634. Test: left,
  635. Consequent: consequent,
  636. Alternate: self.parseAssignmentExpression(),
  637. }
  638. }
  639. return left
  640. }
  641. func (self *_parser) parseAssignmentExpression() ast.Expression {
  642. left := self.parseConditionlExpression()
  643. var operator token.Token
  644. switch self.token {
  645. case token.ASSIGN:
  646. operator = self.token
  647. case token.ADD_ASSIGN:
  648. operator = token.PLUS
  649. case token.SUBTRACT_ASSIGN:
  650. operator = token.MINUS
  651. case token.MULTIPLY_ASSIGN:
  652. operator = token.MULTIPLY
  653. case token.QUOTIENT_ASSIGN:
  654. operator = token.SLASH
  655. case token.REMAINDER_ASSIGN:
  656. operator = token.REMAINDER
  657. case token.AND_ASSIGN:
  658. operator = token.AND
  659. case token.OR_ASSIGN:
  660. operator = token.OR
  661. case token.EXCLUSIVE_OR_ASSIGN:
  662. operator = token.EXCLUSIVE_OR
  663. case token.SHIFT_LEFT_ASSIGN:
  664. operator = token.SHIFT_LEFT
  665. case token.SHIFT_RIGHT_ASSIGN:
  666. operator = token.SHIFT_RIGHT
  667. case token.UNSIGNED_SHIFT_RIGHT_ASSIGN:
  668. operator = token.UNSIGNED_SHIFT_RIGHT
  669. }
  670. if operator != 0 {
  671. idx := self.idx
  672. self.next()
  673. switch left.(type) {
  674. case *ast.Identifier, *ast.DotExpression, *ast.BracketExpression:
  675. default:
  676. self.error(left.Idx0(), "Invalid left-hand side in assignment")
  677. self.nextStatement()
  678. return &ast.BadExpression{From: idx, To: self.idx}
  679. }
  680. return &ast.AssignExpression{
  681. Left: left,
  682. Operator: operator,
  683. Right: self.parseAssignmentExpression(),
  684. }
  685. }
  686. return left
  687. }
  688. func (self *_parser) parseExpression() ast.Expression {
  689. next := self.parseAssignmentExpression
  690. left := next()
  691. if self.token == token.COMMA {
  692. sequence := []ast.Expression{left}
  693. for {
  694. if self.token != token.COMMA {
  695. break
  696. }
  697. self.next()
  698. sequence = append(sequence, next())
  699. }
  700. return &ast.SequenceExpression{
  701. Sequence: sequence,
  702. }
  703. }
  704. return left
  705. }