wsgram.y
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:19k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. %{
  2. /*
  3.  *
  4.  * wsgram.y
  5.  *
  6.  * Author: Markku Rossi <mtr@iki.fi>
  7.  *
  8.  * Copyright (c) 1999-2000 WAPIT OY LTD.
  9.  *  All rights reserved.
  10.  *
  11.  * Bison grammar for the WMLScript compiler.
  12.  *
  13.  */
  14. #include "wmlscript/wsint.h"
  15. #define YYPARSE_PARAM pctx
  16. #define YYLEX_PARAM pctx
  17. /* The required yyerror() function.  This is actually not used but to
  18.    report the internal parser errors.  All other errors are reported
  19.    by using the `wserror.h' functions. */
  20. extern void yyerror(char *msg);
  21. #if WS_DEBUG
  22. /* Just for debugging purposes. */
  23. WsCompilerPtr global_compiler = NULL;
  24. #endif /* WS_DEBUG */
  25. %}
  26. /* The possible semantic values. */
  27. %union
  28. {
  29.     WsUInt32 integer;
  30.     WsFloat vfloat;
  31.     char *identifier;
  32.     WsUtf8String *string;
  33.     WsBool boolean;
  34.     WsList *list;
  35.     WsFormalParm *parm;
  36.     WsVarDec *vardec;
  37.     WsPragmaMetaBody *meta_body;
  38.     WsStatement *stmt;
  39.     WsExpression *expr;
  40. }
  41. /* Tokens. */
  42. /* Language literals. */
  43. %token tINVALID tTRUE tFALSE tINTEGER tFLOAT tSTRING
  44. /* Identifier. */
  45. %token tIDENTIFIER
  46. /* Keywords. */
  47. %token tACCESS tAGENT tBREAK tCONTINUE tIDIV tIDIVA tDOMAIN tELSE tEQUIV
  48. %token tEXTERN tFOR tFUNCTION tHEADER tHTTP tIF tISVALID tMETA tNAME tPATH
  49. %token tRETURN tTYPEOF tUSE tUSER tVAR tWHILE tURL
  50. /* Keywords not used by WMLScript */
  51. %token tDELETE tIN tLIB tNEW tNULL tTHIS tVOID tWITH
  52. /* Future reserved keywords. */
  53. %token tCASE tCATCH tCLASS tCONST tDEBUGGER tDEFAULT tDO tENUM tEXPORT
  54. %token tEXTENDS tFINALLY tIMPORT tPRIVATE tPUBLIC tSIZEOF tSTRUCT tSUPER
  55. %token tSWITCH tTHROW tTRY
  56. /* Punctuation. */
  57. %token tEQ tLE tGE tNE tAND tOR tPLUSPLUS tMINUSMINUS
  58. %token tLSHIFT tRSSHIFT tRSZSHIFT tADDA tSUBA tMULA tDIVA tANDA tORA tXORA
  59. %token tREMA tLSHIFTA tRSSHIFTA tRSZSHIFTA
  60. /* Assign semantic values to tokens and non-terminals. */
  61. %type <integer> tINTEGER
  62. %type <vfloat> tFLOAT
  63. %type <string> tSTRING
  64. %type <identifier> tIDENTIFIER
  65. %type <string> MetaPropertyName MetaContent MetaScheme
  66. %type <meta_body> MetaBody
  67. %type <boolean> ExternOpt
  68. %type <list> FormalParameterListOpt FormalParameterList
  69. %type <list> StatementListOpt StatementList
  70. %type <list> Block Arguments ArgumentList VariableDeclarationList
  71. %type <vardec> VariableDeclaration
  72. %type <stmt> Statement ReturnStatement VariableStatement IfStatement
  73. %type <stmt> IterationStatement ForStatement
  74. %type <expr> ExpressionOpt Expression AssignmentExpression
  75. %type <expr> ConditionalExpression LogicalORExpression
  76. %type <expr> LogicalANDExpression BitwiseORExpression
  77. %type <expr> BitwiseXORExpression BitwiseANDExpression
  78. %type <expr> EqualityExpression RelationalExpression ShiftExpression
  79. %type <expr> AdditiveExpression MultiplicativeExpression UnaryExpression
  80. %type <expr> PostfixExpression CallExpression PrimaryExpression
  81. %type <expr> VariableInitializedOpt
  82. /* Options for bison. */
  83. /* Generate reentrant parser. */
  84. %pure_parser
  85. /* This grammar has one shift-reduce conflict.  It comes from the
  86.    if-else statement. */
  87. %expect 1
  88. %%
  89. /* A compilation unit. */
  90. CompilationUnit:
  91.   Pragmas FunctionDeclarations
  92. | FunctionDeclarations
  93. | error
  94. { ws_error_syntax(pctx, @1.first_line); }
  95. ;
  96. /* Pragmas. */
  97. Pragmas:
  98.   Pragma
  99. | Pragmas Pragma
  100. ;
  101. Pragma:
  102.   tUSE PragmaDeclaration ';'
  103. | error
  104. { ws_error_syntax(pctx, @2.first_line); }
  105. ;
  106. PragmaDeclaration:
  107.   ExternalCompilationUnitPragma
  108. | AccessControlPragma
  109. | MetaPragma
  110. ;
  111. ExternalCompilationUnitPragma:
  112.   tURL tIDENTIFIER tSTRING
  113.    { ws_pragma_use(pctx, @2.first_line, $2, $3); }
  114. ;
  115. AccessControlPragma:
  116.   tACCESS AccessControlSpecifier
  117. ;
  118. AccessControlSpecifier:
  119.   tDOMAIN tSTRING
  120.    {
  121.     WsCompiler *compiler = (WsCompiler *) pctx;
  122.     /* Pass this to the byte-code */
  123.     if (!ws_bc_add_pragma_access_domain(compiler->bc, $2->data,
  124.         $2->len))
  125.         ws_error_memory(pctx);
  126.     ws_lexer_free_utf8(compiler, $2);
  127. }
  128. | tPATH tSTRING
  129.    {
  130.     WsCompiler *compiler = (WsCompiler *) pctx;
  131.     /* Pass this to the byte-code */
  132.     if (!ws_bc_add_pragma_access_path(compiler->bc, $2->data,
  133.       $2->len))
  134.         ws_error_memory(pctx);
  135.     ws_lexer_free_utf8(compiler, $2);
  136. }
  137. | tDOMAIN tSTRING tPATH tSTRING
  138.    {
  139.     WsCompiler *compiler = (WsCompiler *) pctx;
  140.     WsBool success = WS_TRUE;
  141.     /* Pass these to the byte-code */
  142.     if (!ws_bc_add_pragma_access_domain(compiler->bc, $2->data,
  143.         $2->len))
  144.         success = WS_FALSE;
  145.     if (!ws_bc_add_pragma_access_path(compiler->bc, $4->data,
  146.       $4->len))
  147.         success = WS_FALSE;
  148.     if (!success)
  149.         ws_error_memory(pctx);
  150.     ws_lexer_free_utf8(compiler, $2);
  151.     ws_lexer_free_utf8(compiler, $4);
  152. }
  153. ;
  154. MetaPragma:
  155.   tMETA MetaSpecifier
  156. ;
  157. MetaSpecifier:
  158.   MetaName
  159. | MetaHttpEquiv
  160. | MetaUserAgent
  161. ;
  162. MetaName:
  163.   tNAME MetaBody
  164. {
  165.     WsCompiler *compiler = (WsCompiler *) pctx;
  166.     /* Meta information for the origin servers.  Show it
  167.                      * to the user if requested. */
  168.     if (compiler->params.meta_name_cb)
  169.         (*compiler->params.meta_name_cb)(
  170. $2->property_name, $2->content,
  171. $2->scheme,
  172. compiler->params.meta_name_cb_context);
  173.     /* We do not need the MetaBody anymore. */
  174.     ws_pragma_meta_body_free(compiler, $2);
  175. }
  176. ;
  177. MetaHttpEquiv:
  178.   tHTTP tEQUIV MetaBody
  179.    {
  180.     WsCompiler *compiler = (WsCompiler *) pctx;
  181.     /* Meta information HTTP header that should be
  182.                      * included to an HTTP response header.  Show it to
  183.                      * the user if requested. */
  184.     if (compiler->params.meta_http_equiv_cb)
  185.         (*compiler->params.meta_http_equiv_cb)(
  186. $3->property_name,
  187. $3->content,
  188. $3->scheme,
  189. compiler->params.meta_http_equiv_cb_context);
  190.     /* We do not need the MetaBody anymore. */
  191.     ws_pragma_meta_body_free(compiler, $3);
  192. }
  193. ;
  194. MetaUserAgent:
  195.   tUSER tAGENT MetaBody
  196. {
  197.     WsBool success;
  198.     WsCompiler *compiler = (WsCompiler *) pctx;
  199.     /* Pass this pragma to the byte-code */
  200.     if ($3) {
  201.         if ($3->scheme)
  202.        success
  203.   = ws_bc_add_pragma_user_agent_property_and_scheme(
  204. compiler->bc,
  205. $3->property_name->data,
  206. $3->property_name->len,
  207. $3->content->data,
  208. $3->content->len,
  209. $3->scheme->data,
  210. $3->scheme->len);
  211.         else
  212.        success = ws_bc_add_pragma_user_agent_property(
  213. compiler->bc,
  214. $3->property_name->data,
  215. $3->property_name->len,
  216. $3->content->data,
  217. $3->content->len);
  218.         /* Free the MetaBody. */
  219.         ws_pragma_meta_body_free(compiler, $3);
  220.         if (!success)
  221.        ws_error_memory(pctx);
  222.     }
  223. }
  224. ;
  225. MetaBody:
  226.   MetaPropertyName MetaContent
  227. { $$ = ws_pragma_meta_body(pctx, $1, $2, NULL); }
  228. | MetaPropertyName MetaContent MetaScheme
  229. { $$ = ws_pragma_meta_body(pctx, $1, $2, $3); }
  230. ;
  231. MetaPropertyName: tSTRING;
  232. MetaContent: tSTRING;
  233. MetaScheme: tSTRING;
  234. /* Function declarations. */
  235. FunctionDeclarations:
  236.   FunctionDeclaration
  237. | FunctionDeclarations FunctionDeclaration
  238. ;
  239. FunctionDeclaration:
  240.   ExternOpt tFUNCTION tIDENTIFIER '(' FormalParameterListOpt ')' Block
  241.   SemicolonOpt
  242. {
  243.     char *name = ws_strdup($3);
  244.     ws_lexer_free_block(pctx, $3);
  245.     if (name)
  246.         ws_function(pctx, $1, name, @3.first_line, $5, $7);
  247.     else
  248.         ws_error_memory(pctx);
  249. }
  250. ;
  251. ExternOpt:
  252.   /* empty */ { $$ = WS_FALSE; }
  253. | tEXTERN { $$ = WS_TRUE;  }
  254. ;
  255. FormalParameterListOpt:
  256.   /* empty */
  257. { $$ = ws_list_new(pctx); }
  258. | FormalParameterList
  259. ;
  260. SemicolonOpt:
  261.   /* empty */
  262. | ';'
  263. ;
  264. FormalParameterList:
  265.   tIDENTIFIER
  266. {
  267.                     char *id;
  268.                     WsFormalParm *parm;
  269.     id = ws_f_strdup(((WsCompiler *) pctx)->pool_stree, $1);
  270.                     parm = ws_formal_parameter(pctx, @1.first_line, id);
  271.     ws_lexer_free_block(pctx, $1);
  272.     if (id == NULL || parm == NULL) {
  273.         ws_error_memory(pctx);
  274.         $$ = NULL;
  275.     } else {
  276.         $$ = ws_list_new(pctx);
  277.         ws_list_append(pctx, $$, parm);
  278.     }
  279. }
  280. | FormalParameterList ',' tIDENTIFIER
  281. {
  282.                     char *id;
  283.                     WsFormalParm *parm;
  284.     id = ws_f_strdup(((WsCompiler *) pctx)->pool_stree, $3);
  285.                     parm = ws_formal_parameter(pctx, @1.first_line, id);
  286.     ws_lexer_free_block(pctx, $3);
  287.     if (id == NULL || parm == NULL) {
  288.         ws_error_memory(pctx);
  289.         $$ = NULL;
  290.     } else
  291.         ws_list_append(pctx, $1, parm);
  292. }
  293. ;
  294. /* Statements. */
  295. Statement:
  296.   Block
  297. {
  298.     if ($1)
  299.         $$ = ws_stmt_block(pctx, $1->first_line, $1->last_line,
  300.            $1);
  301.     else
  302.         $$ = NULL;
  303. }
  304. | VariableStatement
  305. | ';' /* EmptyStatement */
  306. { $$ = ws_stmt_empty(pctx, @1.first_line); }
  307. | Expression ';' /* ExpressionStatement */
  308. { $$ = ws_stmt_expr(pctx, $1->line, $1); }
  309. | IfStatement
  310. | IterationStatement
  311. | tCONTINUE ';' /* ContinueStatement */
  312. { $$ = ws_stmt_continue(pctx, @1.first_line); }
  313. | tBREAK ';' /* BreakStatement */
  314. { $$ = ws_stmt_break(pctx, @1.first_line); }
  315. | ReturnStatement
  316. ;
  317. Block: '{' StatementListOpt '}'
  318. {
  319.     $$ = $2;
  320.     if ($$) {
  321.         $$->first_line = @1.first_line;
  322.         $$->last_line = @3.first_line;
  323.     }
  324. }
  325. | error
  326. {
  327.     ws_error_syntax(pctx, @2.first_line);
  328.     $$ = NULL;
  329. }
  330. ;
  331. StatementListOpt:
  332.   /* empty */
  333. { $$ = ws_list_new(pctx); }
  334. | StatementList
  335. ;
  336. StatementList:
  337.   Statement
  338. {
  339.     $$ = ws_list_new(pctx);
  340.     ws_list_append(pctx, $$, $1);
  341. }
  342. | StatementList Statement
  343. { ws_list_append(pctx, $1, $2); }
  344. ;
  345. VariableStatement:
  346.   tVAR VariableDeclarationList ';'
  347. { $$ = ws_stmt_variable(pctx, @1.first_line, $2); }
  348. | tVAR error
  349. { ws_error_syntax(pctx, @2.first_line); }
  350. ;
  351. VariableDeclarationList:
  352.   VariableDeclaration
  353. {
  354.     $$ = ws_list_new(pctx);
  355.     ws_list_append(pctx, $$, $1);
  356. }
  357. | VariableDeclarationList ',' VariableDeclaration
  358. { ws_list_append(pctx, $1, $3); }
  359. ;
  360. VariableDeclaration:
  361.   tIDENTIFIER VariableInitializedOpt
  362. {
  363.     char *id = ws_f_strdup(((WsCompiler *) pctx)->pool_stree,
  364.    $1);
  365.     ws_lexer_free_block(pctx, $1);
  366.     if (id == NULL) {
  367.         ws_error_memory(pctx);
  368.         $$ = NULL;
  369.     } else
  370.         $$ = ws_variable_declaration(pctx, id, $2);
  371. }
  372. ;
  373. VariableInitializedOpt:
  374.   /* empty */
  375. { $$ = NULL; }
  376. | '=' ConditionalExpression
  377. { $$ = $2; }
  378. ;
  379. IfStatement:
  380.   tIF '(' Expression ')' Statement tELSE Statement
  381. { $$ = ws_stmt_if(pctx, @1.first_line, $3, $5, $7); }
  382. | tIF '(' Expression ')' Statement
  383. { $$ = ws_stmt_if(pctx, @1.first_line, $3, $5, NULL); }
  384. ;
  385. IterationStatement:
  386.   tWHILE '(' Expression ')' Statement
  387. { $$ = ws_stmt_while(pctx, @1.first_line, $3, $5); }
  388. | ForStatement
  389. ;
  390. ForStatement:
  391.   tFOR '(' ExpressionOpt ';' ExpressionOpt ';' ExpressionOpt ')'
  392. Statement
  393.    { $$ = ws_stmt_for(pctx, @1.first_line, NULL, $3, $5, $7, $9); }
  394. | tFOR '(' tVAR VariableDeclarationList ';' ExpressionOpt ';'
  395.         ExpressionOpt ')' Statement
  396.    { $$ = ws_stmt_for(pctx, @1.first_line, $4, NULL, $6, $8, $10); }
  397. ;
  398. ReturnStatement:
  399.   tRETURN ExpressionOpt ';'
  400. { $$ = ws_stmt_return(pctx, @1.first_line, $2); }
  401. ;
  402. /* Expressions. */
  403. ExpressionOpt:
  404.   /* empty */ { $$ = NULL; }
  405. | Expression
  406. ;
  407. Expression:
  408.   AssignmentExpression
  409. | Expression ',' AssignmentExpression
  410. { $$ = ws_expr_comma(pctx, @2.first_line, $1, $3); }
  411. ;
  412. AssignmentExpression:
  413.   ConditionalExpression
  414. | tIDENTIFIER '=' AssignmentExpression
  415. { $$ = ws_expr_assign(pctx, @1.first_line, $1, '=', $3); }
  416. | tIDENTIFIER tMULA AssignmentExpression
  417. { $$ = ws_expr_assign(pctx, @1.first_line, $1, tMULA, $3); }
  418. | tIDENTIFIER tDIVA AssignmentExpression
  419. { $$ = ws_expr_assign(pctx, @1.first_line, $1, tDIVA, $3); }
  420. | tIDENTIFIER tREMA AssignmentExpression
  421. { $$ = ws_expr_assign(pctx, @1.first_line, $1, tREMA, $3); }
  422. | tIDENTIFIER tADDA AssignmentExpression
  423. { $$ = ws_expr_assign(pctx, @1.first_line, $1, tADDA, $3); }
  424. | tIDENTIFIER tSUBA AssignmentExpression
  425. { $$ = ws_expr_assign(pctx, @1.first_line, $1, tSUBA, $3); }
  426. | tIDENTIFIER tLSHIFTA AssignmentExpression
  427. { $$ = ws_expr_assign(pctx, @1.first_line, $1, tLSHIFTA, $3); }
  428. | tIDENTIFIER tRSSHIFTA AssignmentExpression
  429. { $$ = ws_expr_assign(pctx, @1.first_line, $1, tRSSHIFTA, $3); }
  430. | tIDENTIFIER tRSZSHIFTA AssignmentExpression
  431. { $$ = ws_expr_assign(pctx, @1.first_line, $1, tRSZSHIFTA, $3); }
  432. | tIDENTIFIER tANDA AssignmentExpression
  433. { $$ = ws_expr_assign(pctx, @1.first_line, $1, tANDA, $3); }
  434. | tIDENTIFIER tXORA AssignmentExpression
  435. { $$ = ws_expr_assign(pctx, @1.first_line, $1, tXORA, $3); }
  436. | tIDENTIFIER tORA AssignmentExpression
  437. { $$ = ws_expr_assign(pctx, @1.first_line, $1, tORA, $3); }
  438. | tIDENTIFIER tIDIVA AssignmentExpression
  439. { $$ = ws_expr_assign(pctx, @1.first_line, $1, tIDIVA, $3); }
  440. ;
  441. ConditionalExpression:
  442.   LogicalORExpression
  443. | LogicalORExpression '?' AssignmentExpression ':' AssignmentExpression
  444. { $$ = ws_expr_conditional(pctx, @2.first_line, $1, $3, $5); }
  445. ;
  446. LogicalORExpression:
  447.   LogicalANDExpression
  448. | LogicalORExpression tOR LogicalANDExpression
  449. { $$ = ws_expr_logical(pctx, @2.first_line, WS_ASM_SCOR, $1, $3); }
  450. ;
  451. LogicalANDExpression:
  452.   BitwiseORExpression
  453. | LogicalANDExpression tAND BitwiseORExpression
  454. { $$ = ws_expr_logical(pctx, @2.first_line, WS_ASM_SCAND, $1, $3); }
  455. ;
  456. BitwiseORExpression:
  457.   BitwiseXORExpression
  458. | BitwiseORExpression '|' BitwiseXORExpression
  459. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_B_OR, $1, $3); }
  460. ;
  461. BitwiseXORExpression:
  462.   BitwiseANDExpression
  463. | BitwiseXORExpression '^' BitwiseANDExpression
  464. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_B_XOR, $1, $3); }
  465. ;
  466. BitwiseANDExpression:
  467.   EqualityExpression
  468. | BitwiseANDExpression '&' EqualityExpression
  469. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_B_AND, $1, $3); }
  470. ;
  471. EqualityExpression:
  472.   RelationalExpression
  473. | EqualityExpression tEQ RelationalExpression
  474. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_EQ, $1, $3); }
  475. | EqualityExpression tNE RelationalExpression
  476. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_NE, $1, $3); }
  477. ;
  478. RelationalExpression:
  479.   ShiftExpression
  480. | RelationalExpression '<' ShiftExpression
  481. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_LT, $1, $3); }
  482. | RelationalExpression '>' ShiftExpression
  483. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_GT, $1, $3); }
  484. | RelationalExpression tLE ShiftExpression
  485. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_LE, $1, $3); }
  486. | RelationalExpression tGE ShiftExpression
  487. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_GE, $1, $3); }
  488. ;
  489. ShiftExpression:
  490.   AdditiveExpression
  491. | ShiftExpression tLSHIFT AdditiveExpression
  492. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_B_LSHIFT, $1, $3); }
  493. | ShiftExpression tRSSHIFT AdditiveExpression
  494. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_B_RSSHIFT, $1, $3); }
  495. | ShiftExpression tRSZSHIFT AdditiveExpression
  496. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_B_RSZSHIFT, $1, $3); }
  497. ;
  498. AdditiveExpression:
  499.   MultiplicativeExpression
  500. | AdditiveExpression '+' MultiplicativeExpression
  501. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_ADD, $1, $3); }
  502. | AdditiveExpression '-' MultiplicativeExpression
  503. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_SUB, $1, $3); }
  504. ;
  505. MultiplicativeExpression:
  506.   UnaryExpression
  507. | MultiplicativeExpression '*' UnaryExpression
  508. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_MUL, $1, $3); }
  509. | MultiplicativeExpression '/' UnaryExpression
  510. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_DIV, $1, $3); }
  511. | MultiplicativeExpression tIDIV UnaryExpression
  512. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_IDIV, $1, $3); }
  513. | MultiplicativeExpression '%' UnaryExpression
  514. { $$ = ws_expr_binary(pctx, @2.first_line, WS_ASM_REM, $1, $3); }
  515. ;
  516. UnaryExpression:
  517.   PostfixExpression
  518. | tTYPEOF UnaryExpression
  519. { $$ = ws_expr_unary(pctx, @1.first_line, WS_ASM_TYPEOF, $2); }
  520. | tISVALID UnaryExpression
  521. { $$ = ws_expr_unary(pctx, @1.first_line, WS_ASM_ISVALID, $2); }
  522. | tPLUSPLUS tIDENTIFIER
  523. { $$ = ws_expr_unary_var(pctx, @1.first_line, WS_TRUE, $2); }
  524. | tMINUSMINUS tIDENTIFIER
  525. { $$ = ws_expr_unary_var(pctx, @1.first_line, WS_FALSE, $2); }
  526. | '+' UnaryExpression
  527. {
  528.                     /* There is no direct way to compile unary `+'.
  529.                      * It doesn't do anything except require type conversion
  530.      * (section 7.2, 7.3.2), and we do that by converting
  531.      * it to a binary expression: `UnaryExpression - 0'.
  532.                      * Using `--UnaryExpression' would not be correct because
  533.                      * it might overflow if UnaryExpression is the smallest
  534.                      * possible integer value (see 6.2.7.1).
  535.                      * Using `UnaryExpression + 0' would not be correct
  536.                      * because binary `+' accepts strings, which makes the
  537.      * type conversion different.
  538.                      */
  539.                     $$ = ws_expr_binary(pctx, @1.first_line, WS_ASM_SUB, $2,
  540.                               ws_expr_const_integer(pctx, @1.first_line, 0));
  541. }
  542. | '-' UnaryExpression
  543. { $$ = ws_expr_unary(pctx, @1.first_line, WS_ASM_UMINUS, $2); }
  544. | '~' UnaryExpression
  545. { $$ = ws_expr_unary(pctx, @1.first_line, WS_ASM_B_NOT, $2); }
  546. | '!' UnaryExpression
  547. { $$ = ws_expr_unary(pctx, @1.first_line, WS_ASM_NOT, $2); }
  548. ;
  549. PostfixExpression:
  550.   CallExpression
  551. | tIDENTIFIER tPLUSPLUS
  552. { $$ = ws_expr_postfix_var(pctx, @1.first_line, WS_TRUE, $1); }
  553. | tIDENTIFIER tMINUSMINUS
  554. { $$ = ws_expr_postfix_var(pctx, @1.first_line, WS_FALSE, $1); }
  555. ;
  556. CallExpression:
  557.   PrimaryExpression
  558. | tIDENTIFIER Arguments                 /* LocalScriptFunctionCall */
  559. {
  560.     WsFunctionHash *f = ws_function_hash(pctx, $1);
  561.     /* Add an usage count for the local script function. */
  562.     if (f)
  563.       f->usage_count++;
  564.     $$ = ws_expr_call(pctx, @1.first_line, ' ', NULL, $1, $2);
  565. }
  566. | tIDENTIFIER '#' tIDENTIFIER Arguments /* ExternalScriptFunctionCall*/
  567. { $$ = ws_expr_call(pctx, @3.first_line, '#', $1, $3, $4); }
  568. | tIDENTIFIER '.' tIDENTIFIER Arguments /* LibraryFunctionCall */
  569. { $$ = ws_expr_call(pctx, @3.first_line, '.', $1, $3, $4); }
  570. ;
  571. PrimaryExpression:
  572.   tIDENTIFIER
  573. { $$ = ws_expr_symbol(pctx, @1.first_line, $1); }
  574. | tINVALID
  575. { $$ = ws_expr_const_invalid(pctx, @1.first_line); }
  576. | tTRUE
  577. { $$ = ws_expr_const_true(pctx, @1.first_line); }
  578. | tFALSE
  579. { $$ = ws_expr_const_false(pctx, @1.first_line); }
  580. | tINTEGER
  581. { $$ = ws_expr_const_integer(pctx, @1.first_line, $1); }
  582. | tFLOAT
  583. { $$ = ws_expr_const_float(pctx, @1.first_line, $1); }
  584. | tSTRING
  585. { $$ = ws_expr_const_string(pctx, @1.first_line, $1); }
  586. | '(' Expression ')'
  587. { $$ = $2; }
  588. ;
  589. Arguments:
  590.   '(' ')'
  591. { $$ = ws_list_new(pctx); }
  592. | '(' ArgumentList ')'
  593. { $$ = $2; }
  594. ;
  595. ArgumentList:
  596.   AssignmentExpression
  597. {
  598.     $$ = ws_list_new(pctx);
  599.     ws_list_append(pctx, $$, $1);
  600. }
  601. | ArgumentList ',' AssignmentExpression
  602. { ws_list_append(pctx, $1, $3); }
  603. ;
  604. %%
  605. void
  606. yyerror(char *msg)
  607. {
  608. #if WS_DEBUG
  609.   fprintf(stderr, "*** %s:%d: wsc: %s - this msg will be removed ***n",
  610.   global_compiler->input_name, global_compiler->linenum, msg);
  611. #endif /* WS_DEBUG */
  612. }