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