expression.go 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347
  1. package parser
  2. import (
  3. "strings"
  4. "github.com/dop251/goja/ast"
  5. "github.com/dop251/goja/file"
  6. "github.com/dop251/goja/token"
  7. "github.com/dop251/goja/unistring"
  8. )
  9. func (self *_parser) parseIdentifier() *ast.Identifier {
  10. literal := self.parsedLiteral
  11. idx := self.idx
  12. self.next()
  13. return &ast.Identifier{
  14. Name: literal,
  15. Idx: idx,
  16. }
  17. }
  18. func (self *_parser) parsePrimaryExpression() ast.Expression {
  19. literal, parsedLiteral := self.literal, self.parsedLiteral
  20. idx := self.idx
  21. switch self.token {
  22. case token.IDENTIFIER:
  23. self.next()
  24. if len(literal) > 1 {
  25. tkn, strict := token.IsKeyword(literal)
  26. if tkn == token.KEYWORD {
  27. if !strict {
  28. self.error(idx, "Unexpected reserved word")
  29. }
  30. }
  31. }
  32. return &ast.Identifier{
  33. Name: parsedLiteral,
  34. Idx: idx,
  35. }
  36. case token.NULL:
  37. self.next()
  38. return &ast.NullLiteral{
  39. Idx: idx,
  40. Literal: literal,
  41. }
  42. case token.BOOLEAN:
  43. self.next()
  44. value := false
  45. switch parsedLiteral {
  46. case "true":
  47. value = true
  48. case "false":
  49. value = false
  50. default:
  51. self.error(idx, "Illegal boolean literal")
  52. }
  53. return &ast.BooleanLiteral{
  54. Idx: idx,
  55. Literal: literal,
  56. Value: value,
  57. }
  58. case token.STRING:
  59. self.next()
  60. return &ast.StringLiteral{
  61. Idx: idx,
  62. Literal: literal,
  63. Value: parsedLiteral,
  64. }
  65. case token.NUMBER:
  66. self.next()
  67. if literal[len(literal)-1] == 'n' {
  68. if value, err := parseBigIntLiteral(literal); err != nil {
  69. self.error(idx, err.Error())
  70. value = 0
  71. } else {
  72. return &ast.BigIntLiteral{
  73. Idx: idx,
  74. Literal: literal,
  75. Value: value,
  76. }
  77. }
  78. }
  79. value, err := parseNumberLiteral(literal)
  80. if err != nil {
  81. self.error(idx, err.Error())
  82. value = 0
  83. }
  84. return &ast.NumberLiteral{
  85. Idx: idx,
  86. Literal: literal,
  87. Value: value,
  88. }
  89. case token.SLASH, token.QUOTIENT_ASSIGN:
  90. return self.parseRegExpLiteral()
  91. case token.LEFT_BRACE:
  92. return self.parseObjectLiteral()
  93. case token.LEFT_BRACKET:
  94. return self.parseArrayLiteral()
  95. case token.LEFT_PARENTHESIS:
  96. return self.parseParenthesisedExpression()
  97. case token.BACKTICK:
  98. return self.parseTemplateLiteral(false)
  99. case token.THIS:
  100. self.next()
  101. return &ast.ThisExpression{
  102. Idx: idx,
  103. }
  104. case token.FUNCTION:
  105. return self.parseFunction(false)
  106. }
  107. self.errorUnexpectedToken(self.token)
  108. self.nextStatement()
  109. return &ast.BadExpression{From: idx, To: self.idx}
  110. }
  111. func (self *_parser) reinterpretSequenceAsArrowFuncParams(seq *ast.SequenceExpression) *ast.ParameterList {
  112. firstRestIdx := -1
  113. params := make([]*ast.Binding, 0, len(seq.Sequence))
  114. for i, item := range seq.Sequence {
  115. if _, ok := item.(*ast.SpreadElement); ok {
  116. if firstRestIdx == -1 {
  117. firstRestIdx = i
  118. continue
  119. }
  120. }
  121. if firstRestIdx != -1 {
  122. self.error(seq.Sequence[firstRestIdx].Idx0(), "Rest parameter must be last formal parameter")
  123. return &ast.ParameterList{}
  124. }
  125. params = append(params, self.reinterpretAsBinding(item))
  126. }
  127. var rest ast.Expression
  128. if firstRestIdx != -1 {
  129. rest = self.reinterpretAsBindingRestElement(seq.Sequence[firstRestIdx])
  130. }
  131. return &ast.ParameterList{
  132. List: params,
  133. Rest: rest,
  134. }
  135. }
  136. func (self *_parser) parseParenthesisedExpression() ast.Expression {
  137. opening := self.idx
  138. self.expect(token.LEFT_PARENTHESIS)
  139. var list []ast.Expression
  140. if self.token != token.RIGHT_PARENTHESIS {
  141. for {
  142. if self.token == token.ELLIPSIS {
  143. start := self.idx
  144. self.errorUnexpectedToken(token.ELLIPSIS)
  145. self.next()
  146. expr := self.parseAssignmentExpression()
  147. list = append(list, &ast.BadExpression{
  148. From: start,
  149. To: expr.Idx1(),
  150. })
  151. } else {
  152. list = append(list, self.parseAssignmentExpression())
  153. }
  154. if self.token != token.COMMA {
  155. break
  156. }
  157. self.next()
  158. if self.token == token.RIGHT_PARENTHESIS {
  159. self.errorUnexpectedToken(token.RIGHT_PARENTHESIS)
  160. break
  161. }
  162. }
  163. }
  164. self.expect(token.RIGHT_PARENTHESIS)
  165. if len(list) == 1 && len(self.errors) == 0 {
  166. return list[0]
  167. }
  168. if len(list) == 0 {
  169. self.errorUnexpectedToken(token.RIGHT_PARENTHESIS)
  170. return &ast.BadExpression{
  171. From: opening,
  172. To: self.idx,
  173. }
  174. }
  175. return &ast.SequenceExpression{
  176. Sequence: list,
  177. }
  178. }
  179. func (self *_parser) parseRegExpLiteral() *ast.RegExpLiteral {
  180. offset := self.chrOffset - 1 // Opening slash already gotten
  181. if self.token == token.QUOTIENT_ASSIGN {
  182. offset -= 1 // =
  183. }
  184. idx := self.idxOf(offset)
  185. pattern, _, err := self.scanString(offset, false)
  186. endOffset := self.chrOffset
  187. if err == nil {
  188. pattern = pattern[1 : len(pattern)-1]
  189. }
  190. flags := ""
  191. if !isLineTerminator(self.chr) && !isLineWhiteSpace(self.chr) {
  192. self.next()
  193. if self.token == token.IDENTIFIER { // gim
  194. flags = self.literal
  195. self.next()
  196. endOffset = self.chrOffset - 1
  197. }
  198. } else {
  199. self.next()
  200. }
  201. literal := self.str[offset:endOffset]
  202. return &ast.RegExpLiteral{
  203. Idx: idx,
  204. Literal: literal,
  205. Pattern: pattern,
  206. Flags: flags,
  207. }
  208. }
  209. func (self *_parser) parseBindingTarget() (target ast.BindingTarget) {
  210. if self.token == token.LET {
  211. self.token = token.IDENTIFIER
  212. }
  213. switch self.token {
  214. case token.IDENTIFIER:
  215. target = &ast.Identifier{
  216. Name: self.parsedLiteral,
  217. Idx: self.idx,
  218. }
  219. self.next()
  220. case token.LEFT_BRACKET:
  221. target = self.parseArrayBindingPattern()
  222. case token.LEFT_BRACE:
  223. target = self.parseObjectBindingPattern()
  224. default:
  225. idx := self.expect(token.IDENTIFIER)
  226. self.nextStatement()
  227. target = &ast.BadExpression{From: idx, To: self.idx}
  228. }
  229. return
  230. }
  231. func (self *_parser) parseVariableDeclaration(declarationList *[]*ast.Binding) ast.Expression {
  232. node := &ast.Binding{
  233. Target: self.parseBindingTarget(),
  234. }
  235. if declarationList != nil {
  236. *declarationList = append(*declarationList, node)
  237. }
  238. if self.token == token.ASSIGN {
  239. self.next()
  240. node.Initializer = self.parseAssignmentExpression()
  241. }
  242. return node
  243. }
  244. func (self *_parser) parseVariableDeclarationList() (declarationList []*ast.Binding) {
  245. for {
  246. self.parseVariableDeclaration(&declarationList)
  247. if self.token != token.COMMA {
  248. break
  249. }
  250. self.next()
  251. }
  252. return
  253. }
  254. func (self *_parser) parseVarDeclarationList(var_ file.Idx) []*ast.Binding {
  255. declarationList := self.parseVariableDeclarationList()
  256. self.scope.declare(&ast.VariableDeclaration{
  257. Var: var_,
  258. List: declarationList,
  259. })
  260. return declarationList
  261. }
  262. func (self *_parser) parseObjectPropertyKey() (unistring.String, ast.Expression, token.Token) {
  263. if self.token == token.LEFT_BRACKET {
  264. self.next()
  265. expr := self.parseAssignmentExpression()
  266. self.expect(token.RIGHT_BRACKET)
  267. return "", expr, token.ILLEGAL
  268. }
  269. idx, tkn, literal, parsedLiteral := self.idx, self.token, self.literal, self.parsedLiteral
  270. var value ast.Expression
  271. self.next()
  272. switch tkn {
  273. case token.IDENTIFIER:
  274. value = &ast.StringLiteral{
  275. Idx: idx,
  276. Literal: literal,
  277. Value: unistring.String(literal),
  278. }
  279. case token.NUMBER:
  280. if literal[len(literal)-1] == 'n' {
  281. num, err := parseBigIntLiteral(literal)
  282. if err != nil {
  283. self.error(idx, err.Error())
  284. } else {
  285. value = &ast.BigIntLiteral{
  286. Idx: idx,
  287. Literal: literal,
  288. Value: num,
  289. }
  290. }
  291. } else {
  292. num, err := parseNumberLiteral(literal)
  293. if err != nil {
  294. self.error(idx, err.Error())
  295. } else {
  296. value = &ast.NumberLiteral{
  297. Idx: idx,
  298. Literal: literal,
  299. Value: num,
  300. }
  301. }
  302. }
  303. case token.STRING:
  304. value = &ast.StringLiteral{
  305. Idx: idx,
  306. Literal: literal,
  307. Value: parsedLiteral,
  308. }
  309. default:
  310. // null, false, class, etc.
  311. if isId(tkn) {
  312. value = &ast.StringLiteral{
  313. Idx: idx,
  314. Literal: literal,
  315. Value: unistring.String(literal),
  316. }
  317. tkn = token.KEYWORD
  318. }
  319. }
  320. return parsedLiteral, value, tkn
  321. }
  322. func (self *_parser) parseObjectProperty() ast.Property {
  323. if self.token == token.ELLIPSIS {
  324. self.next()
  325. return &ast.SpreadElement{
  326. Expression: self.parseAssignmentExpression(),
  327. }
  328. }
  329. literal, value, tkn := self.parseObjectPropertyKey()
  330. if tkn == token.IDENTIFIER || tkn == token.STRING || tkn == token.KEYWORD || tkn == token.ILLEGAL {
  331. switch {
  332. case self.token == token.LEFT_PARENTHESIS:
  333. idx := self.idx
  334. parameterList := self.parseFunctionParameterList()
  335. node := &ast.FunctionLiteral{
  336. Function: idx,
  337. ParameterList: parameterList,
  338. }
  339. node.Body, node.DeclarationList = self.parseFunctionBlock()
  340. return &ast.PropertyKeyed{
  341. Key: value,
  342. Kind: ast.PropertyKindMethod,
  343. Value: node,
  344. }
  345. case self.token == token.COMMA || self.token == token.RIGHT_BRACE || self.token == token.ASSIGN: // shorthand property
  346. if tkn == token.IDENTIFIER || tkn == token.KEYWORD && literal == "let" {
  347. var initializer ast.Expression
  348. if self.token == token.ASSIGN {
  349. // allow the initializer syntax here in case the object literal
  350. // needs to be reinterpreted as an assignment pattern, enforce later if it doesn't.
  351. self.next()
  352. initializer = self.parseAssignmentExpression()
  353. }
  354. return &ast.PropertyShort{
  355. Name: ast.Identifier{
  356. Name: literal,
  357. Idx: value.Idx0(),
  358. },
  359. Initializer: initializer,
  360. }
  361. }
  362. case literal == "get" && self.token != token.COLON:
  363. idx := self.idx
  364. _, value, _ := self.parseObjectPropertyKey()
  365. idx1 := self.idx
  366. parameterList := self.parseFunctionParameterList()
  367. if len(parameterList.List) > 0 || parameterList.Rest != nil {
  368. self.error(idx1, "Getter must not have any formal parameters.")
  369. }
  370. node := &ast.FunctionLiteral{
  371. Function: idx,
  372. ParameterList: parameterList,
  373. }
  374. node.Body, node.DeclarationList = self.parseFunctionBlock()
  375. return &ast.PropertyKeyed{
  376. Key: value,
  377. Kind: ast.PropertyKindGet,
  378. Value: node,
  379. }
  380. case literal == "set" && self.token != token.COLON:
  381. idx := self.idx
  382. _, value, _ := self.parseObjectPropertyKey()
  383. parameterList := self.parseFunctionParameterList()
  384. node := &ast.FunctionLiteral{
  385. Function: idx,
  386. ParameterList: parameterList,
  387. }
  388. node.Body, node.DeclarationList = self.parseFunctionBlock()
  389. return &ast.PropertyKeyed{
  390. Key: value,
  391. Kind: ast.PropertyKindSet,
  392. Value: node,
  393. }
  394. }
  395. }
  396. self.expect(token.COLON)
  397. return &ast.PropertyKeyed{
  398. Key: value,
  399. Kind: ast.PropertyKindValue,
  400. Value: self.parseAssignmentExpression(),
  401. }
  402. }
  403. func (self *_parser) parseObjectLiteral() *ast.ObjectLiteral {
  404. var value []ast.Property
  405. idx0 := self.expect(token.LEFT_BRACE)
  406. for self.token != token.RIGHT_BRACE && self.token != token.EOF {
  407. property := self.parseObjectProperty()
  408. value = append(value, property)
  409. if self.token != token.RIGHT_BRACE {
  410. self.expect(token.COMMA)
  411. } else {
  412. break
  413. }
  414. }
  415. idx1 := self.expect(token.RIGHT_BRACE)
  416. return &ast.ObjectLiteral{
  417. LeftBrace: idx0,
  418. RightBrace: idx1,
  419. Value: value,
  420. }
  421. }
  422. func (self *_parser) parseArrayLiteral() *ast.ArrayLiteral {
  423. idx0 := self.expect(token.LEFT_BRACKET)
  424. var value []ast.Expression
  425. for self.token != token.RIGHT_BRACKET && self.token != token.EOF {
  426. if self.token == token.COMMA {
  427. self.next()
  428. value = append(value, nil)
  429. continue
  430. }
  431. if self.token == token.ELLIPSIS {
  432. self.next()
  433. value = append(value, &ast.SpreadElement{
  434. Expression: self.parseAssignmentExpression(),
  435. })
  436. } else {
  437. value = append(value, self.parseAssignmentExpression())
  438. }
  439. if self.token != token.RIGHT_BRACKET {
  440. self.expect(token.COMMA)
  441. }
  442. }
  443. idx1 := self.expect(token.RIGHT_BRACKET)
  444. return &ast.ArrayLiteral{
  445. LeftBracket: idx0,
  446. RightBracket: idx1,
  447. Value: value,
  448. }
  449. }
  450. func (self *_parser) parseTemplateLiteral(tagged bool) *ast.TemplateLiteral {
  451. res := &ast.TemplateLiteral{
  452. OpenQuote: self.idx,
  453. }
  454. for self.chr != -1 {
  455. start := self.idx + 1
  456. literal, parsed, finished, parseErr, err := self.parseTemplateCharacters()
  457. if err != nil {
  458. self.error(self.idx, err.Error())
  459. }
  460. res.Elements = append(res.Elements, &ast.TemplateElement{
  461. Idx: start,
  462. Literal: literal,
  463. Parsed: parsed,
  464. Valid: parseErr == nil,
  465. })
  466. if !tagged && parseErr != nil {
  467. self.error(self.idx, parseErr.Error())
  468. }
  469. end := self.idx + 1
  470. self.next()
  471. if finished {
  472. res.CloseQuote = end
  473. break
  474. }
  475. expr := self.parseExpression()
  476. res.Expressions = append(res.Expressions, expr)
  477. if self.token != token.RIGHT_BRACE {
  478. self.errorUnexpectedToken(self.token)
  479. }
  480. }
  481. return res
  482. }
  483. func (self *_parser) parseTaggedTemplateLiteral(tag ast.Expression) *ast.TemplateLiteral {
  484. l := self.parseTemplateLiteral(true)
  485. l.Tag = tag
  486. return l
  487. }
  488. func (self *_parser) parseArgumentList() (argumentList []ast.Expression, idx0, idx1 file.Idx) {
  489. idx0 = self.expect(token.LEFT_PARENTHESIS)
  490. if self.token != token.RIGHT_PARENTHESIS {
  491. for {
  492. var item ast.Expression
  493. if self.token == token.ELLIPSIS {
  494. self.next()
  495. item = &ast.SpreadElement{
  496. Expression: self.parseAssignmentExpression(),
  497. }
  498. } else {
  499. item = self.parseAssignmentExpression()
  500. }
  501. argumentList = append(argumentList, item)
  502. if self.token != token.COMMA {
  503. break
  504. }
  505. self.next()
  506. }
  507. }
  508. idx1 = self.expect(token.RIGHT_PARENTHESIS)
  509. return
  510. }
  511. func (self *_parser) parseCallExpression(left ast.Expression) ast.Expression {
  512. argumentList, idx0, idx1 := self.parseArgumentList()
  513. return &ast.CallExpression{
  514. Callee: left,
  515. LeftParenthesis: idx0,
  516. ArgumentList: argumentList,
  517. RightParenthesis: idx1,
  518. }
  519. }
  520. func (self *_parser) parseDotMember(left ast.Expression) ast.Expression {
  521. period := self.expect(token.PERIOD)
  522. literal := self.parsedLiteral
  523. idx := self.idx
  524. if self.token != token.IDENTIFIER && !isId(self.token) {
  525. self.expect(token.IDENTIFIER)
  526. self.nextStatement()
  527. return &ast.BadExpression{From: period, To: self.idx}
  528. }
  529. self.next()
  530. return &ast.DotExpression{
  531. Left: left,
  532. Identifier: ast.Identifier{
  533. Idx: idx,
  534. Name: literal,
  535. },
  536. }
  537. }
  538. func (self *_parser) parseBracketMember(left ast.Expression) ast.Expression {
  539. idx0 := self.expect(token.LEFT_BRACKET)
  540. member := self.parseExpression()
  541. idx1 := self.expect(token.RIGHT_BRACKET)
  542. return &ast.BracketExpression{
  543. LeftBracket: idx0,
  544. Left: left,
  545. Member: member,
  546. RightBracket: idx1,
  547. }
  548. }
  549. func (self *_parser) parseNewExpression() ast.Expression {
  550. idx := self.expect(token.NEW)
  551. if self.token == token.PERIOD {
  552. self.next()
  553. prop := self.parseIdentifier()
  554. if prop.Name == "target" {
  555. if !self.scope.inFunction {
  556. self.error(idx, "new.target expression is not allowed here")
  557. }
  558. return &ast.MetaProperty{
  559. Meta: &ast.Identifier{
  560. Name: unistring.String(token.NEW.String()),
  561. Idx: idx,
  562. },
  563. Property: prop,
  564. }
  565. }
  566. self.errorUnexpectedToken(token.IDENTIFIER)
  567. }
  568. callee := self.parseLeftHandSideExpression()
  569. node := &ast.NewExpression{
  570. New: idx,
  571. Callee: callee,
  572. }
  573. if self.token == token.LEFT_PARENTHESIS {
  574. argumentList, idx0, idx1 := self.parseArgumentList()
  575. node.ArgumentList = argumentList
  576. node.LeftParenthesis = idx0
  577. node.RightParenthesis = idx1
  578. }
  579. return node
  580. }
  581. func (self *_parser) parseLeftHandSideExpression() ast.Expression {
  582. var left ast.Expression
  583. if self.token == token.NEW {
  584. left = self.parseNewExpression()
  585. } else {
  586. left = self.parsePrimaryExpression()
  587. }
  588. L:
  589. for {
  590. switch self.token {
  591. case token.PERIOD:
  592. left = self.parseDotMember(left)
  593. case token.LEFT_BRACKET:
  594. left = self.parseBracketMember(left)
  595. case token.BACKTICK:
  596. left = self.parseTaggedTemplateLiteral(left)
  597. default:
  598. break L
  599. }
  600. }
  601. return left
  602. }
  603. func (self *_parser) parseLeftHandSideExpressionAllowCall() ast.Expression {
  604. allowIn := self.scope.allowIn
  605. self.scope.allowIn = true
  606. defer func() {
  607. self.scope.allowIn = allowIn
  608. }()
  609. var left ast.Expression
  610. if self.token == token.NEW {
  611. left = self.parseNewExpression()
  612. } else {
  613. left = self.parsePrimaryExpression()
  614. }
  615. L:
  616. for {
  617. switch self.token {
  618. case token.PERIOD:
  619. left = self.parseDotMember(left)
  620. case token.LEFT_BRACKET:
  621. left = self.parseBracketMember(left)
  622. case token.LEFT_PARENTHESIS:
  623. left = self.parseCallExpression(left)
  624. case token.BACKTICK:
  625. left = self.parseTaggedTemplateLiteral(left)
  626. default:
  627. break L
  628. }
  629. }
  630. return left
  631. }
  632. func (self *_parser) parsePostfixExpression() ast.Expression {
  633. operand := self.parseLeftHandSideExpressionAllowCall()
  634. switch self.token {
  635. case token.INCREMENT, token.DECREMENT:
  636. // Make sure there is no line terminator here
  637. if self.implicitSemicolon {
  638. break
  639. }
  640. tkn := self.token
  641. idx := self.idx
  642. self.next()
  643. switch operand.(type) {
  644. case *ast.Identifier, *ast.DotExpression, *ast.BracketExpression:
  645. default:
  646. self.error(idx, "Invalid left-hand side in assignment")
  647. self.nextStatement()
  648. return &ast.BadExpression{From: idx, To: self.idx}
  649. }
  650. return &ast.UnaryExpression{
  651. Operator: tkn,
  652. Idx: idx,
  653. Operand: operand,
  654. Postfix: true,
  655. }
  656. }
  657. return operand
  658. }
  659. func (self *_parser) parseUnaryExpression() ast.Expression {
  660. switch self.token {
  661. case token.PLUS, token.MINUS, token.NOT, token.BITWISE_NOT:
  662. fallthrough
  663. case token.DELETE, token.VOID, token.TYPEOF:
  664. tkn := self.token
  665. idx := self.idx
  666. self.next()
  667. return &ast.UnaryExpression{
  668. Operator: tkn,
  669. Idx: idx,
  670. Operand: self.parseUnaryExpression(),
  671. }
  672. case token.INCREMENT, token.DECREMENT:
  673. tkn := self.token
  674. idx := self.idx
  675. self.next()
  676. operand := self.parseUnaryExpression()
  677. switch operand.(type) {
  678. case *ast.Identifier, *ast.DotExpression, *ast.BracketExpression:
  679. default:
  680. self.error(idx, "Invalid left-hand side in assignment")
  681. self.nextStatement()
  682. return &ast.BadExpression{From: idx, To: self.idx}
  683. }
  684. return &ast.UnaryExpression{
  685. Operator: tkn,
  686. Idx: idx,
  687. Operand: operand,
  688. }
  689. }
  690. return self.parsePostfixExpression()
  691. }
  692. func (self *_parser) parseMultiplicativeExpression() ast.Expression {
  693. next := self.parseUnaryExpression
  694. left := next()
  695. for self.token == token.MULTIPLY || self.token == token.SLASH ||
  696. self.token == token.REMAINDER {
  697. tkn := self.token
  698. self.next()
  699. left = &ast.BinaryExpression{
  700. Operator: tkn,
  701. Left: left,
  702. Right: next(),
  703. }
  704. }
  705. return left
  706. }
  707. func (self *_parser) parseAdditiveExpression() ast.Expression {
  708. next := self.parseMultiplicativeExpression
  709. left := next()
  710. for self.token == token.PLUS || self.token == token.MINUS {
  711. tkn := self.token
  712. self.next()
  713. left = &ast.BinaryExpression{
  714. Operator: tkn,
  715. Left: left,
  716. Right: next(),
  717. }
  718. }
  719. return left
  720. }
  721. func (self *_parser) parseShiftExpression() ast.Expression {
  722. next := self.parseAdditiveExpression
  723. left := next()
  724. for self.token == token.SHIFT_LEFT || self.token == token.SHIFT_RIGHT ||
  725. self.token == token.UNSIGNED_SHIFT_RIGHT {
  726. tkn := self.token
  727. self.next()
  728. left = &ast.BinaryExpression{
  729. Operator: tkn,
  730. Left: left,
  731. Right: next(),
  732. }
  733. }
  734. return left
  735. }
  736. func (self *_parser) parseRelationalExpression() ast.Expression {
  737. next := self.parseShiftExpression
  738. left := next()
  739. allowIn := self.scope.allowIn
  740. self.scope.allowIn = true
  741. defer func() {
  742. self.scope.allowIn = allowIn
  743. }()
  744. switch self.token {
  745. case token.LESS, token.LESS_OR_EQUAL, token.GREATER, token.GREATER_OR_EQUAL:
  746. tkn := self.token
  747. self.next()
  748. return &ast.BinaryExpression{
  749. Operator: tkn,
  750. Left: left,
  751. Right: self.parseRelationalExpression(),
  752. Comparison: true,
  753. }
  754. case token.INSTANCEOF:
  755. tkn := self.token
  756. self.next()
  757. return &ast.BinaryExpression{
  758. Operator: tkn,
  759. Left: left,
  760. Right: self.parseRelationalExpression(),
  761. }
  762. case token.IN:
  763. if !allowIn {
  764. return left
  765. }
  766. tkn := self.token
  767. self.next()
  768. return &ast.BinaryExpression{
  769. Operator: tkn,
  770. Left: left,
  771. Right: self.parseRelationalExpression(),
  772. }
  773. }
  774. return left
  775. }
  776. func (self *_parser) parseEqualityExpression() ast.Expression {
  777. next := self.parseRelationalExpression
  778. left := next()
  779. for self.token == token.EQUAL || self.token == token.NOT_EQUAL ||
  780. self.token == token.STRICT_EQUAL || self.token == token.STRICT_NOT_EQUAL {
  781. tkn := self.token
  782. self.next()
  783. left = &ast.BinaryExpression{
  784. Operator: tkn,
  785. Left: left,
  786. Right: next(),
  787. Comparison: true,
  788. }
  789. }
  790. return left
  791. }
  792. func (self *_parser) parseBitwiseAndExpression() ast.Expression {
  793. next := self.parseEqualityExpression
  794. left := next()
  795. for self.token == token.AND {
  796. tkn := self.token
  797. self.next()
  798. left = &ast.BinaryExpression{
  799. Operator: tkn,
  800. Left: left,
  801. Right: next(),
  802. }
  803. }
  804. return left
  805. }
  806. func (self *_parser) parseBitwiseExclusiveOrExpression() ast.Expression {
  807. next := self.parseBitwiseAndExpression
  808. left := next()
  809. for self.token == token.EXCLUSIVE_OR {
  810. tkn := self.token
  811. self.next()
  812. left = &ast.BinaryExpression{
  813. Operator: tkn,
  814. Left: left,
  815. Right: next(),
  816. }
  817. }
  818. return left
  819. }
  820. func (self *_parser) parseBitwiseOrExpression() ast.Expression {
  821. next := self.parseBitwiseExclusiveOrExpression
  822. left := next()
  823. for self.token == token.OR {
  824. tkn := self.token
  825. self.next()
  826. left = &ast.BinaryExpression{
  827. Operator: tkn,
  828. Left: left,
  829. Right: next(),
  830. }
  831. }
  832. return left
  833. }
  834. func (self *_parser) parseLogicalAndExpression() ast.Expression {
  835. next := self.parseBitwiseOrExpression
  836. left := next()
  837. for self.token == token.LOGICAL_AND {
  838. tkn := self.token
  839. self.next()
  840. left = &ast.BinaryExpression{
  841. Operator: tkn,
  842. Left: left,
  843. Right: next(),
  844. }
  845. }
  846. return left
  847. }
  848. func (self *_parser) parseLogicalOrExpression() ast.Expression {
  849. next := self.parseLogicalAndExpression
  850. left := next()
  851. for self.token == token.LOGICAL_OR {
  852. tkn := self.token
  853. self.next()
  854. left = &ast.BinaryExpression{
  855. Operator: tkn,
  856. Left: left,
  857. Right: next(),
  858. }
  859. }
  860. return left
  861. }
  862. func (self *_parser) parseConditionalExpression() ast.Expression {
  863. left := self.parseLogicalOrExpression()
  864. if self.token == token.QUESTION_MARK {
  865. self.next()
  866. consequent := self.parseAssignmentExpression()
  867. self.expect(token.COLON)
  868. return &ast.ConditionalExpression{
  869. Test: left,
  870. Consequent: consequent,
  871. Alternate: self.parseAssignmentExpression(),
  872. }
  873. }
  874. return left
  875. }
  876. func (self *_parser) parseAssignmentExpression() ast.Expression {
  877. start := self.idx
  878. parenthesis := false
  879. var state parserState
  880. if self.token == token.LET {
  881. self.token = token.IDENTIFIER
  882. } else if self.token == token.LEFT_PARENTHESIS {
  883. self.mark(&state)
  884. parenthesis = true
  885. }
  886. left := self.parseConditionalExpression()
  887. var operator token.Token
  888. switch self.token {
  889. case token.ASSIGN:
  890. operator = self.token
  891. case token.ADD_ASSIGN:
  892. operator = token.PLUS
  893. case token.SUBTRACT_ASSIGN:
  894. operator = token.MINUS
  895. case token.MULTIPLY_ASSIGN:
  896. operator = token.MULTIPLY
  897. case token.QUOTIENT_ASSIGN:
  898. operator = token.SLASH
  899. case token.REMAINDER_ASSIGN:
  900. operator = token.REMAINDER
  901. case token.AND_ASSIGN:
  902. operator = token.AND
  903. case token.OR_ASSIGN:
  904. operator = token.OR
  905. case token.EXCLUSIVE_OR_ASSIGN:
  906. operator = token.EXCLUSIVE_OR
  907. case token.SHIFT_LEFT_ASSIGN:
  908. operator = token.SHIFT_LEFT
  909. case token.SHIFT_RIGHT_ASSIGN:
  910. operator = token.SHIFT_RIGHT
  911. case token.UNSIGNED_SHIFT_RIGHT_ASSIGN:
  912. operator = token.UNSIGNED_SHIFT_RIGHT
  913. case token.ARROW:
  914. var paramList *ast.ParameterList
  915. if id, ok := left.(*ast.Identifier); ok {
  916. paramList = &ast.ParameterList{
  917. Opening: id.Idx,
  918. Closing: id.Idx1(),
  919. List: []*ast.Binding{{
  920. Target: id,
  921. }},
  922. }
  923. } else if parenthesis {
  924. if seq, ok := left.(*ast.SequenceExpression); ok && len(self.errors) == 0 {
  925. paramList = self.reinterpretSequenceAsArrowFuncParams(seq)
  926. } else {
  927. self.restore(&state)
  928. paramList = self.parseFunctionParameterList()
  929. }
  930. } else {
  931. self.error(left.Idx0(), "Malformed arrow function parameter list")
  932. return &ast.BadExpression{From: left.Idx0(), To: left.Idx1()}
  933. }
  934. self.expect(token.ARROW)
  935. node := &ast.ArrowFunctionLiteral{
  936. Start: start,
  937. ParameterList: paramList,
  938. }
  939. node.Body, node.DeclarationList = self.parseArrowFunctionBody()
  940. node.Source = self.slice(node.Start, node.Body.Idx1())
  941. return node
  942. }
  943. if operator != 0 {
  944. idx := self.idx
  945. self.next()
  946. ok := false
  947. switch l := left.(type) {
  948. case *ast.Identifier, *ast.DotExpression, *ast.BracketExpression:
  949. ok = true
  950. case *ast.ArrayLiteral:
  951. if !parenthesis && operator == token.ASSIGN {
  952. left = self.reinterpretAsArrayAssignmentPattern(l)
  953. ok = true
  954. }
  955. case *ast.ObjectLiteral:
  956. if !parenthesis && operator == token.ASSIGN {
  957. left = self.reinterpretAsObjectAssignmentPattern(l)
  958. ok = true
  959. }
  960. }
  961. if ok {
  962. return &ast.AssignExpression{
  963. Left: left,
  964. Operator: operator,
  965. Right: self.parseAssignmentExpression(),
  966. }
  967. }
  968. self.error(left.Idx0(), "Invalid left-hand side in assignment")
  969. self.nextStatement()
  970. return &ast.BadExpression{From: idx, To: self.idx}
  971. }
  972. return left
  973. }
  974. func (self *_parser) parseExpression() ast.Expression {
  975. if self.token == token.LET {
  976. self.token = token.IDENTIFIER
  977. }
  978. next := self.parseAssignmentExpression
  979. left := next()
  980. if self.token == token.COMMA {
  981. sequence := []ast.Expression{left}
  982. for {
  983. if self.token != token.COMMA {
  984. break
  985. }
  986. self.next()
  987. sequence = append(sequence, next())
  988. }
  989. return &ast.SequenceExpression{
  990. Sequence: sequence,
  991. }
  992. }
  993. return left
  994. }
  995. func (self *_parser) checkComma(from, to file.Idx) {
  996. if pos := strings.IndexByte(self.str[int(from)-self.base:int(to)-self.base], ','); pos >= 0 {
  997. self.error(from+file.Idx(pos), "Comma is not allowed here")
  998. }
  999. }
  1000. func (self *_parser) reinterpretAsArrayAssignmentPattern(left *ast.ArrayLiteral) ast.Expression {
  1001. value := left.Value
  1002. var rest ast.Expression
  1003. for i, item := range value {
  1004. if spread, ok := item.(*ast.SpreadElement); ok {
  1005. if i != len(value)-1 {
  1006. self.error(item.Idx0(), "Rest element must be last element")
  1007. return &ast.BadExpression{From: left.Idx0(), To: left.Idx1()}
  1008. }
  1009. self.checkComma(spread.Expression.Idx1(), left.RightBracket)
  1010. rest = self.reinterpretAsDestructAssignTarget(spread.Expression)
  1011. value = value[:len(value)-1]
  1012. } else {
  1013. value[i] = self.reinterpretAsAssignmentElement(item)
  1014. }
  1015. }
  1016. return &ast.ArrayPattern{
  1017. LeftBracket: left.LeftBracket,
  1018. RightBracket: left.RightBracket,
  1019. Elements: value,
  1020. Rest: rest,
  1021. }
  1022. }
  1023. func (self *_parser) reinterpretArrayAssignPatternAsBinding(pattern *ast.ArrayPattern) *ast.ArrayPattern {
  1024. for i, item := range pattern.Elements {
  1025. pattern.Elements[i] = self.reinterpretAsDestructBindingTarget(item)
  1026. }
  1027. if pattern.Rest != nil {
  1028. pattern.Rest = self.reinterpretAsDestructBindingTarget(pattern.Rest)
  1029. }
  1030. return pattern
  1031. }
  1032. func (self *_parser) reinterpretAsArrayBindingPattern(left *ast.ArrayLiteral) ast.BindingTarget {
  1033. value := left.Value
  1034. var rest ast.Expression
  1035. for i, item := range value {
  1036. if spread, ok := item.(*ast.SpreadElement); ok {
  1037. if i != len(value)-1 {
  1038. self.error(item.Idx0(), "Rest element must be last element")
  1039. return &ast.BadExpression{From: left.Idx0(), To: left.Idx1()}
  1040. }
  1041. self.checkComma(spread.Expression.Idx1(), left.RightBracket)
  1042. rest = self.reinterpretAsDestructBindingTarget(spread.Expression)
  1043. value = value[:len(value)-1]
  1044. } else {
  1045. value[i] = self.reinterpretAsBindingElement(item)
  1046. }
  1047. }
  1048. return &ast.ArrayPattern{
  1049. LeftBracket: left.LeftBracket,
  1050. RightBracket: left.RightBracket,
  1051. Elements: value,
  1052. Rest: rest,
  1053. }
  1054. }
  1055. func (self *_parser) parseArrayBindingPattern() ast.BindingTarget {
  1056. return self.reinterpretAsArrayBindingPattern(self.parseArrayLiteral())
  1057. }
  1058. func (self *_parser) parseObjectBindingPattern() ast.BindingTarget {
  1059. return self.reinterpretAsObjectBindingPattern(self.parseObjectLiteral())
  1060. }
  1061. func (self *_parser) reinterpretArrayObjectPatternAsBinding(pattern *ast.ObjectPattern) *ast.ObjectPattern {
  1062. for _, prop := range pattern.Properties {
  1063. if keyed, ok := prop.(*ast.PropertyKeyed); ok {
  1064. keyed.Value = self.reinterpretAsBindingElement(keyed.Value)
  1065. }
  1066. }
  1067. if pattern.Rest != nil {
  1068. pattern.Rest = self.reinterpretAsBindingRestElement(pattern.Rest)
  1069. }
  1070. return pattern
  1071. }
  1072. func (self *_parser) reinterpretAsObjectBindingPattern(expr *ast.ObjectLiteral) ast.BindingTarget {
  1073. var rest ast.Expression
  1074. value := expr.Value
  1075. for i, prop := range value {
  1076. ok := false
  1077. switch prop := prop.(type) {
  1078. case *ast.PropertyKeyed:
  1079. if prop.Kind == ast.PropertyKindValue {
  1080. prop.Value = self.reinterpretAsBindingElement(prop.Value)
  1081. ok = true
  1082. }
  1083. case *ast.PropertyShort:
  1084. ok = true
  1085. case *ast.SpreadElement:
  1086. if i != len(expr.Value)-1 {
  1087. self.error(prop.Idx0(), "Rest element must be last element")
  1088. return &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()}
  1089. }
  1090. // TODO make sure there is no trailing comma
  1091. rest = self.reinterpretAsBindingRestElement(prop.Expression)
  1092. value = value[:i]
  1093. ok = true
  1094. }
  1095. if !ok {
  1096. self.error(prop.Idx0(), "Invalid destructuring binding target")
  1097. return &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()}
  1098. }
  1099. }
  1100. return &ast.ObjectPattern{
  1101. LeftBrace: expr.LeftBrace,
  1102. RightBrace: expr.RightBrace,
  1103. Properties: value,
  1104. Rest: rest,
  1105. }
  1106. }
  1107. func (self *_parser) reinterpretAsObjectAssignmentPattern(l *ast.ObjectLiteral) ast.Expression {
  1108. var rest ast.Expression
  1109. value := l.Value
  1110. for i, prop := range value {
  1111. ok := false
  1112. switch prop := prop.(type) {
  1113. case *ast.PropertyKeyed:
  1114. if prop.Kind == ast.PropertyKindValue {
  1115. prop.Value = self.reinterpretAsAssignmentElement(prop.Value)
  1116. ok = true
  1117. }
  1118. case *ast.PropertyShort:
  1119. ok = true
  1120. case *ast.SpreadElement:
  1121. if i != len(l.Value)-1 {
  1122. self.error(prop.Idx0(), "Rest element must be last element")
  1123. return &ast.BadExpression{From: l.Idx0(), To: l.Idx1()}
  1124. }
  1125. // TODO make sure there is no trailing comma
  1126. rest = prop.Expression
  1127. value = value[:i]
  1128. ok = true
  1129. }
  1130. if !ok {
  1131. self.error(prop.Idx0(), "Invalid destructuring assignment target")
  1132. return &ast.BadExpression{From: l.Idx0(), To: l.Idx1()}
  1133. }
  1134. }
  1135. return &ast.ObjectPattern{
  1136. LeftBrace: l.LeftBrace,
  1137. RightBrace: l.RightBrace,
  1138. Properties: value,
  1139. Rest: rest,
  1140. }
  1141. }
  1142. func (self *_parser) reinterpretAsAssignmentElement(expr ast.Expression) ast.Expression {
  1143. switch expr := expr.(type) {
  1144. case *ast.AssignExpression:
  1145. if expr.Operator == token.ASSIGN {
  1146. expr.Left = self.reinterpretAsDestructAssignTarget(expr.Left)
  1147. return expr
  1148. } else {
  1149. self.error(expr.Idx0(), "Invalid destructuring assignment target")
  1150. return &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()}
  1151. }
  1152. default:
  1153. return self.reinterpretAsDestructAssignTarget(expr)
  1154. }
  1155. }
  1156. func (self *_parser) reinterpretAsBindingElement(expr ast.Expression) ast.Expression {
  1157. switch expr := expr.(type) {
  1158. case *ast.AssignExpression:
  1159. if expr.Operator == token.ASSIGN {
  1160. expr.Left = self.reinterpretAsDestructBindingTarget(expr.Left)
  1161. return expr
  1162. } else {
  1163. self.error(expr.Idx0(), "Invalid destructuring assignment target")
  1164. return &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()}
  1165. }
  1166. default:
  1167. return self.reinterpretAsDestructBindingTarget(expr)
  1168. }
  1169. }
  1170. func (self *_parser) reinterpretAsBinding(expr ast.Expression) *ast.Binding {
  1171. switch expr := expr.(type) {
  1172. case *ast.AssignExpression:
  1173. if expr.Operator == token.ASSIGN {
  1174. return &ast.Binding{
  1175. Target: self.reinterpretAsDestructBindingTarget(expr.Left),
  1176. Initializer: expr.Right,
  1177. }
  1178. } else {
  1179. self.error(expr.Idx0(), "Invalid destructuring assignment target")
  1180. return &ast.Binding{
  1181. Target: &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()},
  1182. }
  1183. }
  1184. default:
  1185. return &ast.Binding{
  1186. Target: self.reinterpretAsDestructBindingTarget(expr),
  1187. }
  1188. }
  1189. }
  1190. func (self *_parser) reinterpretAsDestructAssignTarget(item ast.Expression) ast.Expression {
  1191. switch item := item.(type) {
  1192. case nil:
  1193. return nil
  1194. case *ast.ArrayLiteral:
  1195. return self.reinterpretAsArrayAssignmentPattern(item)
  1196. case *ast.ObjectLiteral:
  1197. return self.reinterpretAsObjectAssignmentPattern(item)
  1198. case ast.Pattern, *ast.Identifier, *ast.DotExpression, *ast.BracketExpression:
  1199. return item
  1200. }
  1201. self.error(item.Idx0(), "Invalid destructuring assignment target")
  1202. return &ast.BadExpression{From: item.Idx0(), To: item.Idx1()}
  1203. }
  1204. func (self *_parser) reinterpretAsDestructBindingTarget(item ast.Expression) ast.BindingTarget {
  1205. switch item := item.(type) {
  1206. case nil:
  1207. return nil
  1208. case *ast.ArrayPattern:
  1209. return self.reinterpretArrayAssignPatternAsBinding(item)
  1210. case *ast.ObjectPattern:
  1211. return self.reinterpretArrayObjectPatternAsBinding(item)
  1212. case *ast.ArrayLiteral:
  1213. return self.reinterpretAsArrayBindingPattern(item)
  1214. case *ast.ObjectLiteral:
  1215. return self.reinterpretAsObjectBindingPattern(item)
  1216. case *ast.Identifier:
  1217. return item
  1218. }
  1219. self.error(item.Idx0(), "Invalid destructuring binding target")
  1220. return &ast.BadExpression{From: item.Idx0(), To: item.Idx1()}
  1221. }
  1222. func (self *_parser) reinterpretAsBindingRestElement(expr ast.Expression) ast.Expression {
  1223. if _, ok := expr.(*ast.Identifier); ok {
  1224. return expr
  1225. }
  1226. self.error(expr.Idx0(), "Invalid binding rest")
  1227. return &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()}
  1228. }