From 3cd031af3885ea635b8c99d90b7de461b7926b79 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 11 Jun 2014 12:40:49 -0700 Subject: [PATCH] Add `keypattern` rule helper This way, pattern rules (e.g. golang's comment) can be easily given the same precedence as keyword rules. --- examples/grammars/golang.cc | 5 +---- include/tree_sitter/compiler.h | 1 + src/compiler/rules/rules.cc | 12 +++++++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/examples/grammars/golang.cc b/examples/grammars/golang.cc index f5afd999..5652216b 100644 --- a/examples/grammars/golang.cc +++ b/examples/grammars/golang.cc @@ -161,9 +161,6 @@ namespace tree_sitter_examples { { "type_name", sym("_identifier") }, { "_identifier", pattern("\\a[\\w_]*") }, { "number", pattern("\\d+(\\.\\d+)?") }, - - // TODO - make it clear how this number relates to the - // precedence used by the `keyword` helper. - { "comment", token(prec(1000, pattern("//[^\n]*"))) }, + { "comment", keypattern("//[^\n]*") }, }).ubiquitous_tokens({ "comment" }); } diff --git a/include/tree_sitter/compiler.h b/include/tree_sitter/compiler.h index cff3f0d3..f2ea2956 100644 --- a/include/tree_sitter/compiler.h +++ b/include/tree_sitter/compiler.h @@ -20,6 +20,7 @@ namespace tree_sitter { rule_ptr pattern(const std::string &value); rule_ptr str(const std::string &value); rule_ptr keyword(const std::string &value); + rule_ptr keypattern(const std::string &value); rule_ptr err(const rule_ptr &rule); rule_ptr prec(int precedence, rule_ptr rule); rule_ptr token(rule_ptr rule); diff --git a/src/compiler/rules/rules.cc b/src/compiler/rules/rules.cc index d9ea3537..03578002 100644 --- a/src/compiler/rules/rules.cc +++ b/src/compiler/rules/rules.cc @@ -23,6 +23,8 @@ namespace tree_sitter { using std::map; namespace rules { + static const int KEYWORD_PRECEDENCE = 100; + static rule_ptr metadata(rule_ptr rule, map values) { return std::make_shared(rule, values); } @@ -56,7 +58,11 @@ namespace tree_sitter { } rule_ptr keyword(const string &value) { - return metadata(make_shared(value), { { PRECEDENCE, 100}, { IS_TOKEN, 1 } }); + return token(prec(KEYWORD_PRECEDENCE, str(value))); + } + + rule_ptr keypattern(const string &value) { + return token(prec(KEYWORD_PRECEDENCE, pattern(value))); } rule_ptr err(const rule_ptr &rule) { @@ -64,11 +70,11 @@ namespace tree_sitter { } rule_ptr prec(int precedence, rule_ptr rule) { - return metadata(rule, { { PRECEDENCE, precedence } }); + return metadata(rule, {{ PRECEDENCE, precedence }}); } rule_ptr token(rule_ptr rule) { - return metadata(rule, { { IS_TOKEN, 1 } }); + return metadata(rule, {{ IS_TOKEN, 1 }}); } } }