script

script.git
git clone git://git.lenczewski.org/script.git
Log | Files | Refs

script.grammar (1964B)


      1 program =
      2   | symbol program
      3   | $eof
      4   ;
      5 
      6 identifier =
      7   | $(sequence of alphanumeric chars or '_' not starting with a number)
      8   ;
      9 
     10 literal =
     11   | int-literal
     12   | chr-literal
     13   | str-literal
     14   ;
     15 
     16 int-literal =
     17   | $(optionally prefixed series of numbers)
     18   ;
     19 
     20 chr-literal =
     21   | '\'' $(optionally escaped ascii codepoint) '\''
     22   ;
     23 
     24 str-literal =
     25   | '"' $(sequence of optionally escaped ascii codepoints) '"'
     26   ;
     27 
     28 symbol =
     29   | type-definition
     30   | func-definition
     31   | var-definition
     32   ;
     33 
     34 type-definition =
     35   | identifier-list '::' typename
     36   ;
     37 
     38 identifier-list =
     39   | identifier
     40   | identifier ',' identifier-list
     41   ;
     42 
     43 typename =
     44   | 'utf8'
     45   | 'chr8'
     46   | 'u64'
     47   | 's64'
     48   | identifier
     49   | pointer-type
     50   | array-type
     51   | struct-type
     52   ;
     53 
     54 pointer-type =
     55   | '*' typename
     56   ;
     57 
     58 array-type =
     59   | '[' int-literal ']' typename
     60   ;
     61 
     62 struct-type =
     63   | 'struct' '{' [ struct-member-list ] '}'
     64   ;
     65 
     66 struct-member-list =
     67   | struct-member
     68   | struct-member struct-member-list
     69   ;
     70 
     71 struct-member =
     72   | identifier-list ':' typename ';'
     73   ;
     74 
     75 var-definition =
     76   | identifier-list ':' typename [ '=' initialiser ] ';'
     77   ;
     78 
     79 initialiser =
     80   | literal
     81   | expression
     82   | '.' identifier '=' initialiser
     83   | '{' [ initialiser-list ] '}'
     84   ;
     85 
     86 expression =
     87   | literal
     88   | identifier
     89   ;
     90 
     91 initialiser-list =
     92   | initialiser
     93   | initialiser ',' initialiser-list
     94   ;
     95 
     96 fn-definition =
     97   | identifier '::' '(' [ fn-parameter-list ] ')' ':' fn-rettype fn-body
     98   ;
     99 
    100 fn-parameter-list =
    101   | fn-parameter
    102   | fn-parameter ',' fn-parameter-list
    103   ;
    104 
    105 fn-parameter =
    106   | identifier ':' typename
    107   ;
    108 
    109 fn-rettype =
    110   | 'void'
    111   | typename
    112   ;
    113 
    114 fn-body =
    115   | '{' [ statement-list ] '}'
    116   ;
    117 
    118 statement-list =
    119   | statement
    120   | statement statement-list
    121   ;
    122 
    123 statement =
    124   | var-definition
    125   | block-statement
    126   | return-statement
    127   | expr-statement
    128   ;
    129 
    130 block-statement =
    131   | '{' [ statement-list ] '}'
    132   ;
    133 
    134 return-statement =
    135   | 'return' [ expression ] ';'
    136   ;
    137 
    138 expr-statement =
    139   | expression ';'
    140   ;