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

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  *
  3.  * wsstree.h
  4.  *
  5.  * Author: Markku Rossi <mtr@iki.fi>
  6.  *
  7.  * Copyright (c) 1999-2000 WAPIT OY LTD.
  8.  *  All rights reserved.
  9.  *
  10.  * Syntax tree creation, manipulation and byte-code assembler
  11.  * generation.
  12.  *
  13.  */
  14. #ifndef WSSTREE_H
  15. #define WSSTREE_H
  16. /********************* Linked list for syntax tree items ****************/
  17. /* A list item. */
  18. struct WsListItemRec
  19. {
  20.     struct WsListItemRec *next;
  21.     void *data;
  22. };
  23. typedef struct WsListItemRec WsListItem;
  24. /* The linked list object. */
  25. struct WsListRec
  26. {
  27.     WsListItem *head;
  28.     WsListItem *tail;
  29.     WsUInt32 num_items;
  30.     /* These are used in blocks to record the first and last line
  31.        information.  They might also be used in other grammar
  32.        constructs. */
  33.     WsUInt32 first_line;
  34.     WsUInt32 last_line;
  35. };
  36. typedef struct WsListRec WsList;
  37. /* Create a new syntax tree linked list for the compiler `compiler'.
  38.    The list is allocated from the `compiler->pool_stree' fast malloc
  39.    pool. */
  40. WsList *ws_list_new(WsCompilerPtr compiler);
  41. /* Append the item `value' to the end of the list `list'.  The item is
  42.    allocated from the `compiler->pool_stree' fast malloc pool. */
  43. void ws_list_append(WsCompilerPtr compiler, WsList *list, void *value);
  44. /********************* Namespace for arguments and locals ***************/
  45. /* A namespace record. */
  46. struct WsNamespaceRec
  47. {
  48.     /* The line where this argument or local variable is declared. */
  49.     WsUInt32 line;
  50.     /* The index of this variable. */
  51.     WsUInt8 vindex;
  52. };
  53. typedef struct WsNamespaceRec WsNamespace;
  54. /* Create a new variable hash. */
  55. WsHashPtr ws_variable_hash_create(void);
  56. /* Define the new local variable or argument `name' to the local
  57.    variables namespace.  The argument `line' specifies the location
  58.    where the variable `name' is defined.  The argument `variablep' is
  59.    WS_TRUE for local variables and WS_FALSE for arguments.  The
  60.    function performs all necessary initializations and sanity checks
  61.    needed.  It will also report errors, etc.  The function returns
  62.    NULL if there were any errors. */
  63. WsNamespace *ws_variable_define(WsCompilerPtr compiler, WsUInt32 line,
  64.                                 WsBool variablep, char *name);
  65. /* Lookup the variable `name' from the variables namespace.  The
  66.    function returns NULL if the variable `name' is undefined.  The
  67.    function does not report any errors. */
  68. WsNamespace *ws_variable_lookup(WsCompilerPtr compiler, char *name);
  69. /********************* Top-level declarations ***************************/
  70. /* An external compilation unit pragma. */
  71. struct WsPragmaUseRec
  72. {
  73.     /* The line number of the pragma. */
  74.     WsUInt32 line;
  75.     /* The byte-code pool constant index of the external compilation
  76.        unit URL. */
  77.     WsUInt16 urlindex;
  78. };
  79. typedef struct WsPragmaUseRec WsPragmaUse;
  80. /* Create a hash for the external compilation unit pragmas. */
  81. WsHashPtr ws_pragma_use_hash_create(void);
  82. /* Add a new external compilation unit pragma to the compiler
  83.    `compiler'.  The function inserts the URL string `url' to the
  84.    byte-code structure of the compiler `compiler'.  It updates the
  85.    external compilation unit hash to have mapping from the identifier
  86.    `identifier' to the URL `url' (or its constant index).  The
  87.    function reports errors if the identifier `identifier' does already
  88.    have a mapping the external compilation unit namespace. */
  89. void ws_pragma_use(WsCompilerPtr compiler, WsUInt32 line, char *identifier,
  90.                    WsUtf8String *url);
  91. /* MetaBody handling of the `use meta' pragmas. */
  92. struct WsPragmaMetaBodyRec
  93. {
  94.     WsUtf8String *property_name;
  95.     WsUtf8String *content;
  96.     WsUtf8String *scheme;
  97. };
  98. typedef struct WsPragmaMetaBodyRec WsPragmaMetaBody;
  99. /* Create a meta body pragma. */
  100. WsPragmaMetaBody *ws_pragma_meta_body(WsCompilerPtr compiler,
  101.                                       WsUtf8String *property_name,
  102.                                       WsUtf8String *content,
  103.                                       WsUtf8String *scheme);
  104. /* Free the MetaBody `mb'. */
  105. void ws_pragma_meta_body_free(WsCompilerPtr compiler, WsPragmaMetaBody *mb);
  106. /* A top-level function declaration. */
  107. struct WsFunctionRec
  108. {
  109.     WsUInt8 findex;
  110.     WsBool externp;
  111.     char *name;
  112.     WsUInt32 line;
  113.     WsList *params;
  114.     WsList *block;
  115.     /* The usage count of this function.  This is used when sorting the
  116.        functions by their usage count. */
  117.     WsUInt32 usage_count;
  118. };
  119. typedef struct WsFunctionRec WsFunction;
  120. /* Function hash item.  The function hash contains mapping from the
  121.    function names and their usage counts to the actual function
  122.    declaration. */
  123. struct WsFunctionHashRec
  124. {
  125.     /* Does this mapping have a function declaration. */
  126.     WsBool defined;
  127.     /* If declared, this is the index. */
  128.     WsUInt8 findex;
  129.     WsUInt32 usage_count;
  130. };
  131. typedef struct WsFunctionHashRec WsFunctionHash;
  132. /* Create a new hash for functions. */
  133. WsHashPtr ws_function_hash_create(void);
  134. /* Returns a pointer to the function hash item for the function name
  135.    `name'.  The function creates a new hash slot if the name `name' is
  136.    currently unknown.  The function returns NULL if the memory
  137.    allocation failed. */
  138. WsFunctionHash *ws_function_hash(WsCompilerPtr compiler, char *name);
  139. /* Add a new function definition to the compiler `compiler'.  The
  140.    argument `externp' specifies whether the function is extern or not.
  141.    The argument `name' is the name of the function.  The function name
  142.    is ws_malloc() allocated and must be freed when it is not needed
  143.    anymore.  The argument `line' specifies the definition location of
  144.    the function.  It is the line where the function name was in the
  145.    source stream.  The argument `params' contains the formal
  146.    parameters of the function and its body is specified in the
  147.    argument `block'. */
  148. void ws_function(WsCompilerPtr compiler, WsBool externp, char *name,
  149.                  WsUInt32 line, WsList *params, WsList *block);
  150. /********************* Expressions **************************************/
  151. /* Expression types. */
  152. typedef enum
  153. {
  154.     WS_EXPR_COMMA,
  155.     WS_EXPR_ASSIGN,
  156.     WS_EXPR_CONDITIONAL,
  157.     WS_EXPR_LOGICAL,
  158.     WS_EXPR_BINARY,
  159.     WS_EXPR_UNARY,
  160.     WS_EXPR_UNARY_VAR,
  161.     WS_EXPR_POSTFIX_VAR,
  162.     WS_EXPR_CALL,
  163.     WS_EXPR_SYMBOL,
  164.     WS_EXPR_CONST_INVALID,
  165.     WS_EXPR_CONST_TRUE,
  166.     WS_EXPR_CONST_FALSE,
  167.     WS_EXPR_CONST_INTEGER,
  168.     WS_EXPR_CONST_FLOAT,
  169.     WS_EXPR_CONST_STRING
  170. } WsExpressionType;
  171. /* An expression. */
  172. struct WsExpressionRec
  173. {
  174.     WsExpressionType type;
  175.     WsUInt32 line;
  176.     union
  177.     {
  178.         struct
  179.         {
  180.             struct WsExpressionRec *left;
  181.             struct WsExpressionRec *right;
  182.         }
  183.         comma;
  184.         struct
  185.         {
  186.             /* The identifier that is modified. */
  187.             char *identifier;
  188.             /* The type of the assignment.  This is the assignment token
  189.                value: '=', tMULA, tDA, ... */
  190.             int op;
  191.             /* The expression to assign to the identifier `identifier'. */
  192.             struct WsExpressionRec *expr;
  193.         }
  194.         assign;
  195.         struct
  196.         {
  197.             struct WsExpressionRec *e_cond;
  198.             struct WsExpressionRec *e_then;
  199.             struct WsExpressionRec *e_else;
  200.         }
  201.         conditional;
  202.         struct
  203.         {
  204.             /* The type is the opcode of the short-circuit logical byte-code
  205.                operand. */
  206.             int type;
  207.             struct WsExpressionRec *left;
  208.             struct WsExpressionRec *right;
  209.         }
  210.         logical;
  211.         struct
  212.         {
  213.             /* The type is the opcode of the binary byte-code operand. */
  214.             int type;
  215.             struct WsExpressionRec *left;
  216.             struct WsExpressionRec *right;
  217.         }
  218.         binary;
  219.         struct
  220.         {
  221.             /* The type is the opcode of the unary byte-code operand. */
  222.             int type;
  223.             struct WsExpressionRec *expr;
  224.         }
  225.         unary;
  226.         struct
  227.         {
  228.             /* Is this an unary addition or substraction. */
  229.             WsBool addp;
  230.             char *variable;
  231.         }
  232.         unary_var;
  233.         struct
  234.         {
  235.             /* Is this a postfix addition or substraction. */
  236.             WsBool addp;
  237.             char *variable;
  238.         }
  239.         postfix_var;
  240.         struct
  241.         {
  242.             /* The type of the call: ' ', '#', '.' */
  243.             int type;
  244.             /* The name of the external module or library. */
  245.             char *base;
  246.             /* The name of the function to call. */
  247.             char *name;
  248.             /* The arguments of the call. */
  249.             WsList *arguments;
  250.         }
  251.         call;
  252.         struct
  253. {
  254.     /* Separate sign bit, so that we can tell the difference
  255.      * between -2147483648 and +2147483648.  We have to deal 
  256.      * with both, because the former is parsed as "-" "2147483648".
  257.      * Sign is 1 for positive numbers, -1 for negative numbers,
  258.      * and can be either 1 or -1 for zero.
  259.      */
  260.      int sign;
  261.      WsUInt32 ival;
  262.         } integer;
  263.         char *symbol;
  264.         WsUInt16 cindex;
  265.         WsFloat fval;
  266.         WsUtf8String string;
  267.     } u;
  268. };
  269. typedef struct WsExpressionRec WsExpression;
  270. /* Linearize the expression `expr' into symbolic byte-code
  271.    assembler. */
  272. void ws_expr_linearize(WsCompilerPtr compiler, WsExpression *expr);
  273. /* Constructors for different expression types. */
  274. /* Create a comma expression for `left' and `right'. */
  275. WsExpression *ws_expr_comma(WsCompilerPtr compiler, WsUInt32 line,
  276.                             WsExpression *left, WsExpression *right);
  277. /* Create an assignment expression.  The argument `type' specifies the
  278.    type of the expression.  It is the assignment token value. */
  279. WsExpression *ws_expr_assign(WsCompilerPtr compiler, WsUInt32 line,
  280.                              char *identifier, int op, WsExpression *expr);
  281. /* Create a conditional expression with condition `e_cond' and
  282.    expressions `e_then' and `e_else'. */
  283. WsExpression *ws_expr_conditional(WsCompilerPtr compiler, WsUInt32 line,
  284.                                   WsExpression *e_cond, WsExpression *e_then,
  285.                                   WsExpression *e_else);
  286. /* Create a logical expression of type `type'.  The argument `type' is
  287.    the opcode of the logical shoft-circuit byte-code operand. */
  288. WsExpression *ws_expr_logical(WsCompilerPtr compiler, WsUInt32 line,
  289.                               int type, WsExpression *left,
  290.                               WsExpression *right);
  291. /* Create a binary expression of type `type'.  The argument `type' is
  292.    the opcode of the binary byte-code operand. */
  293. WsExpression *ws_expr_binary(WsCompilerPtr compiler, WsUInt32 line,
  294.                              int type, WsExpression *left,
  295.                              WsExpression *right);
  296. /* Create an unary expression of type `type'.  The argument `type' is
  297.    the opcode of the unary byte-code operand. */
  298. WsExpression *ws_expr_unary(WsCompilerPtr compiler, WsUInt32 line,
  299.                             int type, WsExpression *expr);
  300. /* Create an unary variable modification expression.  The argument
  301.    `addp' specified whether the expression is an addition (++) or a
  302.    substraction (--) expression. */
  303. WsExpression *ws_expr_unary_var(WsCompilerPtr compiler, WsUInt32 line,
  304.                                 WsBool addp, char *variable);
  305. /* Create a postfix variable modification expression. The argument
  306.    `addp' specified whether the expression is an addition (++) or a
  307.    substraction (--) expression. */
  308. WsExpression *ws_expr_postfix_var(WsCompilerPtr compiler, WsUInt32 line,
  309.                                   WsBool addp, char *variable);
  310. /* A generic call expression.  The argument `type' must be one of ' ',
  311.    '#', or '.' for local, extern, or library function call
  312.    respectively. */
  313. WsExpression *ws_expr_call(WsCompilerPtr compiler, WsUInt32 linenum,
  314.                            int type, char *base, char *name,
  315.                            WsList *arguments);
  316. /* A symbol reference expression. */
  317. WsExpression *ws_expr_symbol(WsCompilerPtr compiler, WsUInt32 linenum,
  318.                              char *identifier);
  319. /* Constant `invalid'. */
  320. WsExpression *ws_expr_const_invalid(WsCompilerPtr compiler, WsUInt32 linenum);
  321. /* Constant `true'. */
  322. WsExpression *ws_expr_const_true(WsCompilerPtr compiler, WsUInt32 linenum);
  323. /* Constant `false'. */
  324. WsExpression *ws_expr_const_false(WsCompilerPtr compiler, WsUInt32 linenum);
  325. /* An unsigned 32 bit integer. */
  326. WsExpression *ws_expr_const_integer(WsCompilerPtr compiler, WsUInt32 linenum,
  327.                                     WsUInt32 ival);
  328. /* A floating point number. */
  329. WsExpression *ws_expr_const_float(WsCompilerPtr compiler, WsUInt32 linenum,
  330.                                   WsFloat fval);
  331. /* An UTF-8 encoded string. */
  332. WsExpression *ws_expr_const_string(WsCompilerPtr compiler, WsUInt32 linenum,
  333.                                    WsUtf8String *string);
  334. /********************* Misc syntax tree structures **********************/
  335. /* A variable declaration */
  336. struct WsVarDecRec
  337. {
  338.     char *name;
  339.     WsExpression *expr;
  340. };
  341. typedef struct WsVarDecRec WsVarDec;
  342. /* Create a new variable declaration */
  343. WsVarDec *ws_variable_declaration(WsCompilerPtr compiler,
  344.                                   char *name, WsExpression *expr);
  345. /* A function formal parameter */
  346. struct WsFormalParmRec
  347. {
  348.     WsUInt32 line;
  349.     char *name;
  350. };
  351. typedef struct WsFormalParmRec WsFormalParm;
  352. /* Create a new formal parameter */
  353. WsFormalParm *ws_formal_parameter(WsCompilerPtr compiler,
  354.                                   WsUInt32 line, char *name);
  355. /********************* Statements ***************************************/
  356. /* Statement types. */
  357. typedef enum
  358. {
  359.     WS_STMT_BLOCK,
  360.     WS_STMT_VARIABLE,
  361.     WS_STMT_EMPTY,
  362.     WS_STMT_EXPR,
  363.     WS_STMT_IF,
  364.     WS_STMT_FOR,
  365.     WS_STMT_WHILE,
  366.     WS_STMT_CONTINUE,
  367.     WS_STMT_BREAK,
  368.     WS_STMT_RETURN
  369. } WsStatementType;
  370. /* A statement. */
  371. struct WsStatementRec
  372. {
  373.     WsStatementType type;
  374.     WsUInt32 first_line;
  375.     WsUInt32 last_line;
  376.     union
  377.     {
  378.         WsList *block;
  379.         WsList *var;
  380.         WsExpression *expr;
  381.         struct
  382.         {
  383.             WsExpression *expr;
  384.             struct WsStatementRec *s_then;
  385.             struct WsStatementRec *s_else;
  386.         }
  387.         s_if ;
  388.         struct
  389.         {
  390.             WsList *init;
  391.             WsExpression *e1;
  392.             WsExpression *e2;
  393.             WsExpression *e3;
  394.             struct WsStatementRec *stmt;
  395.         }
  396.         s_for ;
  397.         struct
  398.         {
  399.             WsExpression *expr;
  400.             struct WsStatementRec *stmt;
  401.         }
  402.         s_while ;
  403.     } u;
  404. };
  405. typedef struct WsStatementRec WsStatement;
  406. /* Linearize the statement `stmt' into symbolic byte-code
  407.    assembler. */
  408. void ws_stmt_linearize(WsCompilerPtr compiler, WsStatement *stmt);
  409. /* Constructors for statements. */
  410. /* Create a new block statement from the statements `block'.  The
  411.    arguments `first_line' and `last_line' specify the first and last
  412.    line numbers of the block (the line numbers of the '{' and '}'
  413.    tokens). */
  414. WsStatement *ws_stmt_block(WsCompilerPtr compiler, WsUInt32 first_line,
  415.                            WsUInt32 last_line, WsList *block);
  416. /* Create a new variable initialization statement. */
  417. WsStatement *ws_stmt_variable(WsCompilerPtr compiler, WsUInt32 line,
  418.                               WsList *variables);
  419. /* Create a new empty statement. */
  420. WsStatement *ws_stmt_empty(WsCompilerPtr compiler, WsUInt32 line);
  421. /* Create a new expression statement. */
  422. WsStatement *ws_stmt_expr(WsCompilerPtr compiler, WsUInt32 line,
  423.                           WsExpression *expr);
  424. /* Create a new if statement. */
  425. WsStatement *ws_stmt_if (WsCompilerPtr compiler, WsUInt32 line,
  426.                          WsExpression *expr, WsStatement *s_then,
  427.                          WsStatement *s_else);
  428. /* Create a new for statement.  Only one of the arguments `init' and
  429.    `e1' can be defined.  The init must be given for statements which
  430.    has a VariableDeclarationList in the initialization block.  For the
  431.    C-like statements, the argument `e1' must be given for the
  432.    initialization expression. */
  433. WsStatement *ws_stmt_for (WsCompilerPtr compiler, WsUInt32 line, WsList *init,
  434.                           WsExpression *e1, WsExpression *e2, WsExpression *e3,
  435.                           WsStatement *stmt);
  436. /* Create a new while statement. */
  437. WsStatement *ws_stmt_while (WsCompilerPtr compiler, WsUInt32 line,
  438.                             WsExpression *expr, WsStatement *stmt);
  439. /* Create a new continue statement. */
  440. WsStatement *ws_stmt_continue(WsCompilerPtr compiler, WsUInt32 line);
  441. /* Create a new break statement. */
  442. WsStatement *ws_stmt_break(WsCompilerPtr compiler, WsUInt32 line);
  443. /* Create a new return statement.  The argument `expr' is the
  444.    expression to return.  If it is NULL, the return statement returns
  445.    an empty string. */
  446. WsStatement *ws_stmt_return(WsCompilerPtr compiler, WsUInt32 line,
  447.                             WsExpression *expr);
  448. #endif /* not WSSTREE_H */