From 9542e27e6178b24f285371e1947063e53f260a87 Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Tue, 4 Jun 2019 16:12:42 -0700 Subject: [PATCH] Add basic language grammar (without expressions) --- language.grammar | 63 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 language.grammar diff --git a/language.grammar b/language.grammar new file mode 100644 index 0000000..a3163db --- /dev/null +++ b/language.grammar @@ -0,0 +1,63 @@ +token whitespace = /[ \n\t]+/ [ skip ]; +token upper_identifier = /[A-Z_][a-z_A-Z0-9]*/; +token lower_identifier = /[a-z_][a-z_A-Z0-9]*/; +token kw_data = /data/; +token kw_type = /type/; +token kw_defn = /defn/; +token tkn_ocurly = /{/; +token tkn_ccurly = /}/; +token tkn_oparen = /\(/; +token tkn_cparen = /\)/; +token tkn_eq = /=/; +token tkn_comma = /,/; + +rule S = program; + +rule program + = definition program? + ; + +rule definition + = kw_data upper_identifier tkn_eq data_body + | kw_type upper_identifier tkn_eq type_body + | kw_defn lower_identifier params? tkn_eq defn_body + ; + +rule data_body + = tkn_ocurly data_elems tkn_ccurly + ; + +rule data_elems + = data_elem + | data_elem tkn_comma data_elems + ; + +rule data_elem + = upper_identifier + | upper_identifier tkn_oparen data_elem_types tkn_cparen + ; + +rule data_elem_types + = type + | type tkn_comma data_elem_types + ; + +rule type_body + = tkn_ocurly type tkn_ccurly + ; + +rule params + = lower_identifier params? + ; + +rule defn_body + = tkn_ocurly expr tkn_ccurly + ; + +rule expr + = lower_identifier + ; + +rule type + = upper_identifier + ;