PageRenderTime 134ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/opensource.apple.com/source/JavaScriptCore/JavaScriptCore-85/kjs/grammar.y

#
Happy | 673 lines | 586 code | 87 blank | 0 comment | 0 complexity | 980ffbb2263d86c53e06fb401d26a036 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, GPL-2.0, BSD-3-Clause, GPL-3.0, MPL-2.0, LGPL-2.0, LGPL-2.1, CC-BY-SA-3.0, IPL-1.0, ISC, AGPL-1.0, AGPL-3.0, JSON, Apache-2.0, 0BSD
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <head>
  5. <title>grammar.y</title>
  6. <style type="text/css">
  7. .enscript-comment { font-style: italic; color: rgb(178,34,34); }
  8. .enscript-function-name { font-weight: bold; color: rgb(0,0,255); }
  9. .enscript-variable-name { font-weight: bold; color: rgb(184,134,11); }
  10. .enscript-keyword { font-weight: bold; color: rgb(160,32,240); }
  11. .enscript-reference { font-weight: bold; color: rgb(95,158,160); }
  12. .enscript-string { font-weight: bold; color: rgb(188,143,143); }
  13. .enscript-builtin { font-weight: bold; color: rgb(218,112,214); }
  14. .enscript-type { font-weight: bold; color: rgb(34,139,34); }
  15. .enscript-highlight { text-decoration: underline; color: 0; }
  16. </style>
  17. </head>
  18. <body id="top">
  19. <h1 style="margin:8px;" id="f1">grammar.y&nbsp;&nbsp;&nbsp;<span style="font-weight: normal; font-size: 0.5em;">[<a href="?txt">plain text</a>]</span></h1>
  20. <hr/>
  21. <div></div>
  22. <pre>
  23. %{
  24. /*
  25. * This file is part of the KDE libraries
  26. * Copyright (C) 1999-2000 Harri Porten (<a href="mailto:porten@kde.org">porten@kde.org</a>)
  27. *
  28. * This library is free software; you can redistribute it and/or
  29. * modify it under the terms of the GNU Lesser General Public
  30. * License as published by the Free Software Foundation; either
  31. * version 2 of the License, or (at your option) any later version.
  32. *
  33. * This library is distributed in the hope that it will be useful,
  34. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  35. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  36. * Lesser General Public License for more details.
  37. *
  38. * You should have received a copy of the GNU Lesser General Public
  39. * License along with this library; if not, write to the Free Software
  40. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  41. *
  42. */
  43. #ifdef HAVE_CONFIG_H
  44. #include &lt;config.h&gt;
  45. #endif
  46. #include &lt;string.h&gt;
  47. #include &lt;stdlib.h&gt;
  48. #include &quot;value.h&quot;
  49. #include &quot;object.h&quot;
  50. #include &quot;types.h&quot;
  51. #include &quot;interpreter.h&quot;
  52. #include &quot;nodes.h&quot;
  53. #include &quot;lexer.h&quot;
  54. #include &quot;internal.h&quot;
  55. /* default values for bison */
  56. #define YYDEBUG 0
  57. #define YYMAXDEPTH 0
  58. #if !APPLE_CHANGES
  59. #define YYERROR_VERBOSE
  60. #endif
  61. #define DBG(l, s, e) { l-&gt;setLoc(s.first_line, e.last_line, Parser::sid); } // location
  62. extern int yylex();
  63. int yyerror (const char *);
  64. bool automatic();
  65. using namespace KJS;
  66. %}
  67. %union {
  68. int ival;
  69. double dval;
  70. UString *ustr;
  71. Identifier *ident;
  72. Node *node;
  73. StatementNode *stat;
  74. ParameterNode *param;
  75. FunctionBodyNode *body;
  76. FuncDeclNode *func;
  77. ProgramNode *prog;
  78. AssignExprNode *init;
  79. SourceElementsNode *srcs;
  80. StatListNode *slist;
  81. ArgumentsNode *args;
  82. ArgumentListNode *alist;
  83. VarDeclNode *decl;
  84. VarDeclListNode *vlist;
  85. CaseBlockNode *cblk;
  86. ClauseListNode *clist;
  87. CaseClauseNode *ccl;
  88. ElementNode *elm;
  89. Operator op;
  90. PropertyValueNode *plist;
  91. PropertyNode *pnode;
  92. }
  93. %start Program
  94. /* expect a shift/reduce conflict from the &quot;dangling else&quot; problem
  95. when using bison the warning can be supressed */
  96. // %expect 1
  97. /* literals */
  98. %token NULLTOKEN TRUETOKEN FALSETOKEN
  99. %token STRING NUMBER
  100. /* keywords */
  101. %token BREAK CASE DEFAULT FOR NEW VAR CONTINUE
  102. %token FUNCTION RETURN VOID DELETE
  103. %token IF THIS DO WHILE ELSE IN INSTANCEOF TYPEOF
  104. %token SWITCH WITH RESERVED
  105. %token THROW TRY CATCH FINALLY
  106. /* punctuators */
  107. %token EQEQ NE /* == and != */
  108. %token STREQ STRNEQ /* === and !== */
  109. %token LE GE /* &lt; and &gt; */
  110. %token OR AND /* || and &amp;&amp; */
  111. %token PLUSPLUS MINUSMINUS /* ++ and -- */
  112. %token LSHIFT /* &lt;&lt; */
  113. %token RSHIFT URSHIFT /* &gt;&gt; and &gt;&gt;&gt; */
  114. %token PLUSEQUAL MINUSEQUAL /* += and -= */
  115. %token MULTEQUAL DIVEQUAL /* *= and /= */
  116. %token LSHIFTEQUAL /* &lt;&lt;= */
  117. %token RSHIFTEQUAL URSHIFTEQUAL /* &gt;&gt;= and &gt;&gt;&gt;= */
  118. %token ANDEQUAL MODEQUAL /* &amp;= and %= */
  119. %token XOREQUAL OREQUAL /* ^= and |= */
  120. /* terminal types */
  121. %token &lt;dval&gt; NUMBER
  122. %token &lt;ustr&gt; STRING
  123. %token &lt;ident&gt; IDENT
  124. /* automatically inserted semicolon */
  125. %token AUTOPLUSPLUS AUTOMINUSMINUS
  126. /* non-terminal types */
  127. %type &lt;node&gt; Literal PrimaryExpr Expr MemberExpr FunctionExpr NewExpr CallExpr
  128. %type &lt;node&gt; ArrayLiteral
  129. %type &lt;node&gt; LeftHandSideExpr PostfixExpr UnaryExpr
  130. %type &lt;node&gt; MultiplicativeExpr AdditiveExpr
  131. %type &lt;node&gt; ShiftExpr RelationalExpr EqualityExpr
  132. %type &lt;node&gt; BitwiseANDExpr BitwiseXORExpr BitwiseORExpr
  133. %type &lt;node&gt; LogicalANDExpr LogicalORExpr
  134. %type &lt;node&gt; ConditionalExpr AssignmentExpr
  135. %type &lt;node&gt; ExprOpt
  136. %type &lt;node&gt; CallExpr
  137. %type &lt;node&gt; Catch Finally
  138. %type &lt;stat&gt; Statement Block
  139. %type &lt;stat&gt; VariableStatement EmptyStatement ExprStatement
  140. %type &lt;stat&gt; IfStatement IterationStatement ContinueStatement
  141. %type &lt;stat&gt; BreakStatement ReturnStatement WithStatement
  142. %type &lt;stat&gt; SwitchStatement LabelledStatement
  143. %type &lt;stat&gt; ThrowStatement TryStatement
  144. %type &lt;stat&gt; SourceElement
  145. %type &lt;slist&gt; StatementList
  146. %type &lt;init&gt; Initializer
  147. %type &lt;func&gt; FunctionDeclaration
  148. %type &lt;body&gt; FunctionBody
  149. %type &lt;srcs&gt; SourceElements
  150. %type &lt;param&gt; FormalParameterList
  151. %type &lt;op&gt; AssignmentOperator
  152. %type &lt;prog&gt; Program
  153. %type &lt;args&gt; Arguments
  154. %type &lt;alist&gt; ArgumentList
  155. %type &lt;vlist&gt; VariableDeclarationList
  156. %type &lt;decl&gt; VariableDeclaration
  157. %type &lt;cblk&gt; CaseBlock
  158. %type &lt;ccl&gt; CaseClause DefaultClause
  159. %type &lt;clist&gt; CaseClauses CaseClausesOpt
  160. %type &lt;ival&gt; Elision ElisionOpt
  161. %type &lt;elm&gt; ElementList
  162. %type &lt;plist&gt; PropertyNameAndValueList
  163. %type &lt;pnode&gt; PropertyName
  164. %%
  165. Literal:
  166. NULLTOKEN { $$ = new NullNode(); }
  167. | TRUETOKEN { $$ = new BooleanNode(true); }
  168. | FALSETOKEN { $$ = new BooleanNode(false); }
  169. | NUMBER { $$ = new NumberNode($1); }
  170. | STRING { $$ = new StringNode($1); delete $1; }
  171. | '/' /* a RegExp ? */ { Lexer *l = Lexer::curr();
  172. if (!l-&gt;scanRegExp()) YYABORT;
  173. $$ = new RegExpNode(l-&gt;pattern,l-&gt;flags);}
  174. | DIVEQUAL /* a RegExp starting with /= ! */
  175. { Lexer *l = Lexer::curr();
  176. if (!l-&gt;scanRegExp()) YYABORT;
  177. $$ = new RegExpNode(UString('=')+l-&gt;pattern,l-&gt;flags);}
  178. ;
  179. PrimaryExpr:
  180. THIS { $$ = new ThisNode(); }
  181. | IDENT { $$ = new ResolveNode(*$1);
  182. delete $1; }
  183. | Literal
  184. | ArrayLiteral
  185. | '(' Expr ')' { $$ = new GroupNode($2); }
  186. | '{' '}' { $$ = new ObjectLiteralNode(0L); }
  187. | '{' PropertyNameAndValueList '}' { $$ = new ObjectLiteralNode($2); }
  188. ;
  189. ArrayLiteral:
  190. '[' ElisionOpt ']' { $$ = new ArrayNode($2); }
  191. | '[' ElementList ']' { $$ = new ArrayNode($2); }
  192. | '[' ElementList ',' ElisionOpt ']' { $$ = new ArrayNode($4, $2); }
  193. ;
  194. ElementList:
  195. ElisionOpt AssignmentExpr { $$ = new ElementNode($1, $2); }
  196. | ElementList ',' ElisionOpt AssignmentExpr
  197. { $$ = new ElementNode($1, $3, $4); }
  198. ;
  199. ElisionOpt:
  200. /* nothing */ { $$ = 0; }
  201. | Elision
  202. ;
  203. Elision:
  204. ',' { $$ = 1; }
  205. | Elision ',' { $$ = $1 + 1; }
  206. ;
  207. PropertyNameAndValueList:
  208. PropertyName ':' AssignmentExpr { $$ = new PropertyValueNode($1, $3); }
  209. | PropertyNameAndValueList ',' PropertyName ':' AssignmentExpr
  210. { $$ = new PropertyValueNode($3, $5, $1); }
  211. ;
  212. PropertyName:
  213. IDENT { $$ = new PropertyNode(*$1); delete $1; }
  214. | STRING { $$ = new PropertyNode(Identifier(*$1)); delete $1; }
  215. | NUMBER { $$ = new PropertyNode($1); }
  216. ;
  217. MemberExpr:
  218. PrimaryExpr
  219. | FunctionExpr
  220. | MemberExpr '[' Expr ']' { $$ = new AccessorNode1($1, $3); }
  221. | MemberExpr '.' IDENT { $$ = new AccessorNode2($1, *$3); delete $3; }
  222. | NEW MemberExpr Arguments { $$ = new NewExprNode($2, $3); }
  223. ;
  224. NewExpr:
  225. MemberExpr
  226. | NEW NewExpr { $$ = new NewExprNode($2); }
  227. ;
  228. CallExpr:
  229. MemberExpr Arguments { $$ = new FunctionCallNode($1, $2); }
  230. | CallExpr Arguments { $$ = new FunctionCallNode($1, $2); }
  231. | CallExpr '[' Expr ']' { $$ = new AccessorNode1($1, $3); }
  232. | CallExpr '.' IDENT { $$ = new AccessorNode2($1, *$3);
  233. delete $3; }
  234. ;
  235. Arguments:
  236. '(' ')' { $$ = new ArgumentsNode(0L); }
  237. | '(' ArgumentList ')' { $$ = new ArgumentsNode($2); }
  238. ;
  239. ArgumentList:
  240. AssignmentExpr { $$ = new ArgumentListNode($1); }
  241. | ArgumentList ',' AssignmentExpr { $$ = new ArgumentListNode($1, $3); }
  242. ;
  243. LeftHandSideExpr:
  244. NewExpr
  245. | CallExpr
  246. ;
  247. PostfixExpr: /* TODO: no line terminator here */
  248. LeftHandSideExpr
  249. | LeftHandSideExpr PLUSPLUS { $$ = new PostfixNode($1, OpPlusPlus); }
  250. | LeftHandSideExpr MINUSMINUS { $$ = new PostfixNode($1, OpMinusMinus); }
  251. ;
  252. UnaryExpr:
  253. PostfixExpr
  254. | DELETE UnaryExpr { $$ = new DeleteNode($2); }
  255. | VOID UnaryExpr { $$ = new VoidNode($2); }
  256. | TYPEOF UnaryExpr { $$ = new TypeOfNode($2); }
  257. | PLUSPLUS UnaryExpr { $$ = new PrefixNode(OpPlusPlus, $2); }
  258. | AUTOPLUSPLUS UnaryExpr { $$ = new PrefixNode(OpPlusPlus, $2); }
  259. | MINUSMINUS UnaryExpr { $$ = new PrefixNode(OpMinusMinus, $2); }
  260. | AUTOMINUSMINUS UnaryExpr { $$ = new PrefixNode(OpMinusMinus, $2); }
  261. | '+' UnaryExpr { $$ = new UnaryPlusNode($2); }
  262. | '-' UnaryExpr { $$ = new NegateNode($2); }
  263. | '~' UnaryExpr { $$ = new BitwiseNotNode($2); }
  264. | '!' UnaryExpr { $$ = new LogicalNotNode($2); }
  265. ;
  266. MultiplicativeExpr:
  267. UnaryExpr
  268. | MultiplicativeExpr '*' UnaryExpr { $$ = new MultNode($1, $3, '*'); }
  269. | MultiplicativeExpr '/' UnaryExpr { $$ = new MultNode($1, $3, '/'); }
  270. | MultiplicativeExpr '%' UnaryExpr { $$ = new MultNode($1,$3,'%'); }
  271. ;
  272. AdditiveExpr:
  273. MultiplicativeExpr
  274. | AdditiveExpr '+' MultiplicativeExpr { $$ = new AddNode($1, $3, '+'); }
  275. | AdditiveExpr '-' MultiplicativeExpr { $$ = new AddNode($1, $3, '-'); }
  276. ;
  277. ShiftExpr:
  278. AdditiveExpr
  279. | ShiftExpr LSHIFT AdditiveExpr { $$ = new ShiftNode($1, OpLShift, $3); }
  280. | ShiftExpr RSHIFT AdditiveExpr { $$ = new ShiftNode($1, OpRShift, $3); }
  281. | ShiftExpr URSHIFT AdditiveExpr { $$ = new ShiftNode($1, OpURShift, $3); }
  282. ;
  283. RelationalExpr:
  284. ShiftExpr
  285. | RelationalExpr '&lt;' ShiftExpr
  286. { $$ = new RelationalNode($1, OpLess, $3); }
  287. | RelationalExpr '&gt;' ShiftExpr
  288. { $$ = new RelationalNode($1, OpGreater, $3); }
  289. | RelationalExpr LE ShiftExpr
  290. { $$ = new RelationalNode($1, OpLessEq, $3); }
  291. | RelationalExpr GE ShiftExpr
  292. { $$ = new RelationalNode($1, OpGreaterEq, $3); }
  293. | RelationalExpr INSTANCEOF ShiftExpr
  294. { $$ = new RelationalNode($1, OpInstanceOf, $3); }
  295. | RelationalExpr IN ShiftExpr
  296. { $$ = new RelationalNode($1, OpIn, $3); }
  297. ;
  298. EqualityExpr:
  299. RelationalExpr
  300. | EqualityExpr EQEQ RelationalExpr { $$ = new EqualNode($1, OpEqEq, $3); }
  301. | EqualityExpr NE RelationalExpr { $$ = new EqualNode($1, OpNotEq, $3); }
  302. | EqualityExpr STREQ RelationalExpr { $$ = new EqualNode($1, OpStrEq, $3); }
  303. | EqualityExpr STRNEQ RelationalExpr { $$ = new EqualNode($1, OpStrNEq, $3);}
  304. ;
  305. BitwiseANDExpr:
  306. EqualityExpr
  307. | BitwiseANDExpr '&amp;' EqualityExpr { $$ = new BitOperNode($1, OpBitAnd, $3); }
  308. ;
  309. BitwiseXORExpr:
  310. BitwiseANDExpr
  311. | BitwiseXORExpr '^' EqualityExpr { $$ = new BitOperNode($1, OpBitXOr, $3); }
  312. ;
  313. BitwiseORExpr:
  314. BitwiseXORExpr
  315. | BitwiseORExpr '|' EqualityExpr { $$ = new BitOperNode($1, OpBitOr, $3); }
  316. ;
  317. LogicalANDExpr:
  318. BitwiseORExpr
  319. | LogicalANDExpr AND BitwiseORExpr
  320. { $$ = new BinaryLogicalNode($1, OpAnd, $3); }
  321. ;
  322. LogicalORExpr:
  323. LogicalANDExpr
  324. | LogicalORExpr OR LogicalANDExpr
  325. { $$ = new BinaryLogicalNode($1, OpOr, $3); }
  326. ;
  327. ConditionalExpr:
  328. LogicalORExpr
  329. | LogicalORExpr '?' AssignmentExpr ':' AssignmentExpr
  330. { $$ = new ConditionalNode($1, $3, $5); }
  331. ;
  332. AssignmentExpr:
  333. ConditionalExpr
  334. | LeftHandSideExpr AssignmentOperator AssignmentExpr
  335. { $$ = new AssignNode($1, $2, $3);}
  336. ;
  337. AssignmentOperator:
  338. '=' { $$ = OpEqual; }
  339. | PLUSEQUAL { $$ = OpPlusEq; }
  340. | MINUSEQUAL { $$ = OpMinusEq; }
  341. | MULTEQUAL { $$ = OpMultEq; }
  342. | DIVEQUAL { $$ = OpDivEq; }
  343. | LSHIFTEQUAL { $$ = OpLShift; }
  344. | RSHIFTEQUAL { $$ = OpRShift; }
  345. | URSHIFTEQUAL { $$ = OpURShift; }
  346. | ANDEQUAL { $$ = OpAndEq; }
  347. | XOREQUAL { $$ = OpXOrEq; }
  348. | OREQUAL { $$ = OpOrEq; }
  349. | MODEQUAL { $$ = OpModEq; }
  350. ;
  351. Expr:
  352. AssignmentExpr
  353. | Expr ',' AssignmentExpr { $$ = new CommaNode($1, $3); }
  354. ;
  355. Statement:
  356. Block
  357. | VariableStatement
  358. | EmptyStatement
  359. | ExprStatement
  360. | IfStatement
  361. | IterationStatement
  362. | ContinueStatement
  363. | BreakStatement
  364. | ReturnStatement
  365. | WithStatement
  366. | SwitchStatement
  367. | LabelledStatement
  368. | ThrowStatement
  369. | TryStatement
  370. ;
  371. Block:
  372. '{' '}' { $$ = new BlockNode(0L); DBG($$, @2, @2); }
  373. | '{' SourceElements '}' { $$ = new BlockNode($2); DBG($$, @3, @3); }
  374. ;
  375. StatementList:
  376. Statement { $$ = new StatListNode($1); }
  377. | StatementList Statement { $$ = new StatListNode($1, $2); }
  378. ;
  379. VariableStatement:
  380. VAR VariableDeclarationList ';' { $$ = new VarStatementNode($2);
  381. DBG($$, @1, @3); }
  382. | VAR VariableDeclarationList error { if (automatic()) {
  383. $$ = new VarStatementNode($2);
  384. DBG($$, @1, @2);
  385. } else {
  386. YYABORT;
  387. }
  388. }
  389. ;
  390. VariableDeclarationList:
  391. VariableDeclaration { $$ = new VarDeclListNode($1); }
  392. | VariableDeclarationList ',' VariableDeclaration
  393. { $$ = new VarDeclListNode($1, $3); }
  394. ;
  395. VariableDeclaration:
  396. IDENT { $$ = new VarDeclNode(*$1, 0); delete $1; }
  397. | IDENT Initializer { $$ = new VarDeclNode(*$1, $2); delete $1; }
  398. ;
  399. Initializer:
  400. '=' AssignmentExpr { $$ = new AssignExprNode($2); }
  401. ;
  402. EmptyStatement:
  403. ';' { $$ = new EmptyStatementNode(); }
  404. ;
  405. ExprStatement:
  406. Expr ';' { $$ = new ExprStatementNode($1);
  407. DBG($$, @1, @2); }
  408. | Expr error { if (automatic()) {
  409. $$ = new ExprStatementNode($1);
  410. DBG($$, @1, @1);
  411. } else
  412. YYABORT; }
  413. ;
  414. IfStatement: /* shift/reduce conflict due to dangling else */
  415. IF '(' Expr ')' Statement { $$ = new IfNode($3,$5,0L);DBG($$,@1,@4); }
  416. | IF '(' Expr ')' Statement ELSE Statement
  417. { $$ = new IfNode($3,$5,$7);DBG($$,@1,@4); }
  418. ;
  419. IterationStatement:
  420. DO Statement WHILE '(' Expr ')' { $$=new DoWhileNode($2,$5);DBG($$,@1,@3);}
  421. | WHILE '(' Expr ')' Statement { $$ = new WhileNode($3,$5);DBG($$,@1,@4); }
  422. | FOR '(' ExprOpt ';' ExprOpt ';' ExprOpt ')'
  423. Statement { $$ = new ForNode($3,$5,$7,$9);
  424. DBG($$,@1,@8); }
  425. | FOR '(' VAR VariableDeclarationList ';' ExprOpt ';' ExprOpt ')'
  426. Statement { $$ = new ForNode($4,$6,$8,$10);
  427. DBG($$,@1,@9); }
  428. | FOR '(' LeftHandSideExpr IN Expr ')'
  429. Statement { $$ = new ForInNode($3, $5, $7);
  430. DBG($$,@1,@6); }
  431. | FOR '(' VAR IDENT IN Expr ')'
  432. Statement { $$ = new ForInNode(*$4,0L,$6,$8);
  433. DBG($$,@1,@7);
  434. delete $4; }
  435. | FOR '(' VAR IDENT Initializer IN Expr ')'
  436. Statement { $$ = new ForInNode(*$4,$5,$7,$9);
  437. DBG($$,@1,@8);
  438. delete $4; }
  439. ;
  440. ExprOpt:
  441. /* nothing */ { $$ = 0L; }
  442. | Expr
  443. ;
  444. ContinueStatement:
  445. CONTINUE ';' { $$ = new ContinueNode(); DBG($$,@1,@2); }
  446. | CONTINUE error { if (automatic()) {
  447. $$ = new ContinueNode(); DBG($$,@1,@2);
  448. } else
  449. YYABORT; }
  450. | CONTINUE IDENT ';' { $$ = new ContinueNode(*$2); DBG($$,@1,@3);
  451. delete $2; }
  452. | CONTINUE IDENT error { if (automatic()) {
  453. $$ = new ContinueNode(*$2);DBG($$,@1,@2);
  454. delete $2;
  455. } else
  456. YYABORT; }
  457. ;
  458. BreakStatement:
  459. BREAK ';' { $$ = new BreakNode();DBG($$,@1,@2); }
  460. | BREAK error { if (automatic()) {
  461. $$ = new BreakNode(); DBG($$,@1,@1);
  462. } else
  463. YYABORT; }
  464. | BREAK IDENT ';' { $$ = new BreakNode(*$2); DBG($$,@1,@3);
  465. delete $2; }
  466. | BREAK IDENT error { if (automatic()) {
  467. $$ = new BreakNode(*$2); DBG($$,@1,@2);
  468. delete $2;
  469. } else
  470. YYABORT;
  471. }
  472. ;
  473. ReturnStatement:
  474. RETURN ';' { $$ = new ReturnNode(0L); DBG($$,@1,@2); }
  475. | RETURN error { if (automatic()) {
  476. $$ = new ReturnNode(0L); DBG($$,@1,@1);
  477. } else
  478. YYABORT; }
  479. | RETURN Expr ';' { $$ = new ReturnNode($2); }
  480. | RETURN Expr error { if (automatic())
  481. $$ = new ReturnNode($2);
  482. else
  483. YYABORT; }
  484. ;
  485. WithStatement:
  486. WITH '(' Expr ')' Statement { $$ = new WithNode($3,$5);
  487. DBG($$, @1, @4); }
  488. ;
  489. SwitchStatement:
  490. SWITCH '(' Expr ')' CaseBlock { $$ = new SwitchNode($3, $5);
  491. DBG($$, @1, @4); }
  492. ;
  493. CaseBlock:
  494. '{' CaseClausesOpt '}' { $$ = new CaseBlockNode($2, 0L, 0L); }
  495. | '{' CaseClausesOpt DefaultClause CaseClausesOpt '}'
  496. { $$ = new CaseBlockNode($2, $3, $4); }
  497. ;
  498. CaseClausesOpt:
  499. /* nothing */ { $$ = 0L; }
  500. | CaseClauses
  501. ;
  502. CaseClauses:
  503. CaseClause { $$ = new ClauseListNode($1); }
  504. | CaseClauses CaseClause { $$ = new ClauseListNode($1, $2); }
  505. ;
  506. CaseClause:
  507. CASE Expr ':' { $$ = new CaseClauseNode($2, 0L); }
  508. | CASE Expr ':' StatementList { $$ = new CaseClauseNode($2, $4); }
  509. ;
  510. DefaultClause:
  511. DEFAULT ':' { $$ = new CaseClauseNode(0L, 0L);; }
  512. | DEFAULT ':' StatementList { $$ = new CaseClauseNode(0L, $3); }
  513. ;
  514. LabelledStatement:
  515. IDENT ':' Statement { $3-&gt;pushLabel(*$1);
  516. $$ = new LabelNode(*$1, $3);
  517. delete $1; }
  518. ;
  519. ThrowStatement:
  520. THROW Expr ';' { $$ = new ThrowNode($2); }
  521. ;
  522. TryStatement:
  523. TRY Block Catch { $$ = new TryNode($2, $3); }
  524. | TRY Block Finally { $$ = new TryNode($2, 0L, $3); }
  525. | TRY Block Catch Finally { $$ = new TryNode($2, $3, $4); }
  526. ;
  527. Catch:
  528. CATCH '(' IDENT ')' Block { $$ = new CatchNode(*$3, $5); delete $3; }
  529. ;
  530. Finally:
  531. FINALLY Block { $$ = new FinallyNode($2); }
  532. ;
  533. FunctionDeclaration:
  534. FUNCTION IDENT '(' ')' FunctionBody { $$ = new FuncDeclNode(*$2, 0L, $5);
  535. delete $2; }
  536. | FUNCTION IDENT '(' FormalParameterList ')' FunctionBody
  537. { $$ = new FuncDeclNode(*$2, $4, $6);
  538. delete $2; }
  539. FunctionExpr:
  540. FUNCTION '(' ')' FunctionBody { $$ = new FuncExprNode(0L, $4); }
  541. | FUNCTION '(' FormalParameterList ')' FunctionBody
  542. { $$ = new FuncExprNode($3, $5); }
  543. ;
  544. FormalParameterList:
  545. IDENT { $$ = new ParameterNode(*$1); delete $1; }
  546. | FormalParameterList ',' IDENT { $$ = new ParameterNode($1, *$3); delete $3; }
  547. ;
  548. FunctionBody:
  549. '{' '}' /* TODO: spec ??? */ { $$ = new FunctionBodyNode(0L);
  550. DBG($$, @1, @2);}
  551. | '{' SourceElements '}' { $$ = new FunctionBodyNode($2);
  552. DBG($$, @1, @3);}
  553. ;
  554. Program:
  555. /* nothing, empty script */ { $$ = new ProgramNode(0L);
  556. Parser::progNode = $$; }
  557. | SourceElements { $$ = new ProgramNode($1);
  558. Parser::progNode = $$; }
  559. ;
  560. SourceElements:
  561. SourceElement { $$ = new SourceElementsNode($1); }
  562. | SourceElements SourceElement { $$ = new SourceElementsNode($1, $2); }
  563. ;
  564. SourceElement:
  565. Statement { $$ = $1; }
  566. | FunctionDeclaration { $$ = $1; }
  567. ;
  568. %%
  569. int yyerror (const char *) /* Called by yyparse on error */
  570. {
  571. // fprintf(stderr, &quot;ERROR: %s at line %d\n&quot;,
  572. // s, KJScript::lexer()-&gt;lineNo());
  573. return 1;
  574. }
  575. /* may we automatically insert a semicolon ? */
  576. bool automatic()
  577. {
  578. if (yychar == '}' || yychar == 0)
  579. return true;
  580. else if (Lexer::curr()-&gt;prevTerminator())
  581. return true;
  582. return false;
  583. }
  584. </pre>
  585. <hr />
  586. </body></html>