A precedence annotation wrapping a sequence of characters now only affects how tightly those characters bind to *each other*, not how tightly they bind to the preceding character. This bug surfaced because a generated lexer was failing to recognize a '\n' character as a token, instead treating it as ubiquitous whitespace. It made this error because, even though anonymous ubiquitous tokens have the lowest precedence, the character immediately *after* the '\n' was part of a normal token, which had *normal* precedence (0). Advancing into that following token was incorrectly prioritized above accepting the line-break token.
20 lines
632 B
C++
20 lines
632 B
C++
#ifndef __tree_sitter__character_set_helpers__
|
|
#define __tree_sitter__character_set_helpers__
|
|
|
|
#include "tree_sitter/compiler.h"
|
|
#include "compiler/rules/character_set.h"
|
|
#include "compiler/rules/metadata.h"
|
|
#include "compiler/variable.h"
|
|
|
|
namespace tree_sitter {
|
|
rule_ptr metadata(rule_ptr, std::map<rules::MetadataKey, int>);
|
|
rule_ptr character(const std::set<uint32_t> &);
|
|
rule_ptr character(const std::set<uint32_t> &, bool sign);
|
|
rule_ptr i_sym(size_t index);
|
|
rule_ptr i_token(size_t index);
|
|
rule_ptr active_prec(int precedence, rule_ptr);
|
|
|
|
bool operator==(const Variable &left, const Variable &right);
|
|
}
|
|
|
|
#endif
|