expression.go 17 KB

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