PageRenderTime 47ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/kdelibs-4.8.97/kjs/grammar.y

#
Happy | 896 lines | 767 code | 129 blank | 0 comment | 0 complexity | 502b0583f6bcc317af4d80ec45ef8cfc MD5 | raw file
Possible License(s): GPL-2.0, CC-BY-SA-3.0, LGPL-2.1, GPL-3.0, LGPL-2.0, LGPL-3.0
  1. %{
  2. /*
  3. * This file is part of the KDE libraries
  4. * Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
  5. * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
  6. *
  7. * This library is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2 of the License, or (at your option) any later version.
  11. *
  12. * This library is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this library; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. *
  21. */
  22. #include "config.h"
  23. #include <string.h>
  24. #include <stdlib.h>
  25. #include "value.h"
  26. #include "object.h"
  27. #include "types.h"
  28. #include "interpreter.h"
  29. #include "nodes.h"
  30. #include "makenodes.h"
  31. #include "lexer.h"
  32. #include "internal.h"
  33. // Not sure why, but yacc doesn't add this define along with the others.
  34. #define yylloc kjsyylloc
  35. /* default values for bison */
  36. #define YYDEBUG 0 // Set to 1 to debug a parse error.
  37. #define kjsyydebug 0 // Set to 1 to debug a parse error.
  38. #if !PLATFORM(DARWIN)
  39. // avoid triggering warnings in older bison
  40. #define YYERROR_VERBOSE
  41. #endif
  42. extern int kjsyylex();
  43. int kjsyyerror(const char *);
  44. static bool allowAutomaticSemicolon();
  45. #define AUTO_SEMICOLON do { if (!allowAutomaticSemicolon()) YYABORT; } while (0)
  46. #define DBG(l, s, e) (l)->setLoc((s).first_line, (e).last_line)
  47. using namespace KJS;
  48. %}
  49. %union {
  50. int ival;
  51. double dval;
  52. UString *ustr;
  53. Identifier *ident;
  54. Node *node;
  55. StatementNode *stat;
  56. ParameterNode *param;
  57. FunctionBodyNode *body;
  58. FuncDeclNode *func;
  59. FuncExprNode *funcExpr;
  60. ProgramNode *prog;
  61. AssignExprNode *init;
  62. SourceElementsNode *srcs;
  63. ArgumentsNode *args;
  64. ArgumentListNode *alist;
  65. VarDeclNode *decl;
  66. VarDeclListNode *vlist;
  67. CaseBlockNode *cblk;
  68. ClauseListNode *clist;
  69. CaseClauseNode *ccl;
  70. ElementNode *elm;
  71. Operator op;
  72. PropertyListNode *plist;
  73. PropertyNode *pnode;
  74. PropertyNameNode *pname;
  75. PackageNameNode *pkgn;
  76. }
  77. %start Program
  78. /* literals */
  79. %token NULLTOKEN TRUETOKEN FALSETOKEN
  80. /* keywords */
  81. %token BREAK CASE DEFAULT FOR NEW VAR CONSTTOKEN CONTINUE
  82. %token FUNCTION RETURN VOIDTOKEN DELETETOKEN
  83. %token IF THISTOKEN DO WHILE INTOKEN INSTANCEOF TYPEOF
  84. %token SWITCH WITH RESERVED
  85. %token THROW TRY CATCH FINALLY
  86. %token DEBUGGER IMPORT
  87. /* give an if without an else higher precedence than an else to resolve the ambiguity */
  88. %nonassoc IF_WITHOUT_ELSE
  89. %nonassoc ELSE
  90. /* punctuators */
  91. %token EQEQ NE /* == and != */
  92. %token STREQ STRNEQ /* === and !== */
  93. %token LE GE /* < and > */
  94. %token OR AND /* || and && */
  95. %token PLUSPLUS MINUSMINUS /* ++ and -- */
  96. %token LSHIFT /* << */
  97. %token RSHIFT URSHIFT /* >> and >>> */
  98. %token PLUSEQUAL MINUSEQUAL /* += and -= */
  99. %token MULTEQUAL DIVEQUAL /* *= and /= */
  100. %token LSHIFTEQUAL /* <<= */
  101. %token RSHIFTEQUAL URSHIFTEQUAL /* >>= and >>>= */
  102. %token ANDEQUAL MODEQUAL /* &= and %= */
  103. %token XOREQUAL OREQUAL /* ^= and |= */
  104. /* terminal types */
  105. %token <dval> NUMBER
  106. %token <ustr> STRING
  107. %token <ident> IDENT
  108. /* automatically inserted semicolon */
  109. %token AUTOPLUSPLUS AUTOMINUSMINUS
  110. /* non-terminal types */
  111. %type <node> Literal ArrayLiteral
  112. %type <node> PrimaryExpr PrimaryExprNoBrace
  113. %type <node> MemberExpr MemberExprNoBF /* BF => brace or function */
  114. %type <node> NewExpr NewExprNoBF
  115. %type <node> CallExpr CallExprNoBF
  116. %type <node> LeftHandSideExpr LeftHandSideExprNoBF
  117. %type <node> PostfixExpr PostfixExprNoBF
  118. %type <node> UnaryExpr UnaryExprNoBF UnaryExprCommon
  119. %type <node> MultiplicativeExpr MultiplicativeExprNoBF
  120. %type <node> AdditiveExpr AdditiveExprNoBF
  121. %type <node> ShiftExpr ShiftExprNoBF
  122. %type <node> RelationalExpr RelationalExprNoIn RelationalExprNoBF
  123. %type <node> EqualityExpr EqualityExprNoIn EqualityExprNoBF
  124. %type <node> BitwiseANDExpr BitwiseANDExprNoIn BitwiseANDExprNoBF
  125. %type <node> BitwiseXORExpr BitwiseXORExprNoIn BitwiseXORExprNoBF
  126. %type <node> BitwiseORExpr BitwiseORExprNoIn BitwiseORExprNoBF
  127. %type <node> LogicalANDExpr LogicalANDExprNoIn LogicalANDExprNoBF
  128. %type <node> LogicalORExpr LogicalORExprNoIn LogicalORExprNoBF
  129. %type <node> ConditionalExpr ConditionalExprNoIn ConditionalExprNoBF
  130. %type <node> AssignmentExpr AssignmentExprNoIn AssignmentExprNoBF
  131. %type <node> Expr ExprNoIn ExprNoBF
  132. %type <node> ExprOpt ExprNoInOpt
  133. %type <stat> Statement Block
  134. %type <stat> VariableStatement ConstStatement EmptyStatement ExprStatement
  135. %type <stat> IfStatement IterationStatement ContinueStatement
  136. %type <stat> BreakStatement ReturnStatement WithStatement
  137. %type <stat> SwitchStatement LabelledStatement
  138. %type <stat> ThrowStatement TryStatement
  139. %type <stat> DebuggerStatement ImportStatement
  140. %type <stat> SourceElement
  141. %type <init> Initializer InitializerNoIn
  142. %type <func> FunctionDeclaration
  143. %type <funcExpr> FunctionExpr
  144. %type <body> FunctionBody
  145. %type <srcs> SourceElements
  146. %type <param> FormalParameterList
  147. %type <op> AssignmentOperator
  148. %type <args> Arguments
  149. %type <alist> ArgumentList
  150. %type <vlist> VariableDeclarationList VariableDeclarationListNoIn ConstDeclarationList
  151. %type <decl> VariableDeclaration VariableDeclarationNoIn ConstDeclaration
  152. %type <cblk> CaseBlock
  153. %type <ccl> CaseClause DefaultClause
  154. %type <clist> CaseClauses CaseClausesOpt
  155. %type <ival> Elision ElisionOpt
  156. %type <elm> ElementList
  157. %type <pname> PropertyName
  158. %type <pnode> Property
  159. %type <plist> PropertyList
  160. %type <pkgn> PackageName
  161. %%
  162. Literal:
  163. NULLTOKEN { $$ = new NullNode(); }
  164. | TRUETOKEN { $$ = new BooleanNode(true); }
  165. | FALSETOKEN { $$ = new BooleanNode(false); }
  166. | NUMBER { $$ = new NumberNode($1); }
  167. | STRING { $$ = new StringNode($1); }
  168. | '/' /* regexp */ {
  169. Lexer& l = lexer();
  170. if (!l.scanRegExp())
  171. YYABORT;
  172. $$ = new RegExpNode(l.pattern(), l.flags());
  173. }
  174. | DIVEQUAL /* regexp with /= */ {
  175. Lexer& l = lexer();
  176. if (!l.scanRegExp())
  177. YYABORT;
  178. $$ = new RegExpNode("=" + l.pattern(), l.flags());
  179. }
  180. ;
  181. PropertyName:
  182. IDENT { $$ = new PropertyNameNode(*$1); }
  183. | STRING { $$ = new PropertyNameNode(Identifier(*$1)); }
  184. | NUMBER { $$ = new PropertyNameNode(Identifier(UString::from($1))); }
  185. ;
  186. Property:
  187. PropertyName ':' AssignmentExpr { $$ = new PropertyNode($1, $3, PropertyNode::Constant); }
  188. | IDENT IDENT '(' ')' {inFuncExpr()} FunctionBody {
  189. if (!makeGetterOrSetterPropertyNode($$, *$1, *$2, 0, $6))
  190. YYABORT;
  191. }
  192. | IDENT IDENT '(' FormalParameterList ')' {inFuncExpr()} FunctionBody {
  193. if (!makeGetterOrSetterPropertyNode($$, *$1, *$2, $4, $7))
  194. YYABORT;
  195. }
  196. ;
  197. PropertyList:
  198. Property { $$ = new PropertyListNode($1); }
  199. | PropertyList ',' Property { $$ = new PropertyListNode($3, $1); }
  200. ;
  201. PrimaryExpr:
  202. PrimaryExprNoBrace
  203. | '{' '}' { $$ = new ObjectLiteralNode(); }
  204. | '{' PropertyList '}' { $$ = new ObjectLiteralNode($2); }
  205. /* allow extra comma, see http://bugs.webkit.org/show_bug.cgi?id=5939 */
  206. | '{' PropertyList ',' '}' { $$ = new ObjectLiteralNode($2); }
  207. ;
  208. PrimaryExprNoBrace:
  209. THISTOKEN { $$ = new ThisNode(); }
  210. | Literal
  211. | ArrayLiteral
  212. | IDENT { $$ = new VarAccessNode(*$1); }
  213. | '(' Expr ')' { $$ = makeGroupNode($2); }
  214. ;
  215. ArrayLiteral:
  216. '[' ElisionOpt ']' { $$ = new ArrayNode($2); }
  217. | '[' ElementList ']' { $$ = new ArrayNode($2); }
  218. | '[' ElementList ',' ElisionOpt ']' { $$ = new ArrayNode($4, $2); }
  219. ;
  220. ElementList:
  221. ElisionOpt AssignmentExpr { $$ = new ElementNode($1, $2); }
  222. | ElementList ',' ElisionOpt AssignmentExpr
  223. { $$ = new ElementNode($1, $3, $4); }
  224. ;
  225. ElisionOpt:
  226. /* nothing */ { $$ = 0; }
  227. | Elision
  228. ;
  229. Elision:
  230. ',' { $$ = 1; }
  231. | Elision ',' { $$ = $1 + 1; }
  232. ;
  233. MemberExpr:
  234. PrimaryExpr
  235. | FunctionExpr { $$ = $1; }
  236. | MemberExpr '[' Expr ']' { $$ = new BracketAccessorNode($1, $3); }
  237. | MemberExpr '.' IDENT { $$ = new DotAccessorNode($1, *$3); }
  238. | NEW MemberExpr Arguments { $$ = new NewExprNode($2, $3); }
  239. ;
  240. MemberExprNoBF:
  241. PrimaryExprNoBrace
  242. | MemberExprNoBF '[' Expr ']' { $$ = new BracketAccessorNode($1, $3); }
  243. | MemberExprNoBF '.' IDENT { $$ = new DotAccessorNode($1, *$3); }
  244. | NEW MemberExpr Arguments { $$ = new NewExprNode($2, $3); }
  245. ;
  246. NewExpr:
  247. MemberExpr
  248. | NEW NewExpr { $$ = new NewExprNode($2); }
  249. ;
  250. NewExprNoBF:
  251. MemberExprNoBF
  252. | NEW NewExpr { $$ = new NewExprNode($2); }
  253. ;
  254. CallExpr:
  255. MemberExpr Arguments { $$ = makeFunctionCallNode($1, $2); }
  256. | CallExpr Arguments { $$ = makeFunctionCallNode($1, $2); }
  257. | CallExpr '[' Expr ']' { $$ = new BracketAccessorNode($1, $3); }
  258. | CallExpr '.' IDENT { $$ = new DotAccessorNode($1, *$3); }
  259. ;
  260. CallExprNoBF:
  261. MemberExprNoBF Arguments { $$ = makeFunctionCallNode($1, $2); }
  262. | CallExprNoBF Arguments { $$ = makeFunctionCallNode($1, $2); }
  263. | CallExprNoBF '[' Expr ']' { $$ = new BracketAccessorNode($1, $3); }
  264. | CallExprNoBF '.' IDENT { $$ = new DotAccessorNode($1, *$3); }
  265. ;
  266. Arguments:
  267. '(' ')' { $$ = new ArgumentsNode(); }
  268. | '(' ArgumentList ')' { $$ = new ArgumentsNode($2); }
  269. ;
  270. ArgumentList:
  271. AssignmentExpr { $$ = new ArgumentListNode($1); }
  272. | ArgumentList ',' AssignmentExpr { $$ = new ArgumentListNode($1, $3); }
  273. ;
  274. LeftHandSideExpr:
  275. NewExpr
  276. | CallExpr
  277. ;
  278. LeftHandSideExprNoBF:
  279. NewExprNoBF
  280. | CallExprNoBF
  281. ;
  282. PostfixExpr:
  283. LeftHandSideExpr
  284. | LeftHandSideExpr PLUSPLUS { $$ = makePostfixNode($1, OpPlusPlus); }
  285. | LeftHandSideExpr MINUSMINUS { $$ = makePostfixNode($1, OpMinusMinus); }
  286. ;
  287. PostfixExprNoBF:
  288. LeftHandSideExprNoBF
  289. | LeftHandSideExprNoBF PLUSPLUS { $$ = makePostfixNode($1, OpPlusPlus); }
  290. | LeftHandSideExprNoBF MINUSMINUS { $$ = makePostfixNode($1, OpMinusMinus); }
  291. ;
  292. UnaryExprCommon:
  293. DELETETOKEN UnaryExpr { $$ = makeDeleteNode($2); }
  294. | VOIDTOKEN UnaryExpr { $$ = new VoidNode($2); }
  295. | TYPEOF UnaryExpr { $$ = makeTypeOfNode($2); }
  296. | PLUSPLUS UnaryExpr { $$ = makePrefixNode($2, OpPlusPlus); }
  297. | AUTOPLUSPLUS UnaryExpr { $$ = makePrefixNode($2, OpPlusPlus); }
  298. | MINUSMINUS UnaryExpr { $$ = makePrefixNode($2, OpMinusMinus); }
  299. | AUTOMINUSMINUS UnaryExpr { $$ = makePrefixNode($2, OpMinusMinus); }
  300. | '+' UnaryExpr { $$ = makeUnaryPlusNode($2); }
  301. | '-' UnaryExpr { $$ = makeNegateNode($2); }
  302. | '~' UnaryExpr { $$ = makeBitwiseNotNode($2); }
  303. | '!' UnaryExpr { $$ = makeLogicalNotNode($2); }
  304. UnaryExpr:
  305. PostfixExpr
  306. | UnaryExprCommon
  307. ;
  308. UnaryExprNoBF:
  309. PostfixExprNoBF
  310. | UnaryExprCommon
  311. ;
  312. MultiplicativeExpr:
  313. UnaryExpr
  314. | MultiplicativeExpr '*' UnaryExpr { $$ = makeMultNode($1, $3, OpMult); }
  315. | MultiplicativeExpr '/' UnaryExpr { $$ = makeMultNode($1, $3, OpDiv); }
  316. | MultiplicativeExpr '%' UnaryExpr { $$ = makeMultNode($1, $3, OpMod); }
  317. ;
  318. MultiplicativeExprNoBF:
  319. UnaryExprNoBF
  320. | MultiplicativeExprNoBF '*' UnaryExpr
  321. { $$ = makeMultNode($1, $3, OpMult); }
  322. | MultiplicativeExprNoBF '/' UnaryExpr
  323. { $$ = makeMultNode($1, $3, OpDiv); }
  324. | MultiplicativeExprNoBF '%' UnaryExpr
  325. { $$ = makeMultNode($1, $3, OpMod); }
  326. ;
  327. AdditiveExpr:
  328. MultiplicativeExpr
  329. | AdditiveExpr '+' MultiplicativeExpr { $$ = makeAddNode($1, $3, OpPlus); }
  330. | AdditiveExpr '-' MultiplicativeExpr { $$ = makeAddNode($1, $3, OpMinus); }
  331. ;
  332. AdditiveExprNoBF:
  333. MultiplicativeExprNoBF
  334. | AdditiveExprNoBF '+' MultiplicativeExpr
  335. { $$ = makeAddNode($1, $3, OpPlus); }
  336. | AdditiveExprNoBF '-' MultiplicativeExpr
  337. { $$ = makeAddNode($1, $3, OpMinus); }
  338. ;
  339. ShiftExpr:
  340. AdditiveExpr
  341. | ShiftExpr LSHIFT AdditiveExpr { $$ = makeShiftNode($1, $3, OpLShift); }
  342. | ShiftExpr RSHIFT AdditiveExpr { $$ = makeShiftNode($1, $3, OpRShift); }
  343. | ShiftExpr URSHIFT AdditiveExpr { $$ = makeShiftNode($1, $3, OpURShift); }
  344. ;
  345. ShiftExprNoBF:
  346. AdditiveExprNoBF
  347. | ShiftExprNoBF LSHIFT AdditiveExpr { $$ = makeShiftNode($1, $3, OpLShift); }
  348. | ShiftExprNoBF RSHIFT AdditiveExpr { $$ = makeShiftNode($1, $3, OpRShift); }
  349. | ShiftExprNoBF URSHIFT AdditiveExpr { $$ = makeShiftNode($1, $3, OpURShift); }
  350. ;
  351. RelationalExpr:
  352. ShiftExpr
  353. | RelationalExpr '<' ShiftExpr { $$ = makeRelationalNode($1, OpLess, $3); }
  354. | RelationalExpr '>' ShiftExpr { $$ = makeRelationalNode($1, OpGreater, $3); }
  355. | RelationalExpr LE ShiftExpr { $$ = makeRelationalNode($1, OpLessEq, $3); }
  356. | RelationalExpr GE ShiftExpr { $$ = makeRelationalNode($1, OpGreaterEq, $3); }
  357. | RelationalExpr INSTANCEOF ShiftExpr { $$ = makeRelationalNode($1, OpInstanceOf, $3); }
  358. | RelationalExpr INTOKEN ShiftExpr { $$ = makeRelationalNode($1, OpIn, $3); }
  359. ;
  360. RelationalExprNoIn:
  361. ShiftExpr
  362. | RelationalExprNoIn '<' ShiftExpr { $$ = makeRelationalNode($1, OpLess, $3); }
  363. | RelationalExprNoIn '>' ShiftExpr { $$ = makeRelationalNode($1, OpGreater, $3); }
  364. | RelationalExprNoIn LE ShiftExpr { $$ = makeRelationalNode($1, OpLessEq, $3); }
  365. | RelationalExprNoIn GE ShiftExpr { $$ = makeRelationalNode($1, OpGreaterEq, $3); }
  366. | RelationalExprNoIn INSTANCEOF ShiftExpr
  367. { $$ = makeRelationalNode($1, OpInstanceOf, $3); }
  368. ;
  369. RelationalExprNoBF:
  370. ShiftExprNoBF
  371. | RelationalExprNoBF '<' ShiftExpr { $$ = makeRelationalNode($1, OpLess, $3); }
  372. | RelationalExprNoBF '>' ShiftExpr { $$ = makeRelationalNode($1, OpGreater, $3); }
  373. | RelationalExprNoBF LE ShiftExpr { $$ = makeRelationalNode($1, OpLessEq, $3); }
  374. | RelationalExprNoBF GE ShiftExpr { $$ = makeRelationalNode($1, OpGreaterEq, $3); }
  375. | RelationalExprNoBF INSTANCEOF ShiftExpr
  376. { $$ = makeRelationalNode($1, OpInstanceOf, $3); }
  377. | RelationalExprNoBF INTOKEN ShiftExpr { $$ = makeRelationalNode($1, OpIn, $3); }
  378. ;
  379. EqualityExpr:
  380. RelationalExpr
  381. | EqualityExpr EQEQ RelationalExpr { $$ = makeEqualNode($1, OpEqEq, $3); }
  382. | EqualityExpr NE RelationalExpr { $$ = makeEqualNode($1, OpNotEq, $3); }
  383. | EqualityExpr STREQ RelationalExpr { $$ = makeEqualNode($1, OpStrEq, $3); }
  384. | EqualityExpr STRNEQ RelationalExpr { $$ = makeEqualNode($1, OpStrNEq, $3);}
  385. ;
  386. EqualityExprNoIn:
  387. RelationalExprNoIn
  388. | EqualityExprNoIn EQEQ RelationalExprNoIn
  389. { $$ = makeEqualNode($1, OpEqEq, $3); }
  390. | EqualityExprNoIn NE RelationalExprNoIn
  391. { $$ = makeEqualNode($1, OpNotEq, $3); }
  392. | EqualityExprNoIn STREQ RelationalExprNoIn
  393. { $$ = makeEqualNode($1, OpStrEq, $3); }
  394. | EqualityExprNoIn STRNEQ RelationalExprNoIn
  395. { $$ = makeEqualNode($1, OpStrNEq, $3);}
  396. ;
  397. EqualityExprNoBF:
  398. RelationalExprNoBF
  399. | EqualityExprNoBF EQEQ RelationalExpr
  400. { $$ = makeEqualNode($1, OpEqEq, $3); }
  401. | EqualityExprNoBF NE RelationalExpr { $$ = makeEqualNode($1, OpNotEq, $3); }
  402. | EqualityExprNoBF STREQ RelationalExpr
  403. { $$ = makeEqualNode($1, OpStrEq, $3); }
  404. | EqualityExprNoBF STRNEQ RelationalExpr
  405. { $$ = makeEqualNode($1, OpStrNEq, $3);}
  406. ;
  407. BitwiseANDExpr:
  408. EqualityExpr
  409. | BitwiseANDExpr '&' EqualityExpr { $$ = makeBitOperNode($1, OpBitAnd, $3); }
  410. ;
  411. BitwiseANDExprNoIn:
  412. EqualityExprNoIn
  413. | BitwiseANDExprNoIn '&' EqualityExprNoIn
  414. { $$ = makeBitOperNode($1, OpBitAnd, $3); }
  415. ;
  416. BitwiseANDExprNoBF:
  417. EqualityExprNoBF
  418. | BitwiseANDExprNoBF '&' EqualityExpr { $$ = makeBitOperNode($1, OpBitAnd, $3); }
  419. ;
  420. BitwiseXORExpr:
  421. BitwiseANDExpr
  422. | BitwiseXORExpr '^' BitwiseANDExpr { $$ = makeBitOperNode($1, OpBitXOr, $3); }
  423. ;
  424. BitwiseXORExprNoIn:
  425. BitwiseANDExprNoIn
  426. | BitwiseXORExprNoIn '^' BitwiseANDExprNoIn
  427. { $$ = makeBitOperNode($1, OpBitXOr, $3); }
  428. ;
  429. BitwiseXORExprNoBF:
  430. BitwiseANDExprNoBF
  431. | BitwiseXORExprNoBF '^' BitwiseANDExpr
  432. { $$ = makeBitOperNode($1, OpBitXOr, $3); }
  433. ;
  434. BitwiseORExpr:
  435. BitwiseXORExpr
  436. | BitwiseORExpr '|' BitwiseXORExpr { $$ = makeBitOperNode($1, OpBitOr, $3); }
  437. ;
  438. BitwiseORExprNoIn:
  439. BitwiseXORExprNoIn
  440. | BitwiseORExprNoIn '|' BitwiseXORExprNoIn
  441. { $$ = makeBitOperNode($1, OpBitOr, $3); }
  442. ;
  443. BitwiseORExprNoBF:
  444. BitwiseXORExprNoBF
  445. | BitwiseORExprNoBF '|' BitwiseXORExpr
  446. { $$ = makeBitOperNode($1, OpBitOr, $3); }
  447. ;
  448. LogicalANDExpr:
  449. BitwiseORExpr
  450. | LogicalANDExpr AND BitwiseORExpr { $$ = makeBinaryLogicalNode($1, OpAnd, $3); }
  451. ;
  452. LogicalANDExprNoIn:
  453. BitwiseORExprNoIn
  454. | LogicalANDExprNoIn AND BitwiseORExprNoIn
  455. { $$ = makeBinaryLogicalNode($1, OpAnd, $3); }
  456. ;
  457. LogicalANDExprNoBF:
  458. BitwiseORExprNoBF
  459. | LogicalANDExprNoBF AND BitwiseORExpr
  460. { $$ = makeBinaryLogicalNode($1, OpAnd, $3); }
  461. ;
  462. LogicalORExpr:
  463. LogicalANDExpr
  464. | LogicalORExpr OR LogicalANDExpr { $$ = makeBinaryLogicalNode($1, OpOr, $3); }
  465. ;
  466. LogicalORExprNoIn:
  467. LogicalANDExprNoIn
  468. | LogicalORExprNoIn OR LogicalANDExprNoIn
  469. { $$ = makeBinaryLogicalNode($1, OpOr, $3); }
  470. ;
  471. LogicalORExprNoBF:
  472. LogicalANDExprNoBF
  473. | LogicalORExprNoBF OR LogicalANDExpr { $$ = makeBinaryLogicalNode($1, OpOr, $3); }
  474. ;
  475. ConditionalExpr:
  476. LogicalORExpr
  477. | LogicalORExpr '?' AssignmentExpr ':' AssignmentExpr
  478. { $$ = makeConditionalNode($1, $3, $5); }
  479. ;
  480. ConditionalExprNoIn:
  481. LogicalORExprNoIn
  482. | LogicalORExprNoIn '?' AssignmentExprNoIn ':' AssignmentExprNoIn
  483. { $$ = makeConditionalNode($1, $3, $5); }
  484. ;
  485. ConditionalExprNoBF:
  486. LogicalORExprNoBF
  487. | LogicalORExprNoBF '?' AssignmentExpr ':' AssignmentExpr
  488. { $$ = makeConditionalNode($1, $3, $5); }
  489. ;
  490. AssignmentExpr:
  491. ConditionalExpr
  492. | LeftHandSideExpr AssignmentOperator AssignmentExpr
  493. { $$ = makeAssignNode($1, $2, $3); }
  494. ;
  495. AssignmentExprNoIn:
  496. ConditionalExprNoIn
  497. | LeftHandSideExpr AssignmentOperator AssignmentExprNoIn
  498. { $$ = makeAssignNode($1, $2, $3); }
  499. ;
  500. AssignmentExprNoBF:
  501. ConditionalExprNoBF
  502. | LeftHandSideExprNoBF AssignmentOperator AssignmentExpr
  503. { $$ = makeAssignNode($1, $2, $3); }
  504. ;
  505. AssignmentOperator:
  506. '=' { $$ = OpEqual; }
  507. | PLUSEQUAL { $$ = OpPlusEq; }
  508. | MINUSEQUAL { $$ = OpMinusEq; }
  509. | MULTEQUAL { $$ = OpMultEq; }
  510. | DIVEQUAL { $$ = OpDivEq; }
  511. | LSHIFTEQUAL { $$ = OpLShift; }
  512. | RSHIFTEQUAL { $$ = OpRShift; }
  513. | URSHIFTEQUAL { $$ = OpURShift; }
  514. | ANDEQUAL { $$ = OpAndEq; }
  515. | XOREQUAL { $$ = OpXOrEq; }
  516. | OREQUAL { $$ = OpOrEq; }
  517. | MODEQUAL { $$ = OpModEq; }
  518. ;
  519. Expr:
  520. AssignmentExpr
  521. | Expr ',' AssignmentExpr { $$ = new CommaNode($1, $3); }
  522. ;
  523. ExprNoIn:
  524. AssignmentExprNoIn
  525. | ExprNoIn ',' AssignmentExprNoIn { $$ = new CommaNode($1, $3); }
  526. ;
  527. ExprNoBF:
  528. AssignmentExprNoBF
  529. | ExprNoBF ',' AssignmentExpr { $$ = new CommaNode($1, $3); }
  530. ;
  531. Statement:
  532. Block
  533. | VariableStatement
  534. | ConstStatement
  535. | EmptyStatement
  536. | ExprStatement
  537. | IfStatement
  538. | IterationStatement
  539. | ContinueStatement
  540. | BreakStatement
  541. | ReturnStatement
  542. | WithStatement
  543. | SwitchStatement
  544. | LabelledStatement
  545. | ThrowStatement
  546. | TryStatement
  547. | DebuggerStatement
  548. | ImportStatement
  549. ;
  550. Block:
  551. '{' '}' { $$ = new BlockNode(0); DBG($$, @2, @2); }
  552. | '{' SourceElements '}' { $$ = new BlockNode($2); DBG($$, @3, @3); }
  553. ;
  554. VariableStatement:
  555. VAR VariableDeclarationList ';' { $$ = new VarStatementNode($2); DBG($$, @1, @3); }
  556. | VAR VariableDeclarationList error { $$ = new VarStatementNode($2); DBG($$, @1, @2); AUTO_SEMICOLON; }
  557. ;
  558. VariableDeclarationList:
  559. VariableDeclaration { $$ = new VarDeclListNode($1); }
  560. | VariableDeclarationList ',' VariableDeclaration
  561. { $$ = new VarDeclListNode($1, $3); }
  562. ;
  563. VariableDeclarationListNoIn:
  564. VariableDeclarationNoIn { $$ = new VarDeclListNode($1); }
  565. | VariableDeclarationListNoIn ',' VariableDeclarationNoIn
  566. { $$ = new VarDeclListNode($1, $3); }
  567. ;
  568. VariableDeclaration:
  569. IDENT { $$ = new VarDeclNode(*$1, 0, VarDeclNode::Variable); }
  570. | IDENT Initializer { $$ = new VarDeclNode(*$1, $2, VarDeclNode::Variable); }
  571. ;
  572. VariableDeclarationNoIn:
  573. IDENT { $$ = new VarDeclNode(*$1, 0, VarDeclNode::Variable); }
  574. | IDENT InitializerNoIn { $$ = new VarDeclNode(*$1, $2, VarDeclNode::Variable); }
  575. ;
  576. ConstStatement:
  577. CONSTTOKEN ConstDeclarationList ';' { $$ = new VarStatementNode($2); DBG($$, @1, @3); }
  578. | CONSTTOKEN ConstDeclarationList error
  579. { $$ = new VarStatementNode($2); DBG($$, @1, @2); AUTO_SEMICOLON; }
  580. ;
  581. ConstDeclarationList:
  582. ConstDeclaration { $$ = new VarDeclListNode($1); }
  583. | ConstDeclarationList ',' ConstDeclaration
  584. { $$ = new VarDeclListNode($1, $3); }
  585. ;
  586. ConstDeclaration:
  587. IDENT { $$ = new VarDeclNode(*$1, 0, VarDeclNode::Constant); }
  588. | IDENT Initializer { $$ = new VarDeclNode(*$1, $2, VarDeclNode::Constant); }
  589. ;
  590. Initializer:
  591. '=' AssignmentExpr { $$ = new AssignExprNode($2); }
  592. ;
  593. InitializerNoIn:
  594. '=' AssignmentExprNoIn { $$ = new AssignExprNode($2); }
  595. ;
  596. EmptyStatement:
  597. ';' { $$ = new EmptyStatementNode(); }
  598. ;
  599. ExprStatement:
  600. ExprNoBF ';' { $$ = new ExprStatementNode($1); DBG($$, @1, @2); }
  601. | ExprNoBF error { $$ = new ExprStatementNode($1); DBG($$, @1, @1); AUTO_SEMICOLON; }
  602. ;
  603. IfStatement:
  604. IF '(' Expr ')' Statement %prec IF_WITHOUT_ELSE
  605. { $$ = makeIfNode($3, $5, 0); DBG($$, @1, @4); }
  606. | IF '(' Expr ')' Statement ELSE Statement
  607. { $$ = makeIfNode($3, $5, $7); DBG($$, @1, @4); }
  608. ;
  609. IterationStatement:
  610. DO Statement WHILE '(' Expr ')' ';' { $$ = new DoWhileNode($2, $5); DBG($$, @1, @3);}
  611. | DO Statement WHILE '(' Expr ')' { $$ = new DoWhileNode($2, $5); DBG($$, @1, @3); }
  612. | WHILE '(' Expr ')' Statement { $$ = new WhileNode($3, $5); DBG($$, @1, @4); }
  613. | FOR '(' ExprNoInOpt ';' ExprOpt ';' ExprOpt ')' Statement
  614. { $$ = new ForNode($3, $5, $7, $9); DBG($$, @1, @8); }
  615. | FOR '(' VAR VariableDeclarationListNoIn ';' ExprOpt ';' ExprOpt ')' Statement
  616. { $$ = new ForNode($4, $6, $8, $10); DBG($$, @1, @9); }
  617. | FOR '(' LeftHandSideExpr INTOKEN Expr ')' Statement
  618. {
  619. Node *n = $3->nodeInsideAllParens();
  620. if (!n->isLocation())
  621. YYABORT;
  622. $$ = new ForInNode(n, $5, $7);
  623. DBG($$, @1, @6);
  624. }
  625. | FOR '(' VAR IDENT INTOKEN Expr ')' Statement
  626. { $$ = new ForInNode(*$4, 0, $6, $8); DBG($$, @1, @7); }
  627. | FOR '(' VAR IDENT InitializerNoIn INTOKEN Expr ')' Statement
  628. { $$ = new ForInNode(*$4, $5, $7, $9); DBG($$, @1, @8); }
  629. ;
  630. ExprOpt:
  631. /* nothing */ { $$ = 0; }
  632. | Expr
  633. ;
  634. ExprNoInOpt:
  635. /* nothing */ { $$ = 0; }
  636. | ExprNoIn
  637. ;
  638. ContinueStatement:
  639. CONTINUE ';' { $$ = new ContinueNode(); DBG($$, @1, @2); }
  640. | CONTINUE error { $$ = new ContinueNode(); DBG($$, @1, @1); AUTO_SEMICOLON; }
  641. | CONTINUE IDENT ';' { $$ = new ContinueNode(*$2); DBG($$, @1, @3); }
  642. | CONTINUE IDENT error { $$ = new ContinueNode(*$2); DBG($$, @1, @2); AUTO_SEMICOLON; }
  643. ;
  644. BreakStatement:
  645. BREAK ';' { $$ = new BreakNode(); DBG($$, @1, @2); }
  646. | BREAK error { $$ = new BreakNode(); DBG($$, @1, @1); AUTO_SEMICOLON; }
  647. | BREAK IDENT ';' { $$ = new BreakNode(*$2); DBG($$, @1, @3); }
  648. | BREAK IDENT error { $$ = new BreakNode(*$2); DBG($$, @1, @2); AUTO_SEMICOLON; }
  649. ;
  650. ReturnStatement:
  651. RETURN ';' { $$ = new ReturnNode(0); DBG($$, @1, @2); }
  652. | RETURN error { $$ = new ReturnNode(0); DBG($$, @1, @1); AUTO_SEMICOLON; }
  653. | RETURN Expr ';' { $$ = new ReturnNode($2); DBG($$, @1, @3); }
  654. | RETURN Expr error { $$ = new ReturnNode($2); DBG($$, @1, @2); AUTO_SEMICOLON; }
  655. ;
  656. WithStatement:
  657. WITH '(' Expr ')' Statement { $$ = new WithNode($3, $5); DBG($$, @1, @4); }
  658. ;
  659. SwitchStatement:
  660. SWITCH '(' Expr ')' CaseBlock { $$ = new SwitchNode($3, $5); DBG($$, @1, @4); }
  661. ;
  662. CaseBlock:
  663. '{' CaseClausesOpt '}' { $$ = new CaseBlockNode($2, 0, 0); }
  664. | '{' CaseClausesOpt DefaultClause CaseClausesOpt '}'
  665. { $$ = new CaseBlockNode($2, $3, $4); }
  666. ;
  667. CaseClausesOpt:
  668. /* nothing */ { $$ = 0; }
  669. | CaseClauses
  670. ;
  671. CaseClauses:
  672. CaseClause { $$ = new ClauseListNode($1); }
  673. | CaseClauses CaseClause { $$ = new ClauseListNode($1, $2); }
  674. ;
  675. CaseClause:
  676. CASE Expr ':' { $$ = new CaseClauseNode($2); }
  677. | CASE Expr ':' SourceElements { $$ = new CaseClauseNode($2, $4); }
  678. ;
  679. DefaultClause:
  680. DEFAULT ':' { $$ = new CaseClauseNode(0); }
  681. | DEFAULT ':' SourceElements { $$ = new CaseClauseNode(0, $3); }
  682. ;
  683. LabelledStatement:
  684. IDENT ':' Statement { $$ = makeLabelNode(*$1, $3); }
  685. ;
  686. ThrowStatement:
  687. THROW Expr ';' { $$ = new ThrowNode($2); DBG($$, @1, @3); }
  688. | THROW Expr error { $$ = new ThrowNode($2); DBG($$, @1, @2); AUTO_SEMICOLON; }
  689. ;
  690. TryStatement:
  691. TRY Block FINALLY Block { $$ = new TryNode($2, CommonIdentifiers::shared()->nullIdentifier, 0, $4); DBG($$, @1, @2); }
  692. | TRY Block CATCH '(' IDENT ')' Block { $$ = new TryNode($2, *$5, $7, 0); DBG($$, @1, @2); }
  693. | TRY Block CATCH '(' IDENT ')' Block FINALLY Block
  694. { $$ = new TryNode($2, *$5, $7, $9); DBG($$, @1, @2); }
  695. ;
  696. DebuggerStatement:
  697. DEBUGGER ';' { $$ = new EmptyStatementNode(); DBG($$, @1, @2); }
  698. | DEBUGGER error { $$ = new EmptyStatementNode(); DBG($$, @1, @1); AUTO_SEMICOLON; }
  699. ;
  700. PackageName:
  701. IDENT { $$ = new PackageNameNode(*$1); }
  702. | PackageName '.' IDENT { $$ = new PackageNameNode($1, *$3); }
  703. ;
  704. ImportStatement:
  705. IMPORT PackageName '.' '*' ';' { $$ = makeImportNode($2, true, 0);
  706. DBG($$, @1, @5); }
  707. | IMPORT PackageName '.' '*' error { $$ = makeImportNode($2, true, 0);
  708. DBG($$, @1, @5); AUTO_SEMICOLON; }
  709. | IMPORT PackageName ';' { $$ = makeImportNode($2, false, 0);
  710. DBG($$, @1, @3); }
  711. | IMPORT PackageName error { $$ = makeImportNode($2, false, 0);
  712. DBG($$, @1, @3); AUTO_SEMICOLON; }
  713. | IMPORT IDENT '=' PackageName ';' { $$ = makeImportNode($4, false, *$2);
  714. DBG($$, @1, @5); }
  715. | IMPORT IDENT '=' PackageName error { $$ = makeImportNode($4, false, *$2);
  716. DBG($$, @1, @5); AUTO_SEMICOLON; }
  717. ;
  718. FunctionDeclaration:
  719. FUNCTION IDENT '(' ')' {inFuncDecl()} FunctionBody { $$ = new FuncDeclNode(*$2, $6); }
  720. | FUNCTION IDENT '(' FormalParameterList ')' {inFuncDecl()} FunctionBody
  721. { $$ = new FuncDeclNode(*$2, $4, $7); }
  722. ;
  723. FunctionExpr:
  724. FUNCTION '(' ')' {inFuncExpr()} FunctionBody {
  725. $$ = new FuncExprNode(CommonIdentifiers::shared()->nullIdentifier, $5);
  726. }
  727. | FUNCTION '(' FormalParameterList ')' {inFuncExpr()} FunctionBody {
  728. $$ = new FuncExprNode(CommonIdentifiers::shared()->nullIdentifier, $6, $3);
  729. }
  730. | FUNCTION IDENT '(' ')' {inFuncExpr()} FunctionBody { $$ = new FuncExprNode(*$2, $6); }
  731. | FUNCTION IDENT '(' FormalParameterList ')' {inFuncExpr()} FunctionBody {
  732. $$ = new FuncExprNode(*$2, $7, $4);
  733. }
  734. ;
  735. FormalParameterList:
  736. IDENT { $$ = new ParameterNode(*$1); }
  737. | FormalParameterList ',' IDENT { $$ = new ParameterNode($1, *$3); }
  738. ;
  739. FunctionBody:
  740. '{' '}' /* not in spec */ { $$ = new FunctionBodyNode(0); DBG($$, @1, @2); }
  741. | '{' SourceElements '}' { $$ = new FunctionBodyNode($2); DBG($$, @1, @3); }
  742. ;
  743. Program:
  744. /* not in spec */ { parser().didFinishParsing(new ProgramNode(0)); }
  745. | SourceElements { parser().didFinishParsing(new ProgramNode($1)); }
  746. ;
  747. SourceElements:
  748. SourceElement { $$ = new SourceElementsNode($1); }
  749. | SourceElements SourceElement { $$ = new SourceElementsNode($1, $2); }
  750. ;
  751. SourceElement:
  752. FunctionDeclaration { $$ = $1; }
  753. | Statement { $$ = $1; }
  754. ;
  755. %%
  756. /* called by yyparse on error */
  757. int yyerror(const char *)
  758. {
  759. // fprintf(stderr, "ERROR: %s at line %d\n", s, KJS::Lexer::curr()->lineNo());
  760. return 1;
  761. }
  762. /* may we automatically insert a semicolon ? */
  763. static bool allowAutomaticSemicolon()
  764. {
  765. return yychar == '}' || yychar == 0 || lexer().prevTerminator();
  766. }
  767. // kate: indent-width 2; replace-tabs on; tab-width 4; space-indent on;