Advertisement
Guest User

Untitled

a guest
Mar 1st, 2017
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.99 KB | None | 0 0
  1.  
  2. single_char := ? Terminals.LetterOrDigit ?;
  3.  
  4. name := single_char { single_char };
  5.  
  6. program = { assert | vardecl | typedecl };
  7.  
  8. typedecl = 'type' name '=' type ';';
  9.  
  10. vardecl = ('var' | 'const') name [ ':' type ] ['=' expression] ';';
  11.  
  12. type = generic_type | record_type | function_signature | name;
  13.  
  14. (* Generics don't allow an empty expression list as arguments
  15. * As they won't be generic anymore if they don't have parameters
  16. *)
  17. (* <,> is used here *)
  18. generic_type = name '<' expression_list '>';
  19.  
  20. record_type = 'record' '(' [ record_member { ',' record_member } ] ')';
  21.  
  22. record_member = name ':' type;
  23.  
  24. function_signature = 'fn' name '(' [ parameter { ',' parameter } ] ')' [ '->' type ];
  25.  
  26. parameter = name ':' type;
  27.  
  28. expression = braced_expression | binop_expression | unop_expression | indexer | function | literal;
  29.  
  30. expression_list = expression { ',' expression };
  31.  
  32. braced_expression = '(' expression ')' ;
  33.  
  34. binop_expression = (expression binop expression);
  35. unop_expression = unop expression;
  36.  
  37. literal = record | fncall | name | hexnum | number;
  38.  
  39. hexnum := '0x' {? Terminals.HexDigit ?};
  40. number := {? Terminals.Digit ?};
  41. fncall = name '(' [ expression_list ] ')';
  42. record = 'record' '(' [expression_list] ')';
  43.  
  44. indexer = expression (indexer_direct | indexer_indirect);
  45. indexer_direct = indexer_direct_t name;
  46. indexer_direct_t = '.' | "'";
  47. indexer_indirect = '[' expression { ',' expression } ']';
  48.  
  49. unop = '+' | '-' | '!' | '~';
  50.  
  51. (* <,> is used here *)
  52. binop = '+' | '-' | '*' | '/' | '%' | '&' | '|' | '==' | '=' | '!='| '>=' | '<=' | '<' | '>' ;
  53.  
  54. function = function_signature body;
  55.  
  56. instruction = ';' | typedecl | vardecl | assert | return | body | if | while | break | continue | expression;
  57.  
  58. body = '{' { instruction} '}';
  59.  
  60. if = 'if' expression instruction [ 'else' instruction ];
  61.  
  62. while = 'while' expression instruction;
  63.  
  64. break = 'break' ';';
  65. continue = 'continue' ';';
  66. return = 'return' [ expression ] ';';
  67. assert = 'assert' expression ';';
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement