tree-sitter/examples/grammars/javascript.cc

84 lines
2.8 KiB
C++
Raw Normal View History

2014-03-24 09:14:29 -07:00
#include "tree_sitter/compiler.h"
namespace tree_sitter {
namespace examples {
using namespace tree_sitter::rules;
2014-03-25 23:40:53 -07:00
static rule_ptr optional(const rule_ptr &rule) {
return choice({ rule, blank() });
}
2014-03-24 09:14:29 -07:00
static rule_ptr comma_sep(const rule_ptr &element) {
return choice({
seq({
element,
repeat(seq({ str(","), element })),
}),
blank(),
});
}
Grammar javascript() {
return Grammar({
2014-03-24 09:14:29 -07:00
{ "program", repeat(sym("statement")) },
{ "_terminator", choice({
str(";"),
str("\n") }) },
2014-03-24 09:14:29 -07:00
{ "statement", choice({
sym("if_statement"),
seq({ sym("assignment"), sym("_terminator") }),
seq({ sym("expression"), sym("_terminator") }) }) },
{ "if_statement", seq({
2014-03-25 23:40:53 -07:00
sym("_if"),
2014-03-24 09:14:29 -07:00
str("("),
sym("expression"),
str(")"),
2014-03-25 23:40:53 -07:00
sym("statement_block"),
optional(seq({
sym("_else"),
sym("statement_block") })) }) },
{ "statement_block", seq({
2014-03-24 09:14:29 -07:00
str("{"),
repeat(sym("statement")),
str("}") }) },
2014-03-24 09:14:29 -07:00
{ "assignment", seq({
2014-03-25 23:40:53 -07:00
sym("_var"),
2014-03-24 09:14:29 -07:00
sym("identifier"),
str("="),
sym("expression") })},
{ "expression", choice({
sym("literal"),
sym("identifier") }) },
2014-03-24 09:14:29 -07:00
{ "literal", choice({
sym("object"),
sym("array"),
sym("string"),
sym("number"),
sym("true"),
sym("false"),
sym("null"), }) },
{ "object", seq({
str("{"),
comma_sep(err(seq({
sym("string"),
str(":"),
sym("expression") }))),
str("}"), }) },
{ "array", seq({
str("["),
comma_sep(err(sym("expression"))),
str("]") }) },
2014-03-25 23:40:53 -07:00
{ "_var", str("var") },
{ "_if", str("if") },
{ "_else", str("else") },
2014-03-24 09:14:29 -07:00
{ "string", pattern("\"([^\"]|\\\\\")+\"") },
{ "identifier", pattern("[\\w_$]+") },
{ "number", pattern("\\d+(.\\d+)?") },
{ "null", str("null") },
{ "true", str("true") },
{ "false", str("false") },
});
}
}
}