tree-sitter/spec/fixtures/grammars/cpp.cc
Max Brunsfeld bd77ab1ac9 Move public rule functions out of rule namespace
This way, there's only one public namespace: tree_sitter
2015-09-03 17:49:20 -07:00

121 lines
4.1 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 =
Grammar(
{
{ "expression", repeat(sym("declaration")) },
{ "declaration", sym("function_definition") },
{ "function_definition",
seq({ optional(sym("declaration_specifiers")), sym("type_specifier"),
sym("declarator"), repeat(sym("declaration")),
sym("compound_statement") }) },
{ "declaration_specifiers",
repeat1(
choice({ sym("storage_class_specifier"), sym("type_qualifier") })) },
{ "storage_class_specifier",
choice({ str("typedef"), str("extern"), str("static"), str("auto"),
str("register") }) },
{ "type_specifier",
choice({ sym("struct_specifier"),
seq({ repeat(choice({ str("signed"), str("unsigned"),
str("long"), str("short") })),
sym("identifier") }) }) },
{ "struct_specifier",
seq(
{ str("struct"), optional(sym("identifier")),
seq({ str("{"), repeat(sym("struct_declaration")), str("}") }) }) },
{ "struct_declaration",
seq({ sym("type_specifier"), sym("declarator") }) },
{ "parameter_declaration",
seq({ optional(sym("declaration_specifiers")), sym("type_specifier"),
sym("declarator") }) },
{ "declaration",
seq({ optional(sym("declaration_specifiers")), sym("type_specifier"),
comma_sep1(sym("init_declarator")), str(";") }) },
{ "init_declarator",
choice({ sym("declarator"),
seq({ sym("declarator"), str("="), sym("initializer") }) }) },
{ "initializer",
choice({ sym("expression"), seq({ str("{"), sym("initializer_list"),
optional(str(",")), str("}") }) }) },
{ "initializer_list",
choice({ seq({ optional(sym("designation")), sym("initializer") }),
seq({ sym("initializer_list"), str(","),
optional(sym("designation")), sym("initializer") }) }) },
{ "designation",
seq({ repeat1(choice({ seq({ str("["), sym("expression"), str("]") }),
seq({ str("."), sym("identifier") }) })),
str("=") }) },
{ "declarator", seq({ repeat(sym("star")), sym("direct_declarator") }) },
{ "direct_declarator",
choice(
{ sym("identifier"), seq({ str("("), sym("declarator"), str(")") }),
seq({ sym("direct_declarator"), str("["),
optional(sym("expression")), str("]") }),
seq({ sym("direct_declarator"), str("("),
comma_sep(sym("parameter_declaration")), str(")") }) }) },
{ "type_qualifier",
choice({ str("const"), str("restrict"), str("volatile") }) },
{ "star", str("*") },
{ "compound_statement",
seq({ str("{"),
repeat(choice({ sym("declaration"), sym("statement") })),
str("}") }) },
{ "expression",
choice({ sym("math_expression"), sym("call_expression"), sym("string"),
sym("identifier"), sym("number") }) },
{ "math_expression",
choice(
{ prec(1, seq({ sym("expression"), str("+"), sym("expression") })),
prec(2, seq({ sym("expression"), sym("star"),
sym("expression") })) }) },
{ "call_expression",
prec(3, seq({ sym("expression"), str("("), comma_sep(sym("expression")),
str(")") })) },
{ "statement", choice({ sym("expression_statement") }) },
{ "expression_statement", seq({ sym("expression"), str(";") }) },
{ "string", delimited("\"") },
{ "identifier", pattern("\\a[\\w_]*") },
{ "number", pattern("\\d+(\\.\\d+)?") },
{ "comment", pattern("//[^\n]*") },
})
.ubiquitous_tokens({
sym("comment"), pattern("[ \t\r\n]"),
})
.expected_conflicts({
{ "type_specifier", "expression" },
});
} // namespace tree_sitter_examples