tree-sitter/spec/fixtures/grammars/cpp.cc
2016-01-08 15:51:30 -08:00

223 lines
5 KiB
C++

#include "tree_sitter/compiler.h"
#include "helpers.h"
namespace tree_sitter_examples {
// http://slps.github.io/zoo/cpp/iso-n2723.html
extern const Grammar cpp{{
{ "translation_unit", repeat(sym("_declaration")) },
{ "_declaration", choice({
sym("_block_declaration"),
sym("function_definition") }) },
{ "_block_declaration", choice({
sym("simple_declaration"),
sym("namespace_alias_definition"), }) },
{ "function_definition", seq({
repeat(sym("decl_specifier")),
sym("type_specifier"),
sym("declarator"),
choice({
sym("function_body"),
seq({
str("="),
choice({
str("default"),
str("delete") }),
str(";") }) }) }) },
{ "simple_declaration", seq({
repeat(sym("decl_specifier")),
sym("type_specifier"),
comma_sep1(sym("init_declarator")),
str(";") }) },
{ "namespace_alias_definition", seq({
str("namespace"),
sym("identifier"),
str("="),
sym("scoped_identifier") }) },
{ "scoped_identifier", seq({
sym("identifier"),
str("::"),
choice({
sym("identifier"),
sym("scoped_identifier") }) }) },
{ "declarator", seq({
repeat(sym("pointer_operator")),
sym("direct_declarator") }) },
{ "abstract_declarator", seq({
repeat(sym("pointer_operator")),
sym("direct_abstract_declarator") }) },
{ "direct_declarator", choice({
sym("identifier"),
seq({
str("("),
sym("declarator"),
str(")") }),
seq({
sym("direct_declarator"),
str("("),
comma_sep(sym("parameter_declaration")),
str(")") }) }) },
{ "parameter_declaration", seq({
repeat(sym("decl_specifier")),
sym("type_specifier"),
choice({
sym("declarator"),
sym("abstract_declarator") }) }) },
{ "direct_abstract_declarator", choice({
seq({
str("("),
sym("abstract_declarator"),
str(")") }) }) },
{ "cv_qualifier", choice({
str("const"),
str("volatile") }) },
{ "type_id", seq({
sym("type_specifier"),
optional(sym("abstract_declarator")) }) },
{ "pointer_operator", choice({
seq({ str("*"), repeat(sym("cv_qualifier")) }),
str("&"),
str("&&") }) },
{ "type_name", choice({
sym("identifier"),
sym("template_call") }) },
{ "function_body", choice({
// sym("function_try_block"),
seq({
optional(sym("constructor_initializer")),
sym("compound_statement") }) }) },
{ "constructor_initializer", seq({
str(":"),
repeat(sym("member_initializer")),
optional(str("...")) }) },
{ "member_initializer", seq({
sym("identifier"),
choice({
// sym("braced_initializer_list"),
seq({
str("("),
str("initializer_list"),
str(")") }) }) }) },
{ "init_declarator", seq({
sym("declarator"),
optional(sym("initializer")) }) },
{ "decl_specifier", choice({
sym("storage_class_specifier"),
sym("function_specifier"),
str("friend"),
str("typedef"),
str("constexpr") }) },
{ "storage_class_specifier", choice({
str("register"),
str("static"),
str("thread_local"),
str("extern"),
str("mutable") }) },
{ "type_specifier", choice({
sym("scoped_identifier"),
sym("template_call"),
sym("identifier") }) },
{ "compound_statement", seq({
str("{"),
repeat(sym("_statement")),
str("}") }) },
{ "_statement", choice({
sym("compound_statement"),
sym("_block_declaration"),
sym("expression_statement") }) },
{ "expression_statement", seq({
optional(sym("_expression")),
str(";") }) },
{ "initializer", choice({
// sym("braced_initializer_list"),
seq({
str("="),
sym("initializer_clause") }) }) },
{ "initializer_clause", choice({
// sym("braced_initializer_list"),
sym("_expression") }) },
{ "function_specifier", choice({
str("inline"),
str("virtual"),
str("explicit") }) },
{ "_expression", choice({
sym("relational_expression"),
sym("call_expression"),
sym("identifier"),
sym("template_call"),
sym("scoped_identifier"),
sym("string"),
sym("number") }) },
{ "call_expression", seq({
sym("_expression"),
str("("),
comma_sep(sym("_expression")),
str(")") }) },
{ "relational_expression", prec_left(seq({
sym("_expression"),
choice({
str(">"),
str(">="),
str("=="),
str("!="),
str("<="),
str("<") }),
sym("_expression") })) },
{ "template_call", seq({
choice({ sym("identifier"), sym("scoped_identifier") }),
str("<"),
choice({
sym("_expression"),
sym("type_id") }),
str(">") }) },
{ "string", delimited("\"") },
{ "identifier", pattern("\\a[\\w_]*") },
{ "number", pattern("\\d+(\\.\\d+)?") },
{ "comment", pattern("//[^\n]*") },
}, {
sym("comment"),
pattern("[ \t\r\n]"),
}, {
{ "type_specifier", "_expression" },
{ "template_call", "_expression" },
{ "template_call", "relational_expression" },
}};
} // namespace tree_sitter_examples