Advertisement
Guest User

Untitled

a guest
Jun 15th, 2012
689
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
BNF 6.77 KB | None | 0 0
  1. %{
  2. #include <stdio.h>
  3.  
  4. #include "adreno/vm/vm.h"
  5. #include "adreno/vm/emit.h"
  6.  
  7. extern char ras_text[];
  8.  
  9. static AdrenoScript *emits;
  10. static AdrenoFunction *emitf;
  11.  
  12. %}
  13.  
  14. %token <string> IDENTIFIER STRING_LITERAL
  15. %token <integer> CONSTANT
  16. %token INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP
  17. %token AND_OP OR_OP MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN
  18. %token SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN
  19. %token XOR_ASSIGN OR_ASSIGN
  20.  
  21. %token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN
  22.  
  23. %expect 1
  24.  
  25. %start translation_unit
  26.  
  27. %union {
  28.     char *string;
  29.     unsigned int integer;
  30. }
  31.  
  32. %%
  33.  
  34. threat_as_ref
  35.     : { ras_set_prefix(P_REF); }
  36.     ;
  37.  
  38. func_call_start
  39.     :
  40.     ;
  41.  
  42. func_call_end
  43.     :
  44.     ;
  45.  
  46. variable
  47.     : IDENTIFIER                                                                    { ras_parse_variable_psh($1); aFree($1); }
  48.     ;
  49.  
  50. variable_ref
  51.     : threat_as_ref variable
  52.     ;
  53.  
  54. primary_expression
  55.     : variable
  56.     | CONSTANT                                                                      { ras_emit_op2(OP_LDC_I4, $1); }
  57.     | STRING_LITERAL                                                                { ras_emit_op2(OP_LDSTR, ras_add_str($1)); aFree($1); }
  58.     | '(' expression ')'
  59.     ;
  60.  
  61. postfix_expression
  62.     : primary_expression
  63.     | variable_ref '[' expression ']'                                               { ras_emit_op(OP_LDELEM); }
  64.     | func_call_start IDENTIFIER { ras_parse_variable_psh($2); aFree($2); } '(' ')' func_call_end
  65.     | func_call_start IDENTIFIER { ras_parse_variable_psh($2); aFree($2); } '(' argument_expression_list ')' func_call_end
  66.     | IDENTIFIER INC_OP                                                             { int id = ras_parse_variable($1); if (id != -1) ras_load_add(id); aFree($1); }
  67.     | IDENTIFIER DEC_OP                                                             { int id = ras_parse_variable($1); if (id != -1) ras_load_sub(id); aFree($1); }
  68.     ;
  69.  
  70. argument_expression_list
  71.     : assignment_expression
  72.     | argument_expression_list ',' assignment_expression
  73.     ;
  74.  
  75. unary_expression
  76.     : postfix_expression
  77.     | INC_OP IDENTIFIER                                                             { int id = ras_parse_variable($2); if (id != -1) ras_add_load(id); aFree($2); }
  78.     | DEC_OP IDENTIFIER                                                             { int id = ras_parse_variable($2); if (id != -1) ras_sub_load(id); aFree($2); }
  79.     | '-' multiplicative_expression                                                 { ras_emit_op(OP_NEG); }
  80.     | '~' multiplicative_expression                                                 { ras_emit_op(OP_NOT); }
  81.     | '!' multiplicative_expression                                                 { ras_emit_op(OP_LNOT); }
  82.     ;
  83.  
  84. multiplicative_expression
  85.     : unary_expression
  86.     | multiplicative_expression '*' unary_expression                                { ras_emit_op(OP_MUL); }
  87.     | multiplicative_expression '/' unary_expression                                { ras_emit_op(OP_DIV); }
  88.     | multiplicative_expression '%' unary_expression                                { ras_emit_op(OP_REM); }
  89.     ;
  90.  
  91. additive_expression
  92.     : multiplicative_expression
  93.     | additive_expression '+' multiplicative_expression                             { ras_emit_op(OP_ADD); }
  94.     | additive_expression '-' multiplicative_expression                             { ras_emit_op(OP_SUB); }
  95.     ;
  96.  
  97. shift_expression
  98.     : additive_expression
  99.     | shift_expression LEFT_OP additive_expression                                  { ras_emit_op(OP_SHL); }
  100.     | shift_expression RIGHT_OP additive_expression                                 { ras_emit_op(OP_SHR); }
  101.     ;
  102.  
  103. relational_expression
  104.     : shift_expression
  105.     | relational_expression '<' shift_expression                                    { ras_emit_op(OP_LT); }
  106.     | relational_expression '>' shift_expression                                    { ras_emit_op(OP_GT); }
  107.     | relational_expression LE_OP shift_expression                                  { ras_emit_op(OP_LET); }
  108.     | relational_expression GE_OP shift_expression                                  { ras_emit_op(OP_GET); }
  109.     ;
  110.  
  111. equality_expression
  112.     : relational_expression
  113.     | equality_expression EQ_OP relational_expression                               { ras_emit_op(OP_EQ); }
  114.     | equality_expression NE_OP relational_expression                               { ras_emit_op(OP_NE); }
  115.     ;
  116.  
  117. and_expression
  118.     : equality_expression
  119.     | and_expression '&' equality_expression                                        { ras_emit_op(OP_AND); }
  120.     ;
  121.  
  122. exclusive_or_expression
  123.     : and_expression
  124.     | exclusive_or_expression '^' and_expression                                    { ras_emit_op(OP_XOR); }
  125.     ;
  126.  
  127. inclusive_or_expression
  128.     : exclusive_or_expression
  129.     | inclusive_or_expression '|' exclusive_or_expression                           { ras_emit_op(OP_OR); }
  130.     ;
  131.  
  132. logical_and_expression
  133.     : inclusive_or_expression
  134.     | logical_and_expression AND_OP inclusive_or_expression                         { ras_emit_op(OP_LAND); }
  135.     ;
  136.  
  137. logical_or_expression
  138.     : logical_and_expression
  139.     | logical_or_expression OR_OP logical_and_expression                            { ras_emit_op(OP_LOR); }
  140.     ;
  141.  
  142. conditional_expression
  143.     : logical_or_expression
  144.     | logical_or_expression '?' expression ':' conditional_expression
  145.     ;
  146.  
  147. assignment_expression
  148.     : conditional_expression
  149.     | variable_ref '=' assignment_expression                                        { ras_assign(); }
  150.     | variable_ref MUL_ASSIGN assignment_expression                                 { ras_assign_op(OP_MUL); }
  151.     | variable_ref DIV_ASSIGN assignment_expression                                 { ras_assign_op(OP_DIV); }
  152.     | variable_ref MOD_ASSIGN assignment_expression                                 { ras_assign_op(OP_REM); }
  153.     | variable_ref ADD_ASSIGN assignment_expression                                 { ras_assign_op(OP_ADD); }
  154.     | variable_ref SUB_ASSIGN assignment_expression                                 { ras_assign_op(OP_SUB); }
  155.     | variable_ref LEFT_ASSIGN assignment_expression                                { ras_assign_op(OP_SHL); }
  156.     | variable_ref RIGHT_ASSIGN assignment_expression                               { ras_assign_op(OP_SHR); }
  157.     | variable_ref AND_ASSIGN assignment_expression                                 { ras_assign_op(OP_AND); }
  158.     | variable_ref XOR_ASSIGN assignment_expression                                 { ras_assign_op(OP_XOR); }
  159.     | variable_ref OR_ASSIGN assignment_expression                                  { ras_assign_op(OP_OR); }
  160.     ;
  161.  
  162. expression
  163.     : assignment_expression
  164.     ;
  165.  
  166. constant_expression
  167.     : conditional_expression
  168.     ;
  169.  
  170. labeled_statement
  171.     : IDENTIFIER ':' statement                                                      { ras_start_function($1); aFree($1); }
  172.     | CASE constant_expression ':' statement
  173.     | DEFAULT ':' statement
  174.     ;
  175.  
  176. expression_statement
  177.     : ';'
  178.     | expression ';'
  179.     | func_call_start IDENTIFIER { ras_parse_variable_psh($2); aFree($2); } func_call_end ';'
  180.     | func_call_start IDENTIFIER { ras_parse_variable_psh($2); aFree($2); } argument_expression_list func_call_end ';'
  181.     ;
  182.  
  183. selection_statement
  184.     : IF '(' expression ')' statement
  185.     | IF '(' expression ')' statement ELSE statement
  186.     | SWITCH '(' expression ')' statement
  187.     ;
  188.  
  189. iteration_statement
  190.     : WHILE '(' expression ')' statement
  191.     | DO statement WHILE '(' expression ')' ';'
  192.     | FOR '(' expression_statement expression_statement ')' statement
  193.     | FOR '(' expression_statement expression_statement expression ')' statement
  194.     ;
  195.  
  196. jump_statement
  197.     : GOTO IDENTIFIER ';'
  198.     | CONTINUE ';'
  199.     | BREAK ';'
  200.     | RETURN ';'
  201.     | RETURN expression ';'
  202.     ;
  203.  
  204. statement
  205.     : labeled_statement
  206.     | compound_statement
  207.     | expression_statement
  208.     | selection_statement
  209.     | iteration_statement
  210.     | jump_statement
  211.     ;
  212.  
  213. statement_list
  214.     : statement
  215.     | statement_list statement
  216.     ;
  217.  
  218. compound_statement
  219.     : '{' '}'
  220.     | '{' statement_list '}'
  221.     ;
  222.  
  223. translation_unit
  224.     : { ras_emit_op(OP_ENTER); } compound_statement { ras_emit_op(OP_END); }
  225.     ;
  226.  
  227. %%
  228.  
  229. void yyerror(char *s)
  230. {
  231.     fflush(stdout);
  232.     printf("%s\n", s);
  233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement