compiler

Unnamed Compiled Systems Language Project
git clone http://frotz.net/git/compiler.git
Log | Files | Refs

bnf.txt (2391B)


      1 
      2 program := { vardef ";" | funcdef ( ";" | block) | typedef ";" | enumdef ";" }
      3 
      4 
      5 vardef := "var" ident [ ":" type ] [ "=" <expr> ]
      6 
      7 
      8 funcdef := "func" ident "(" [ paramdef { "," paramdef } ] ")" [ type ] 
      9 
     10 paramdef := ident ":" type
     11 
     12 
     13 structdef := "struct" [ "(" qualident ")" ] "{" { fielddef } "}"
     14 
     15 fielddef := ident ":" type ","
     16 
     17 
     18 arraydef := "[" integer { "," integer } "]" type
     19 
     20 slicedef := "[" "]" type
     21 
     22 
     23 enumdef := "enum" "{" { ident "," } "}"
     24 
     25 
     26 typedef := "type" ident type
     27 
     28 
     29 type := ident | slicedef | arraydef | structdef | structdef | funcdef | enumdef
     30 
     31 
     32 operand := literal | identifier | "(" expression ")"
     33 literal := integer | string | "true" | "false" | "nil"
     34 
     35 primary-expr := operand | conversion | primary-expr selector | primary-expr index | primary-expr arguments
     36 selector := "." identifier
     37 index := "[" expr "]"
     38 arguments := "(" [ expr { "," expr } ] ")"
     39 
     40 factor := integer | string | special | designator [ params ] | "(" expr ")" | "~" factor
     41 term := factor { mulop factor }
     42 simpleexpr := [ "+" | "-" ] term { addop term }
     43 expr := simpleexpr [ relop simpleexpr ]
     44 
     45 unary-expr := primary-expr | unary-op unary-expr
     46 mul-expr := unary-expr { mul-op unary-expr }
     47 add-expr := mul-expr { add-op mul-expr }
     48 rel-expr := add-expr [ rel-op add-expr ]
     49 and-expr := rel-expr { "&&" rel-expr }
     50 expr := and-expr { "||" and-expr }
     51 
     52 unary-op := "+" | "-" | "!" | "~" | "&"
     53 mul-op := "*" | "/" | "%" | "<<" | ">>" | "&" | "&~"
     54 add-op := "+" | "-" | "|" | "^"
     55 rel-op := "==" | "!=" | "<" | "<=" | ">" | ">="
     56 
     57 integer := digit {digit} | "0" "x" {hexdigit} | "0" "b" {bindigit}
     58 
     59 hexdigit := "A" .. "F" | "a" .. "f" | "0" .. "9"
     60 
     61 bindigit := "0" | "1"
     62 
     63 digit := "0" .. "9"
     64 
     65 
     66 designator := qualident { selector }
     67 
     68 selector := "." ident | "[" explist "]" | "->"
     69 
     70 explist := expr { "," expr }
     71 
     72 params := "(" explist ")"
     73 
     74 
     75 qualident := [ indent "." ] ident
     76 
     77 ident := ( letter | "_" ) | { letter | digit | "_" } 
     78 
     79 letter := "A" .. "Z" | "a" .. "z" 
     80 
     81 statement := assignment | if | while | for | break | return | incdec | expr ";" | ";"
     82 
     83 assignment := designator assign-op expr ";"
     84 
     85 incdec := expr ( "++" | "--" ) ";"
     86 
     87 assign-op := "=" | ( add-op | mul-op ) "="
     88 
     89 if := "if" expr block { "else" "if" expr block } [ "else" block ]
     90 
     91 while := "while" expr block
     92 
     93 for := "for" [ expr ] ";" [ expr ] ";" [ expr ] block
     94 
     95 break := "break" ";"
     96 
     97 return := "return" expr ";"
     98 
     99 block := "{" { statement } "}"
    100 
    101