expression.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820
  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, ast.Expression) {
  168. idx, tkn, literal, parsedLiteral := self.idx, self.token, self.literal, self.parsedLiteral
  169. var value ast.Expression
  170. self.next()
  171. switch tkn {
  172. case token.IDENTIFIER:
  173. value = &ast.StringLiteral{
  174. Idx: idx,
  175. Literal: literal,
  176. Value: unistring.String(literal),
  177. }
  178. case token.NUMBER:
  179. num, err := parseNumberLiteral(literal)
  180. if err != nil {
  181. self.error(idx, err.Error())
  182. } else {
  183. value = &ast.NumberLiteral{
  184. Idx: idx,
  185. Literal: literal,
  186. Value: num,
  187. }
  188. }
  189. case token.STRING:
  190. value = &ast.StringLiteral{
  191. Idx: idx,
  192. Literal: literal,
  193. Value: parsedLiteral,
  194. }
  195. default:
  196. // null, false, class, etc.
  197. if isId(tkn) {
  198. value = &ast.StringLiteral{
  199. Idx: idx,
  200. Literal: literal,
  201. Value: unistring.String(literal),
  202. }
  203. }
  204. }
  205. return literal, value
  206. }
  207. func (self *_parser) parseObjectProperty() ast.Property {
  208. literal, value := self.parseObjectPropertyKey()
  209. if literal == "get" && self.token != token.COLON {
  210. idx := self.idx
  211. _, value := self.parseObjectPropertyKey()
  212. parameterList := self.parseFunctionParameterList()
  213. node := &ast.FunctionLiteral{
  214. Function: idx,
  215. ParameterList: parameterList,
  216. }
  217. self.parseFunctionBlock(node)
  218. return ast.Property{
  219. Key: value,
  220. Kind: "get",
  221. Value: node,
  222. }
  223. } else if literal == "set" && self.token != token.COLON {
  224. idx := self.idx
  225. _, value := self.parseObjectPropertyKey()
  226. parameterList := self.parseFunctionParameterList()
  227. node := &ast.FunctionLiteral{
  228. Function: idx,
  229. ParameterList: parameterList,
  230. }
  231. self.parseFunctionBlock(node)
  232. return ast.Property{
  233. Key: value,
  234. Kind: "set",
  235. Value: node,
  236. }
  237. }
  238. self.expect(token.COLON)
  239. return ast.Property{
  240. Key: value,
  241. Kind: "value",
  242. Value: self.parseAssignmentExpression(),
  243. }
  244. }
  245. func (self *_parser) parseObjectLiteral() ast.Expression {
  246. var value []ast.Property
  247. idx0 := self.expect(token.LEFT_BRACE)
  248. for self.token != token.RIGHT_BRACE && self.token != token.EOF {
  249. property := self.parseObjectProperty()
  250. value = append(value, property)
  251. if self.token != token.RIGHT_BRACE {
  252. self.expect(token.COMMA)
  253. } else {
  254. break
  255. }
  256. }
  257. idx1 := self.expect(token.RIGHT_BRACE)
  258. return &ast.ObjectLiteral{
  259. LeftBrace: idx0,
  260. RightBrace: idx1,
  261. Value: value,
  262. }
  263. }
  264. func (self *_parser) parseArrayLiteral() ast.Expression {
  265. idx0 := self.expect(token.LEFT_BRACKET)
  266. var value []ast.Expression
  267. for self.token != token.RIGHT_BRACKET && self.token != token.EOF {
  268. if self.token == token.COMMA {
  269. self.next()
  270. value = append(value, nil)
  271. continue
  272. }
  273. value = append(value, self.parseAssignmentExpression())
  274. if self.token != token.RIGHT_BRACKET {
  275. self.expect(token.COMMA)
  276. }
  277. }
  278. idx1 := self.expect(token.RIGHT_BRACKET)
  279. return &ast.ArrayLiteral{
  280. LeftBracket: idx0,
  281. RightBracket: idx1,
  282. Value: value,
  283. }
  284. }
  285. func (self *_parser) parseArgumentList() (argumentList []ast.Expression, idx0, idx1 file.Idx) {
  286. idx0 = self.expect(token.LEFT_PARENTHESIS)
  287. if self.token != token.RIGHT_PARENTHESIS {
  288. for {
  289. argumentList = append(argumentList, self.parseAssignmentExpression())
  290. if self.token != token.COMMA {
  291. break
  292. }
  293. self.next()
  294. }
  295. }
  296. idx1 = self.expect(token.RIGHT_PARENTHESIS)
  297. return
  298. }
  299. func (self *_parser) parseCallExpression(left ast.Expression) ast.Expression {
  300. argumentList, idx0, idx1 := self.parseArgumentList()
  301. return &ast.CallExpression{
  302. Callee: left,
  303. LeftParenthesis: idx0,
  304. ArgumentList: argumentList,
  305. RightParenthesis: idx1,
  306. }
  307. }
  308. func (self *_parser) parseDotMember(left ast.Expression) ast.Expression {
  309. period := self.expect(token.PERIOD)
  310. literal := self.parsedLiteral
  311. idx := self.idx
  312. if self.token != token.IDENTIFIER && !isId(self.token) {
  313. self.expect(token.IDENTIFIER)
  314. self.nextStatement()
  315. return &ast.BadExpression{From: period, To: self.idx}
  316. }
  317. self.next()
  318. return &ast.DotExpression{
  319. Left: left,
  320. Identifier: ast.Identifier{
  321. Idx: idx,
  322. Name: literal,
  323. },
  324. }
  325. }
  326. func (self *_parser) parseBracketMember(left ast.Expression) ast.Expression {
  327. idx0 := self.expect(token.LEFT_BRACKET)
  328. member := self.parseExpression()
  329. idx1 := self.expect(token.RIGHT_BRACKET)
  330. return &ast.BracketExpression{
  331. LeftBracket: idx0,
  332. Left: left,
  333. Member: member,
  334. RightBracket: idx1,
  335. }
  336. }
  337. func (self *_parser) parseNewExpression() ast.Expression {
  338. idx := self.expect(token.NEW)
  339. if self.token == token.PERIOD {
  340. self.next()
  341. prop := self.parseIdentifier()
  342. if prop.Name == "target" {
  343. if !self.scope.inFunction {
  344. self.error(idx, "new.target expression is not allowed here")
  345. }
  346. return &ast.MetaProperty{
  347. Meta: &ast.Identifier{
  348. Name: unistring.String(token.NEW.String()),
  349. Idx: idx,
  350. },
  351. Property: prop,
  352. }
  353. }
  354. self.errorUnexpectedToken(token.IDENTIFIER)
  355. }
  356. callee := self.parseLeftHandSideExpression()
  357. node := &ast.NewExpression{
  358. New: idx,
  359. Callee: callee,
  360. }
  361. if self.token == token.LEFT_PARENTHESIS {
  362. argumentList, idx0, idx1 := self.parseArgumentList()
  363. node.ArgumentList = argumentList
  364. node.LeftParenthesis = idx0
  365. node.RightParenthesis = idx1
  366. }
  367. return node
  368. }
  369. func (self *_parser) parseLeftHandSideExpression() ast.Expression {
  370. var left ast.Expression
  371. if self.token == token.NEW {
  372. left = self.parseNewExpression()
  373. } else {
  374. left = self.parsePrimaryExpression()
  375. }
  376. for {
  377. if self.token == token.PERIOD {
  378. left = self.parseDotMember(left)
  379. } else if self.token == token.LEFT_BRACKET {
  380. left = self.parseBracketMember(left)
  381. } else {
  382. break
  383. }
  384. }
  385. return left
  386. }
  387. func (self *_parser) parseLeftHandSideExpressionAllowCall() ast.Expression {
  388. allowIn := self.scope.allowIn
  389. self.scope.allowIn = true
  390. defer func() {
  391. self.scope.allowIn = allowIn
  392. }()
  393. var left ast.Expression
  394. if self.token == token.NEW {
  395. left = self.parseNewExpression()
  396. } else {
  397. left = self.parsePrimaryExpression()
  398. }
  399. for {
  400. if self.token == token.PERIOD {
  401. left = self.parseDotMember(left)
  402. } else if self.token == token.LEFT_BRACKET {
  403. left = self.parseBracketMember(left)
  404. } else if self.token == token.LEFT_PARENTHESIS {
  405. left = self.parseCallExpression(left)
  406. } else {
  407. break
  408. }
  409. }
  410. return left
  411. }
  412. func (self *_parser) parsePostfixExpression() ast.Expression {
  413. operand := self.parseLeftHandSideExpressionAllowCall()
  414. switch self.token {
  415. case token.INCREMENT, token.DECREMENT:
  416. // Make sure there is no line terminator here
  417. if self.implicitSemicolon {
  418. break
  419. }
  420. tkn := self.token
  421. idx := self.idx
  422. self.next()
  423. switch operand.(type) {
  424. case *ast.Identifier, *ast.DotExpression, *ast.BracketExpression:
  425. default:
  426. self.error(idx, "Invalid left-hand side in assignment")
  427. self.nextStatement()
  428. return &ast.BadExpression{From: idx, To: self.idx}
  429. }
  430. return &ast.UnaryExpression{
  431. Operator: tkn,
  432. Idx: idx,
  433. Operand: operand,
  434. Postfix: true,
  435. }
  436. }
  437. return operand
  438. }
  439. func (self *_parser) parseUnaryExpression() ast.Expression {
  440. switch self.token {
  441. case token.PLUS, token.MINUS, token.NOT, token.BITWISE_NOT:
  442. fallthrough
  443. case token.DELETE, token.VOID, token.TYPEOF:
  444. tkn := self.token
  445. idx := self.idx
  446. self.next()
  447. return &ast.UnaryExpression{
  448. Operator: tkn,
  449. Idx: idx,
  450. Operand: self.parseUnaryExpression(),
  451. }
  452. case token.INCREMENT, token.DECREMENT:
  453. tkn := self.token
  454. idx := self.idx
  455. self.next()
  456. operand := self.parseUnaryExpression()
  457. switch operand.(type) {
  458. case *ast.Identifier, *ast.DotExpression, *ast.BracketExpression:
  459. default:
  460. self.error(idx, "Invalid left-hand side in assignment")
  461. self.nextStatement()
  462. return &ast.BadExpression{From: idx, To: self.idx}
  463. }
  464. return &ast.UnaryExpression{
  465. Operator: tkn,
  466. Idx: idx,
  467. Operand: operand,
  468. }
  469. }
  470. return self.parsePostfixExpression()
  471. }
  472. func (self *_parser) parseMultiplicativeExpression() ast.Expression {
  473. next := self.parseUnaryExpression
  474. left := next()
  475. for self.token == token.MULTIPLY || self.token == token.SLASH ||
  476. self.token == token.REMAINDER {
  477. tkn := self.token
  478. self.next()
  479. left = &ast.BinaryExpression{
  480. Operator: tkn,
  481. Left: left,
  482. Right: next(),
  483. }
  484. }
  485. return left
  486. }
  487. func (self *_parser) parseAdditiveExpression() ast.Expression {
  488. next := self.parseMultiplicativeExpression
  489. left := next()
  490. for self.token == token.PLUS || self.token == token.MINUS {
  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) parseShiftExpression() ast.Expression {
  502. next := self.parseAdditiveExpression
  503. left := next()
  504. for self.token == token.SHIFT_LEFT || self.token == token.SHIFT_RIGHT ||
  505. self.token == token.UNSIGNED_SHIFT_RIGHT {
  506. tkn := self.token
  507. self.next()
  508. left = &ast.BinaryExpression{
  509. Operator: tkn,
  510. Left: left,
  511. Right: next(),
  512. }
  513. }
  514. return left
  515. }
  516. func (self *_parser) parseRelationalExpression() ast.Expression {
  517. next := self.parseShiftExpression
  518. left := next()
  519. allowIn := self.scope.allowIn
  520. self.scope.allowIn = true
  521. defer func() {
  522. self.scope.allowIn = allowIn
  523. }()
  524. switch self.token {
  525. case token.LESS, token.LESS_OR_EQUAL, token.GREATER, token.GREATER_OR_EQUAL:
  526. tkn := self.token
  527. self.next()
  528. return &ast.BinaryExpression{
  529. Operator: tkn,
  530. Left: left,
  531. Right: self.parseRelationalExpression(),
  532. Comparison: true,
  533. }
  534. case token.INSTANCEOF:
  535. tkn := self.token
  536. self.next()
  537. return &ast.BinaryExpression{
  538. Operator: tkn,
  539. Left: left,
  540. Right: self.parseRelationalExpression(),
  541. }
  542. case token.IN:
  543. if !allowIn {
  544. return left
  545. }
  546. tkn := self.token
  547. self.next()
  548. return &ast.BinaryExpression{
  549. Operator: tkn,
  550. Left: left,
  551. Right: self.parseRelationalExpression(),
  552. }
  553. }
  554. return left
  555. }
  556. func (self *_parser) parseEqualityExpression() ast.Expression {
  557. next := self.parseRelationalExpression
  558. left := next()
  559. for self.token == token.EQUAL || self.token == token.NOT_EQUAL ||
  560. self.token == token.STRICT_EQUAL || self.token == token.STRICT_NOT_EQUAL {
  561. tkn := self.token
  562. self.next()
  563. left = &ast.BinaryExpression{
  564. Operator: tkn,
  565. Left: left,
  566. Right: next(),
  567. Comparison: true,
  568. }
  569. }
  570. return left
  571. }
  572. func (self *_parser) parseBitwiseAndExpression() ast.Expression {
  573. next := self.parseEqualityExpression
  574. left := next()
  575. for self.token == token.AND {
  576. tkn := self.token
  577. self.next()
  578. left = &ast.BinaryExpression{
  579. Operator: tkn,
  580. Left: left,
  581. Right: next(),
  582. }
  583. }
  584. return left
  585. }
  586. func (self *_parser) parseBitwiseExclusiveOrExpression() ast.Expression {
  587. next := self.parseBitwiseAndExpression
  588. left := next()
  589. for self.token == token.EXCLUSIVE_OR {
  590. tkn := self.token
  591. self.next()
  592. left = &ast.BinaryExpression{
  593. Operator: tkn,
  594. Left: left,
  595. Right: next(),
  596. }
  597. }
  598. return left
  599. }
  600. func (self *_parser) parseBitwiseOrExpression() ast.Expression {
  601. next := self.parseBitwiseExclusiveOrExpression
  602. left := next()
  603. for self.token == token.OR {
  604. tkn := self.token
  605. self.next()
  606. left = &ast.BinaryExpression{
  607. Operator: tkn,
  608. Left: left,
  609. Right: next(),
  610. }
  611. }
  612. return left
  613. }
  614. func (self *_parser) parseLogicalAndExpression() ast.Expression {
  615. next := self.parseBitwiseOrExpression
  616. left := next()
  617. for self.token == token.LOGICAL_AND {
  618. tkn := self.token
  619. self.next()
  620. left = &ast.BinaryExpression{
  621. Operator: tkn,
  622. Left: left,
  623. Right: next(),
  624. }
  625. }
  626. return left
  627. }
  628. func (self *_parser) parseLogicalOrExpression() ast.Expression {
  629. next := self.parseLogicalAndExpression
  630. left := next()
  631. for self.token == token.LOGICAL_OR {
  632. tkn := self.token
  633. self.next()
  634. left = &ast.BinaryExpression{
  635. Operator: tkn,
  636. Left: left,
  637. Right: next(),
  638. }
  639. }
  640. return left
  641. }
  642. func (self *_parser) parseConditionlExpression() ast.Expression {
  643. left := self.parseLogicalOrExpression()
  644. if self.token == token.QUESTION_MARK {
  645. self.next()
  646. consequent := self.parseAssignmentExpression()
  647. self.expect(token.COLON)
  648. return &ast.ConditionalExpression{
  649. Test: left,
  650. Consequent: consequent,
  651. Alternate: self.parseAssignmentExpression(),
  652. }
  653. }
  654. return left
  655. }
  656. func (self *_parser) parseAssignmentExpression() ast.Expression {
  657. left := self.parseConditionlExpression()
  658. var operator token.Token
  659. switch self.token {
  660. case token.ASSIGN:
  661. operator = self.token
  662. case token.ADD_ASSIGN:
  663. operator = token.PLUS
  664. case token.SUBTRACT_ASSIGN:
  665. operator = token.MINUS
  666. case token.MULTIPLY_ASSIGN:
  667. operator = token.MULTIPLY
  668. case token.QUOTIENT_ASSIGN:
  669. operator = token.SLASH
  670. case token.REMAINDER_ASSIGN:
  671. operator = token.REMAINDER
  672. case token.AND_ASSIGN:
  673. operator = token.AND
  674. case token.OR_ASSIGN:
  675. operator = token.OR
  676. case token.EXCLUSIVE_OR_ASSIGN:
  677. operator = token.EXCLUSIVE_OR
  678. case token.SHIFT_LEFT_ASSIGN:
  679. operator = token.SHIFT_LEFT
  680. case token.SHIFT_RIGHT_ASSIGN:
  681. operator = token.SHIFT_RIGHT
  682. case token.UNSIGNED_SHIFT_RIGHT_ASSIGN:
  683. operator = token.UNSIGNED_SHIFT_RIGHT
  684. }
  685. if operator != 0 {
  686. idx := self.idx
  687. self.next()
  688. switch left.(type) {
  689. case *ast.Identifier, *ast.DotExpression, *ast.BracketExpression:
  690. default:
  691. self.error(left.Idx0(), "Invalid left-hand side in assignment")
  692. self.nextStatement()
  693. return &ast.BadExpression{From: idx, To: self.idx}
  694. }
  695. return &ast.AssignExpression{
  696. Left: left,
  697. Operator: operator,
  698. Right: self.parseAssignmentExpression(),
  699. }
  700. }
  701. return left
  702. }
  703. func (self *_parser) parseExpression() ast.Expression {
  704. next := self.parseAssignmentExpression
  705. left := next()
  706. if self.token == token.COMMA {
  707. sequence := []ast.Expression{left}
  708. for {
  709. if self.token != token.COMMA {
  710. break
  711. }
  712. self.next()
  713. sequence = append(sequence, next())
  714. }
  715. return &ast.SequenceExpression{
  716. Sequence: sequence,
  717. }
  718. }
  719. return left
  720. }