Initial commit
Co-Authored-By: Ashi Krishan <queerviolet@github.com>
This commit is contained in:
commit
e74d96c27b
|
@ -0,0 +1 @@
|
|||
/src/** linguist-vendored
|
|
@ -0,0 +1,3 @@
|
|||
node_modules
|
||||
build
|
||||
*.log
|
|
@ -0,0 +1,3 @@
|
|||
corpus
|
||||
build
|
||||
script
|
|
@ -0,0 +1,14 @@
|
|||
language: node_js
|
||||
sudo: false
|
||||
node_js:
|
||||
- "node"
|
||||
compiler: clang-3.6
|
||||
env:
|
||||
- CXX=clang-3.6
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-precise-3.6
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang-3.6
|
|
@ -0,0 +1,21 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 Max Brunsfeld
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"targets": [
|
||||
{
|
||||
"target_name": "tree_sitter_html_binding",
|
||||
"include_dirs": [
|
||||
"<!(node -e \"require('nan')\")",
|
||||
"src"
|
||||
],
|
||||
"sources": [
|
||||
"src/parser.c",
|
||||
"src/binding.cc"
|
||||
],
|
||||
"cflags_c": [
|
||||
"-std=c99",
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
===================================
|
||||
Tags
|
||||
===================================
|
||||
<span>Hello</span>
|
||||
---
|
||||
|
||||
(fragment
|
||||
(element
|
||||
(start_tag (tag_name))
|
||||
(text)
|
||||
(end_tag (tag_name))))
|
||||
|
||||
===================================
|
||||
Tags with attributes
|
||||
===================================
|
||||
<input value=yes class="a" data-💩></input>
|
||||
---
|
||||
|
||||
(fragment
|
||||
(void_element
|
||||
(void_start_tag
|
||||
(void_tag_name)
|
||||
(attribute
|
||||
(attribute_name)
|
||||
(attribute_value))
|
||||
(attribute
|
||||
(attribute_name)
|
||||
(quoted_attribute_value (attribute_value)))
|
||||
(attribute
|
||||
(attribute_name)))
|
||||
(end_tag (tag_name))))
|
||||
|
||||
===================================
|
||||
Nested tags
|
||||
===================================
|
||||
<div>
|
||||
<span>a</span>
|
||||
b
|
||||
<b>c</b>
|
||||
</div>
|
||||
---
|
||||
|
||||
(fragment
|
||||
(element
|
||||
(start_tag (tag_name))
|
||||
(text)
|
||||
(element
|
||||
(start_tag (tag_name))
|
||||
(text)
|
||||
(end_tag (tag_name)))
|
||||
(text)
|
||||
(element
|
||||
(start_tag (tag_name))
|
||||
(text)
|
||||
(end_tag (tag_name)))
|
||||
(text)
|
||||
(end_tag (tag_name))))
|
||||
|
||||
==================================
|
||||
Void tags
|
||||
==================================
|
||||
<form><img src="somethign.png"><br><input type=submit value=Ok /></form>
|
||||
---
|
||||
|
||||
(fragment
|
||||
(element
|
||||
(start_tag (tag_name))
|
||||
(void_element
|
||||
(void_start_tag
|
||||
(tag_name)
|
||||
(attribute (attribute_name) (quoted_attribute_value (attribute_value)))))
|
||||
(void_element (void_start_tag (tag_name)))
|
||||
(void_element
|
||||
(self_closing_tag
|
||||
(tag_name)
|
||||
(attribute (attribute_name) (attribute_value))
|
||||
(attribute (attribute_name) (attribute_value))))
|
||||
(end_tag (tag_name))))
|
|
@ -0,0 +1,102 @@
|
|||
const startTag = ($, tag) => seq(
|
||||
'<',
|
||||
alias(tag, $.tag_name),
|
||||
repeat($.attribute),
|
||||
'>'
|
||||
)
|
||||
|
||||
module.exports = grammar({
|
||||
name: 'html',
|
||||
|
||||
externals: $ => [
|
||||
$.tag_name,
|
||||
|
||||
],
|
||||
|
||||
rules: {
|
||||
fragment: $ => repeat($._node),
|
||||
|
||||
_node: $ => choice(
|
||||
$.text,
|
||||
$.element,
|
||||
$.void_element
|
||||
),
|
||||
|
||||
element: $ => seq(
|
||||
$.start_tag,
|
||||
repeat($._node),
|
||||
$.end_tag
|
||||
),
|
||||
|
||||
void_element: $ => choice(
|
||||
seq($.void_start_tag, optional($.end_tag)),
|
||||
$.self_closing_tag
|
||||
),
|
||||
|
||||
start_tag: $ => startTag($, $.tag_name),
|
||||
|
||||
void_start_tag: $ => startTag($, $.void_tag_name),
|
||||
|
||||
self_closing_tag: $ => seq(
|
||||
'<',
|
||||
choice($.tag_name, $.void_tag_name),
|
||||
repeat($.attribute),
|
||||
'/',
|
||||
'>'
|
||||
),
|
||||
|
||||
attribute: $ => seq(
|
||||
alias($._attribute_part, $.attribute_name),
|
||||
optional(seq(
|
||||
'=',
|
||||
choice(
|
||||
alias($._attribute_part, $.attribute_value),
|
||||
$.quoted_attribute_value
|
||||
)
|
||||
))
|
||||
),
|
||||
|
||||
_attribute_part: $ => /[^<>"'/=\s]+/,
|
||||
|
||||
quoted_attribute_value: $ => choice(
|
||||
seq("'", optional(alias(/[^']+/, $.attribute_value)), "'"),
|
||||
seq('"', optional(alias(/[^"]+/, $.attribute_value)), '"')
|
||||
),
|
||||
|
||||
end_tag: $ => seq(
|
||||
'</',
|
||||
choice($.tag_name, $.void_tag_name),
|
||||
'>'
|
||||
),
|
||||
|
||||
tag_name: $ => /[a-zA-Z\-]+/,
|
||||
|
||||
void_tag_name: $ => token(prec(1, choice(
|
||||
'area',
|
||||
'base',
|
||||
'basefont',
|
||||
'bgsound',
|
||||
'br',
|
||||
'col',
|
||||
'command',
|
||||
'embed',
|
||||
'frame',
|
||||
'hr',
|
||||
'image',
|
||||
'img',
|
||||
'input',
|
||||
'isindex',
|
||||
'keygen',
|
||||
'link',
|
||||
'menuitem',
|
||||
'meta',
|
||||
'nextid',
|
||||
'param',
|
||||
'source',
|
||||
'track',
|
||||
'wbr'
|
||||
))),
|
||||
|
||||
text: $ => /[^<>]+/
|
||||
}
|
||||
});
|
|
@ -0,0 +1,9 @@
|
|||
try {
|
||||
module.exports = require("./build/Release/tree_sitter_html_binding");
|
||||
} catch (error) {
|
||||
try {
|
||||
module.exports = require("./build/Debug/tree_sitter_html_binding");
|
||||
} catch (_) {
|
||||
throw error
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
#include "tree_sitter/parser.h"
|
||||
#include <node.h>
|
||||
#include "nan.h"
|
||||
|
||||
using namespace v8;
|
||||
|
||||
extern "C" TSLanguage * tree_sitter_html();
|
||||
|
||||
namespace {
|
||||
|
||||
NAN_METHOD(New) {}
|
||||
|
||||
void Init(Handle<Object> exports, Handle<Object> module) {
|
||||
Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New);
|
||||
tpl->SetClassName(Nan::New("Language").ToLocalChecked());
|
||||
tpl->InstanceTemplate()->SetInternalFieldCount(1);
|
||||
|
||||
Local<Function> constructor = tpl->GetFunction();
|
||||
Local<Object> instance = constructor->NewInstance(Nan::GetCurrentContext()).ToLocalChecked();
|
||||
Nan::SetInternalFieldPointer(instance, 0, tree_sitter_html());
|
||||
|
||||
instance->Set(Nan::New("name").ToLocalChecked(), Nan::New("html").ToLocalChecked());
|
||||
module->Set(Nan::New("exports").ToLocalChecked(), instance);
|
||||
}
|
||||
|
||||
NODE_MODULE(tree_sitter_html_binding, Init)
|
||||
|
||||
} // namespace
|
|
@ -0,0 +1,417 @@
|
|||
{
|
||||
"name": "html",
|
||||
"rules": {
|
||||
"fragment": {
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "_node"
|
||||
}
|
||||
},
|
||||
"_node": {
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "text"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "element"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "void_element"
|
||||
}
|
||||
]
|
||||
},
|
||||
"element": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "start_tag"
|
||||
},
|
||||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "_node"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "end_tag"
|
||||
}
|
||||
]
|
||||
},
|
||||
"void_element": {
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "void_start_tag"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "self_closing_tag"
|
||||
}
|
||||
]
|
||||
},
|
||||
"start_tag": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "<"
|
||||
},
|
||||
{
|
||||
"type": "ALIAS",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "tag_name"
|
||||
},
|
||||
"named": true,
|
||||
"value": "tag_name"
|
||||
},
|
||||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "attribute"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ">"
|
||||
}
|
||||
]
|
||||
},
|
||||
"void_start_tag": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "<"
|
||||
},
|
||||
{
|
||||
"type": "ALIAS",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "void_tag_name"
|
||||
},
|
||||
"named": true,
|
||||
"value": "tag_name"
|
||||
},
|
||||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "attribute"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ">"
|
||||
}
|
||||
]
|
||||
},
|
||||
"self_closing_tag": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "<"
|
||||
},
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "tag_name"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "void_tag_name"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "attribute"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "/"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ">"
|
||||
}
|
||||
]
|
||||
},
|
||||
"attribute": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "ALIAS",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "_attribute_part"
|
||||
},
|
||||
"named": true,
|
||||
"value": "attribute_name"
|
||||
},
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "="
|
||||
},
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "ALIAS",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "_attribute_part"
|
||||
},
|
||||
"named": true,
|
||||
"value": "attribute_value"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "quoted_attribute_value"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "BLANK"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"_attribute_part": {
|
||||
"type": "PATTERN",
|
||||
"value": "[^<>\"'\\/=\\s]+"
|
||||
},
|
||||
"quoted_attribute_value": {
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "'"
|
||||
},
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "ALIAS",
|
||||
"content": {
|
||||
"type": "PATTERN",
|
||||
"value": "[^']+"
|
||||
},
|
||||
"named": true,
|
||||
"value": "attribute_value"
|
||||
},
|
||||
{
|
||||
"type": "BLANK"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "'"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "\""
|
||||
},
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "ALIAS",
|
||||
"content": {
|
||||
"type": "PATTERN",
|
||||
"value": "[^\"]+"
|
||||
},
|
||||
"named": true,
|
||||
"value": "attribute_value"
|
||||
},
|
||||
{
|
||||
"type": "BLANK"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "\""
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"end_tag": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "<"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "/"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "tag_name"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ">"
|
||||
}
|
||||
]
|
||||
},
|
||||
"tag_name": {
|
||||
"type": "PATTERN",
|
||||
"value": "[a-zA-Z\\-]+"
|
||||
},
|
||||
"void_tag_name": {
|
||||
"type": "TOKEN",
|
||||
"content": {
|
||||
"type": "PREC",
|
||||
"value": 1,
|
||||
"content": {
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "area"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "base"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "basefont"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "bgsound"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "br"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "col"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "command"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "embed"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "frame"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "hr"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "image"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "img"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "input"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "isindex"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "keygen"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "link"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "menuitem"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "meta"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "nextid"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "param"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "source"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "track"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "wbr"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"text": {
|
||||
"type": "PATTERN",
|
||||
"value": "[^<>]+"
|
||||
}
|
||||
},
|
||||
"extras": [
|
||||
{
|
||||
"type": "PATTERN",
|
||||
"value": "\\s"
|
||||
}
|
||||
],
|
||||
"conflicts": [],
|
||||
"externals": [],
|
||||
"inline": []
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,192 @@
|
|||
#ifndef TREE_SITTER_PARSER_H_
|
||||
#define TREE_SITTER_PARSER_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define ts_builtin_sym_error ((TSSymbol)-1)
|
||||
#define ts_builtin_sym_end 0
|
||||
#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024
|
||||
|
||||
#ifndef TREE_SITTER_RUNTIME_H_
|
||||
typedef uint16_t TSSymbol;
|
||||
typedef struct TSLanguage TSLanguage;
|
||||
#endif
|
||||
|
||||
typedef uint16_t TSStateId;
|
||||
|
||||
typedef struct {
|
||||
bool visible : 1;
|
||||
bool named : 1;
|
||||
} TSSymbolMetadata;
|
||||
|
||||
typedef struct {
|
||||
void (*advance)(void *, bool);
|
||||
void (*mark_end)(void *);
|
||||
uint32_t (*get_column)(void *);
|
||||
int32_t lookahead;
|
||||
TSSymbol result_symbol;
|
||||
} TSLexer;
|
||||
|
||||
typedef enum {
|
||||
TSParseActionTypeShift,
|
||||
TSParseActionTypeReduce,
|
||||
TSParseActionTypeAccept,
|
||||
TSParseActionTypeRecover,
|
||||
} TSParseActionType;
|
||||
|
||||
typedef struct {
|
||||
union {
|
||||
struct {
|
||||
TSStateId state;
|
||||
bool extra : 1;
|
||||
bool repetition : 1;
|
||||
};
|
||||
struct {
|
||||
TSSymbol symbol;
|
||||
int16_t dynamic_precedence;
|
||||
uint8_t child_count;
|
||||
uint8_t alias_sequence_id;
|
||||
};
|
||||
} params;
|
||||
TSParseActionType type : 4;
|
||||
} TSParseAction;
|
||||
|
||||
typedef struct {
|
||||
uint16_t lex_state;
|
||||
uint16_t external_lex_state;
|
||||
} TSLexMode;
|
||||
|
||||
typedef union {
|
||||
TSParseAction action;
|
||||
struct {
|
||||
uint8_t count;
|
||||
bool reusable : 1;
|
||||
};
|
||||
} TSParseActionEntry;
|
||||
|
||||
struct TSLanguage {
|
||||
uint32_t version;
|
||||
uint32_t symbol_count;
|
||||
uint32_t alias_count;
|
||||
uint32_t token_count;
|
||||
uint32_t external_token_count;
|
||||
const char **symbol_names;
|
||||
const TSSymbolMetadata *symbol_metadata;
|
||||
const uint16_t *parse_table;
|
||||
const TSParseActionEntry *parse_actions;
|
||||
const TSLexMode *lex_modes;
|
||||
const TSSymbol *alias_sequences;
|
||||
uint16_t max_alias_sequence_length;
|
||||
bool (*lex_fn)(TSLexer *, TSStateId);
|
||||
bool (*keyword_lex_fn)(TSLexer *, TSStateId);
|
||||
TSSymbol keyword_capture_token;
|
||||
struct {
|
||||
const bool *states;
|
||||
const TSSymbol *symbol_map;
|
||||
void *(*create)();
|
||||
void (*destroy)(void *);
|
||||
bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist);
|
||||
unsigned (*serialize)(void *, char *);
|
||||
void (*deserialize)(void *, const char *, unsigned);
|
||||
} external_scanner;
|
||||
};
|
||||
|
||||
/*
|
||||
* Lexer Macros
|
||||
*/
|
||||
|
||||
#define START_LEXER() \
|
||||
bool result = false; \
|
||||
int32_t lookahead; \
|
||||
next_state: \
|
||||
lookahead = lexer->lookahead;
|
||||
|
||||
#define ADVANCE(state_value) \
|
||||
{ \
|
||||
lexer->advance(lexer, false); \
|
||||
state = state_value; \
|
||||
goto next_state; \
|
||||
}
|
||||
|
||||
#define SKIP(state_value) \
|
||||
{ \
|
||||
lexer->advance(lexer, true); \
|
||||
state = state_value; \
|
||||
goto next_state; \
|
||||
}
|
||||
|
||||
#define ACCEPT_TOKEN(symbol_value) \
|
||||
result = true; \
|
||||
lexer->result_symbol = symbol_value; \
|
||||
lexer->mark_end(lexer);
|
||||
|
||||
#define END_STATE() return result;
|
||||
|
||||
/*
|
||||
* Parse Table Macros
|
||||
*/
|
||||
|
||||
#define STATE(id) id
|
||||
|
||||
#define ACTIONS(id) id
|
||||
|
||||
#define SHIFT(state_value) \
|
||||
{ \
|
||||
{ \
|
||||
.type = TSParseActionTypeShift, \
|
||||
.params = {.state = state_value}, \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SHIFT_REPEAT(state_value) \
|
||||
{ \
|
||||
{ \
|
||||
.type = TSParseActionTypeShift, \
|
||||
.params = { \
|
||||
.state = state_value, \
|
||||
.repetition = true \
|
||||
}, \
|
||||
} \
|
||||
}
|
||||
|
||||
#define RECOVER() \
|
||||
{ \
|
||||
{ .type = TSParseActionTypeRecover } \
|
||||
}
|
||||
|
||||
#define SHIFT_EXTRA() \
|
||||
{ \
|
||||
{ \
|
||||
.type = TSParseActionTypeShift, \
|
||||
.params = {.extra = true} \
|
||||
} \
|
||||
}
|
||||
|
||||
#define REDUCE(symbol_val, child_count_val, ...) \
|
||||
{ \
|
||||
{ \
|
||||
.type = TSParseActionTypeReduce, \
|
||||
.params = { \
|
||||
.symbol = symbol_val, \
|
||||
.child_count = child_count_val, \
|
||||
__VA_ARGS__ \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
#define ACCEPT_INPUT() \
|
||||
{ \
|
||||
{ .type = TSParseActionTypeAccept } \
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // TREE_SITTER_PARSER_H_
|
Loading…
Reference in New Issue