expression.go 17 KB

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