expression.go 18 KB

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