Advertisement
Guest User

Untitled

a guest
Feb 2nd, 2016
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
BNF 10.12 KB | None | 0 0
  1. %skeleton "lalr1.cc"
  2. %require "3.0.4"
  3. %defines
  4. %locations
  5.  
  6. %define parser_class_name {matlab_parser}
  7. %define api.value.type variant
  8. %define api.token.constructor
  9. %define parse.assert
  10. %define parse.trace
  11. %define parse.error verbose
  12. %define api.token.prefix {TOK_}
  13.  
  14. %code requires
  15. {
  16.     #include <string>
  17.     #include <vector>
  18.     #include <cstdint>
  19.     class matlab2r_driver;
  20. }
  21.  
  22. %param { matlab2r_driver& driver }
  23. %printer { yyoutput << $$; } <*>;
  24.  
  25. %initial-action
  26. {
  27.     // Initialize the initial location
  28.     @$.begin.filename = @$.end.filename = &driver.streamname;
  29. }
  30.  
  31. %code
  32. {
  33.     #include "matlab2r_driver.hpp"
  34.     #include "matlab_lexer.hpp"
  35.     #include <sstream>
  36.     #undef yylex
  37.     #define yylex driver.lexer->lex
  38. }
  39.  
  40. // Tokens
  41. %token
  42.     END     0       "end of file"
  43.     NEWLINE 10      "newline"
  44.     BREAK
  45.     CASE
  46.     CATCH
  47.     CLEAR
  48.     CONTINUE
  49.     ELSE
  50.     END_KEYW
  51.     ELSEIF
  52.     FOR
  53.     FUNCTION
  54.     GLOBAL
  55.     IF
  56.     OTHERWISE
  57.     PERSISTENT
  58.     RETURN
  59.     SWITCH
  60.     TRY
  61.     WHILE
  62.     AMUL
  63.     APOW
  64.     ADIV
  65.     ARDIV
  66.     TRANSPOSE
  67.     NCTRANSPOSE
  68.     LE_OP
  69.     GE_OP
  70.     EQ_OP
  71.     NE_OP
  72.     TILDE
  73.     SEMICOLON
  74.     COMMA
  75.     COLON
  76.     EQUALS
  77.     LPAREN
  78.     RPAREN
  79.     LBRACKET
  80.     RBRACKET
  81.     LBRACE
  82.     RBRACE
  83.     AMP
  84.     MINUS
  85.     PLUS
  86.     TIMES
  87.     FSLASH
  88.     BSLASH
  89.     LT_OP
  90.     GT_OP
  91.     POW
  92.     VBAR
  93.     DOT
  94.  
  95. %token <std::string>        IDENTIFIER
  96. %token <std::string>        CONSTANT
  97. %token <std::string>        STRING_LITERAL
  98. %token <std::string>        NAKED_ARG
  99. /*
  100. // Rule types
  101. %type <ast::line_list_p>        lines
  102. %type <ast::line_list_p>        lines_tail
  103. %type <ast::line_p>             line
  104. %type <ast::conditional_p>      conditional
  105. %type <ast::expr_p>             expr
  106. %type <ast::for_stmt_p>         for_stmt
  107. %type <ast::if_stmt_p>          if_stmt
  108. %type <ast::else_stmt_p>        else_stmt
  109. %type <ast::funcall_p>          funcall
  110. %type <ast::funcall_p>          funcall_inner
  111. %type <ast::args_list_p>        args_list
  112. %type <ast::dimension_p>        dimension
  113. %type <ast::qualified_id_p>     qualified_id
  114. %type <ast::qualified_id_p>     qualified_id_tail
  115. %type <ast::range_p>            range
  116.  */
  117.  
  118. %left VBAR
  119. %left AMP
  120. %left GT_OP GE_OP LT_OP LE_OP EQ_OP NE_OP
  121. %left PLUS MINUS
  122. %left TIMES FSLASH BSLASH POW AMUL ADIV ARDIV APOW
  123.  
  124. %%
  125.  
  126. %start matlab_unit;
  127.  
  128. matlab_unit
  129.         /* : empty_lines function_declare_list */
  130.         : statement_list { }
  131.         ;
  132.  
  133. eostmt  : COMMA { }
  134.         | SEMICOLON { }
  135.         | NEWLINE { }
  136.         ;
  137.  
  138. eostmt_or_eof
  139.         : COMMA { }
  140.         | SEMICOLON { }
  141.         | NEWLINE { }
  142.         | END { }
  143.         ;
  144.  
  145. /******************************************************************************
  146.  * Function decls
  147.  *****************************************************************************/
  148.  
  149. function_declare
  150.         : FUNCTION function_declare_lhs eostmt statement_list optional_end { }
  151.         | FUNCTION func_return_list EQUALS function_declare_lhs eostmt statement_list optional_end { }
  152.         ;
  153.  
  154. optional_end
  155.         : END_KEYW eostmt_or_eof { }
  156.         | %empty { }
  157.         ;
  158.  
  159. func_return_list
  160.         : IDENTIFIER { }
  161.         | LBRACKET func_ident_list RBRACKET { }
  162.         ;
  163.  
  164. function_declare_lhs
  165.         : IDENTIFIER { }
  166.         | IDENTIFIER LPAREN RPAREN { }
  167.         | IDENTIFIER LPAREN func_ident_list RPAREN { }
  168.         ;
  169.  
  170. func_ident_list
  171.         : IDENTIFIER { }
  172.         | IDENTIFIER COMMA func_ident_list { }
  173.         ;
  174.  
  175. /******************************************************************************
  176.  * Statements
  177.  *****************************************************************************/
  178.  
  179. statement_list
  180.         : statement statement_list_tail { }
  181.         | %empty { }
  182.         ;
  183.  
  184. statement_list_tail
  185.         : statement statement_list_tail { }
  186.         | %empty { }
  187.         //| error { yyerrok; }
  188.         ;
  189.  
  190. statement
  191.         : global_statement { }
  192.         | clear_statement { }
  193.         | assignment_statement { }
  194.         | selection_statement { }
  195.         | iteration_statement { }
  196.         | jump_statement { }
  197.         | try_catch_statement { }
  198.         | function_declare { }
  199.         | naked_funcall { }
  200.         | expression_statement { }
  201.         | eostmt { }
  202.         ;
  203.  
  204. naked_funcall
  205.         : IDENTIFIER IDENTIFIER { driver.lexer->begin_naked_args(); } naked_args eostmt_or_eof { }
  206.         | IDENTIFIER eostmt_or_eof
  207.         ;
  208.  
  209. global_statement
  210.         : GLOBAL identifier_list eostmt_or_eof { }
  211.         ;
  212.  
  213. clear_statement
  214.         : CLEAR identifier_list eostmt_or_eof { }
  215.         | CLEAR eostmt_or_eof { }
  216.         ;
  217.  
  218. expression_statement
  219.         : expression eostmt_or_eof { }
  220.         ;
  221.  
  222. assignment_statement
  223.         : assignment_expression eostmt_or_eof { }
  224.         ;
  225.  
  226. selection_statement
  227.         : IF expression statement_list elseif_clause else_clause END_KEYW eostmt_or_eof { }
  228.         /*
  229.         | IF expression eostmt statement_list ELSE statement_list END_KEYW eostmt_or_eof
  230.         | IF expression eostmt statement_list elseif_clause END_KEYW eostmt_or_eof
  231.         | IF expression eostmt statement_list elseif_clause ELSE statement_list END_KEYW eostmt_or_eof
  232.         */
  233.         | SWITCH expression eostmt case_list otherwise_clause END_KEYW eostmt_or_eof { }
  234.         ;
  235.  
  236. else_clause
  237.         : ELSE statement_list { }
  238.         | %empty { }
  239.         ;
  240.  
  241. elseif_clause
  242.         : ELSEIF expression statement_list elseif_clause { }
  243.         | %empty { }
  244.         ;
  245.  
  246. case_list
  247.         : CASE expression eostmt statement_list case_list { }
  248.         | eostmt case_list
  249.         | %empty { }
  250.         ;
  251.  
  252. otherwise_clause
  253.         : OTHERWISE eostmt statement_list { }
  254.         | %empty { }
  255.         ;
  256.  
  257. iteration_statement
  258.         : WHILE expression statement_list END_KEYW eostmt_or_eof { }
  259.         | FOR IDENTIFIER EQUALS expression statement_list END_KEYW eostmt_or_eof { }
  260.         | FOR LPAREN IDENTIFIER EQUALS expression RPAREN statement_list END_KEYW eostmt_or_eof { }
  261.         ;
  262.  
  263. jump_statement
  264.         : BREAK eostmt { }
  265.         | CONTINUE eostmt { }
  266.         | RETURN eostmt { }
  267.         ;
  268.  
  269. identifier_list
  270.         : IDENTIFIER { }
  271.         | identifier_list IDENTIFIER { }
  272.         ;
  273.  
  274. try_catch_statement
  275.         : TRY statement_list catch_statement END_KEYW eostmt_or_eof { }
  276.         | TRY statement_list END_KEYW eostmt_or_eof { }
  277.         ;
  278.  
  279. catch_statement
  280.         : CATCH IDENTIFIER statement_list { }
  281.         | CATCH statement_list { }
  282.         ;
  283.  
  284. naked_args
  285.         : NAKED_ARG naked_args { }
  286.         | %empty { }
  287.         ;
  288.  
  289. /******************************************************************************
  290.  * Expressions
  291.  *****************************************************************************/
  292.  
  293. assignment_expression
  294.         : postfix_expression EQUALS expression { }
  295.         ;
  296.  
  297. postfix_expression
  298.         : primary_expression { }
  299.         | qualified_id { }
  300.         | postfix_expression TRANSPOSE { }
  301.         | postfix_expression NCTRANSPOSE { }
  302.         ;
  303.  
  304. primary_expression
  305.         : STRING_LITERAL { }
  306.         | CONSTANT { }
  307.         | LBRACKET RBRACKET { }
  308.         | LBRACE RBRACE { }
  309.         ;
  310.  
  311. expression
  312.         : boolean_expression { }
  313.         | boolean_expression COLON expression { }
  314.         ;
  315.  
  316. boolean_expression
  317.         : mathematical_expression { }
  318.         | boolean_expression VBAR mathematical_expression { }
  319.         | boolean_expression AMP mathematical_expression { }
  320.         | boolean_expression EQ_OP mathematical_expression { }
  321.         | boolean_expression NE_OP mathematical_expression { }
  322.         | boolean_expression LT_OP mathematical_expression { }
  323.         | boolean_expression GT_OP mathematical_expression { }
  324.         | boolean_expression LE_OP mathematical_expression { }
  325.         | boolean_expression GE_OP mathematical_expression { }
  326.         ;
  327.  
  328. mathematical_expression
  329.         : unary_expression { }
  330.         | mathematical_expression PLUS unary_expression { }
  331.         | mathematical_expression MINUS unary_expression { }
  332.         | mathematical_expression TIMES unary_expression { }
  333.         | mathematical_expression FSLASH unary_expression { }
  334.         | mathematical_expression BSLASH unary_expression { }
  335.         | mathematical_expression POW unary_expression { }
  336.         | mathematical_expression AMUL unary_expression { }
  337.         | mathematical_expression ADIV unary_expression { }
  338.         | mathematical_expression ARDIV unary_expression { }
  339.         | mathematical_expression APOW unary_expression { }
  340.         ;
  341.  
  342. unary_expression
  343.         : postfix_expression { }
  344.         | unary_operator postfix_expression { }
  345.         ;
  346.  
  347. unary_operator
  348.         : PLUS { }
  349.         | MINUS { }
  350.         | TILDE { }
  351.         ;
  352.  
  353. array_or_funcall_tail
  354.         : LPAREN index_expression_list RPAREN { }
  355.         | LPAREN RPAREN { }
  356.         ;
  357.  
  358. array_cell_tail
  359.         : LBRACE index_expression_list RBRACE { }
  360.         ;
  361.  
  362. index_expression_list
  363.         : index_expression { }
  364.         | index_expression COMMA index_expression_list { }
  365.         ;
  366.  
  367. index_expression
  368.         : COLON { }
  369.         | expression { }
  370.         ;
  371.  
  372. qualified_id
  373.         : qualified_id_item { }
  374.         | qualified_id_item DOT qualified_id { }
  375.         ;
  376.  
  377. qualified_id_item
  378.         : IDENTIFIER { }
  379.         | qualified_id_item array_or_funcall_tail { }
  380.         | qualified_id_item array_cell_tail { }
  381.         | LPAREN expression RPAREN { }
  382.         | LBRACKET array_col_list RBRACKET { }
  383.         | LBRACE array_col_list RBRACE { }
  384.         ;
  385.  
  386. /******************************************************************************
  387.  * Array indexing
  388.  *****************************************************************************/
  389.  
  390. array_row_list
  391.         : expression { }
  392.         | expression COMMA { }
  393.         | expression array_row_list { }
  394.         | expression COMMA array_row_list { }
  395.         | NEWLINE array_row_list { }
  396.         ;
  397.  
  398. array_col_list
  399.         : array_row_list { }
  400.         | array_row_list SEMICOLON array_col_list { }
  401.         | NEWLINE array_col_list { }
  402.         ;
  403.  
  404. %%
  405.  
  406. void yy::matlab_parser::error(const location_type& l, const std::string& m)
  407. {
  408.     driver.error(l, m);
  409. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement