expression.go 18 KB

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