Initial commit
This commit is contained in:
commit
ad139e0a3a
|
@ -0,0 +1,22 @@
|
||||||
|
image: Visual Studio 2015
|
||||||
|
|
||||||
|
environment:
|
||||||
|
nodejs_version: "8"
|
||||||
|
|
||||||
|
platform:
|
||||||
|
- x64
|
||||||
|
|
||||||
|
install:
|
||||||
|
- ps: Install-Product node $env:nodejs_version
|
||||||
|
- node --version
|
||||||
|
- npm --version
|
||||||
|
- npm install
|
||||||
|
|
||||||
|
test_script:
|
||||||
|
- npm run test-windows
|
||||||
|
|
||||||
|
build: off
|
||||||
|
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
|
@ -0,0 +1,3 @@
|
||||||
|
node_modules
|
||||||
|
build
|
||||||
|
*.log
|
|
@ -0,0 +1,23 @@
|
||||||
|
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
|
||||||
|
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"target_name": "tree_sitter_css_binding",
|
||||||
|
"include_dirs": [
|
||||||
|
"<!(node -e \"require('nan')\")",
|
||||||
|
"src"
|
||||||
|
],
|
||||||
|
"sources": [
|
||||||
|
"src/parser.c",
|
||||||
|
"src/binding.cc"
|
||||||
|
],
|
||||||
|
"cflags_c": [
|
||||||
|
"-std=c99",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
==========================
|
||||||
|
Functions
|
||||||
|
==========================
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: rgba(0, 255, 0, 0.5);
|
||||||
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
=========================
|
||||||
|
Universal selectors
|
||||||
|
=========================
|
||||||
|
|
||||||
|
* {}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(stylesheet
|
||||||
|
(rule_set (selectors (universal_selector)) (block)))
|
||||||
|
|
||||||
|
=========================
|
||||||
|
Type selectors
|
||||||
|
=========================
|
||||||
|
|
||||||
|
div, span {}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(stylesheet
|
||||||
|
(rule_set (selectors (type_selector (identifier)) (type_selector (identifier))) (block)))
|
||||||
|
|
||||||
|
=========================
|
||||||
|
Class selectors
|
||||||
|
=========================
|
||||||
|
|
||||||
|
.class-a {}
|
||||||
|
.class-b, .class-c {}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(stylesheet
|
||||||
|
(rule_set (selectors (class_selector (identifier))) (block))
|
||||||
|
(rule_set (selectors (class_selector (identifier)) (class_selector (identifier))) (block)))
|
||||||
|
|
||||||
|
=========================
|
||||||
|
Id selectors
|
||||||
|
=========================
|
||||||
|
|
||||||
|
#some-id {}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(stylesheet
|
||||||
|
(rule_set (selectors (id_selector (identifier))) (block)))
|
||||||
|
|
||||||
|
=========================
|
||||||
|
Attribute selectors
|
||||||
|
=========================
|
||||||
|
|
||||||
|
[a] {}
|
||||||
|
[b=c] {}
|
||||||
|
[d~=e] {}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(stylesheet
|
||||||
|
(rule_set (selectors (attribute_selector (property_name (identifier)))) (block))
|
||||||
|
(rule_set (selectors (attribute_selector (property_name (identifier)) (property_value))) (block))
|
||||||
|
(rule_set (selectors (attribute_selector (property_name (identifier)) (property_value))) (block)))
|
||||||
|
|
||||||
|
=========================
|
||||||
|
Child selectors
|
||||||
|
=========================
|
||||||
|
|
||||||
|
a > b {}
|
||||||
|
c > d > e {}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(stylesheet
|
||||||
|
(rule_set
|
||||||
|
(selectors (child_selector (type_selector (identifier)) (type_selector (identifier))))
|
||||||
|
(block))
|
||||||
|
(rule_set
|
||||||
|
(selectors (child_selector
|
||||||
|
(child_selector (type_selector (identifier)) (type_selector (identifier)))
|
||||||
|
(type_selector (identifier))))
|
||||||
|
(block)))
|
||||||
|
|
||||||
|
=========================
|
||||||
|
Descendant selectors
|
||||||
|
=========================
|
||||||
|
|
||||||
|
a b {}
|
||||||
|
c d e {}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(stylesheet
|
||||||
|
(rule_set
|
||||||
|
(selectors (descendant_selector (type_selector (identifier)) (type_selector (identifier))))
|
||||||
|
(block))
|
||||||
|
(rule_set
|
||||||
|
(selectors (descendant_selector
|
||||||
|
(descendant_selector (type_selector (identifier)) (type_selector (identifier)))
|
||||||
|
(type_selector (identifier))))
|
||||||
|
(block)))
|
|
@ -0,0 +1,15 @@
|
||||||
|
============================
|
||||||
|
Rule sets
|
||||||
|
============================
|
||||||
|
|
||||||
|
#some-id {
|
||||||
|
some-property: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(stylesheet
|
||||||
|
(rule_set
|
||||||
|
(selectors (id_selector (identifier)))
|
||||||
|
(block
|
||||||
|
(declaration (property_name (identifier)) (property_value)))))
|
|
@ -0,0 +1,97 @@
|
||||||
|
module.exports = grammar({
|
||||||
|
name: 'css',
|
||||||
|
|
||||||
|
extras: $ => [
|
||||||
|
/\s/,
|
||||||
|
$.comment,
|
||||||
|
],
|
||||||
|
|
||||||
|
rules: {
|
||||||
|
stylesheet: $ => repeat(choice(
|
||||||
|
$.rule_set,
|
||||||
|
$.import_statement,
|
||||||
|
)),
|
||||||
|
|
||||||
|
// Statements
|
||||||
|
|
||||||
|
import_statement: $ => seq(
|
||||||
|
'@import'
|
||||||
|
),
|
||||||
|
|
||||||
|
// Rule sets
|
||||||
|
|
||||||
|
rule_set: $ => seq(
|
||||||
|
$.selectors,
|
||||||
|
$.block
|
||||||
|
),
|
||||||
|
|
||||||
|
selectors: $ => commaSep1($._selector),
|
||||||
|
|
||||||
|
block: $ => seq('{', repeat($.declaration), '}'),
|
||||||
|
|
||||||
|
// Selectors
|
||||||
|
|
||||||
|
_selector: $ => choice(
|
||||||
|
$.universal_selector,
|
||||||
|
$.type_selector,
|
||||||
|
$.class_selector,
|
||||||
|
$.id_selector,
|
||||||
|
$.attribute_selector,
|
||||||
|
$.child_selector,
|
||||||
|
$.descendant_selector
|
||||||
|
),
|
||||||
|
|
||||||
|
universal_selector: $ => '*',
|
||||||
|
|
||||||
|
type_selector: $ => $.identifier,
|
||||||
|
|
||||||
|
class_selector: $ => seq('.', $.identifier),
|
||||||
|
|
||||||
|
id_selector: $ => seq('#', $.identifier),
|
||||||
|
|
||||||
|
attribute_selector: $ => seq(
|
||||||
|
choice(
|
||||||
|
'[',
|
||||||
|
seq($._selector, token.immediate('['))
|
||||||
|
),
|
||||||
|
$.property_name,
|
||||||
|
optional(seq(
|
||||||
|
choice('=', '~=', '^=', '|=', '*=', '$='),
|
||||||
|
$.property_value
|
||||||
|
)),
|
||||||
|
']'
|
||||||
|
),
|
||||||
|
|
||||||
|
child_selector: $ => prec.left(seq($._selector, '>', $._selector)),
|
||||||
|
|
||||||
|
descendant_selector: $ => prec.left(seq($._selector, $._selector)),
|
||||||
|
|
||||||
|
// Declarations
|
||||||
|
|
||||||
|
declaration: $ => seq(
|
||||||
|
$.property_name,
|
||||||
|
':',
|
||||||
|
$.property_value,
|
||||||
|
';'
|
||||||
|
),
|
||||||
|
|
||||||
|
property_name: $ => $.identifier,
|
||||||
|
|
||||||
|
identifier: $ => /[a-zA-Z-_]+/,
|
||||||
|
|
||||||
|
property_value: $ => /[^;()\[\]]+/,
|
||||||
|
|
||||||
|
comment: $ => token(choice(
|
||||||
|
seq('//', /.*/),
|
||||||
|
seq(
|
||||||
|
'/*',
|
||||||
|
/[^*]*\*+([^/*][^*]*\*+)*/,
|
||||||
|
'/'
|
||||||
|
)
|
||||||
|
))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
function commaSep1 (rule) {
|
||||||
|
return seq(rule, repeat(seq(',', rule)))
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
try {
|
||||||
|
module.exports = require("./build/Release/tree_sitter_css_binding");
|
||||||
|
} catch (error) {
|
||||||
|
try {
|
||||||
|
module.exports = require("./build/Debug/tree_sitter_css_binding");
|
||||||
|
} catch (_) {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"name": "tree-sitter-css",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"description": "CSS grammar for tree-sitter",
|
||||||
|
"main": "index.js",
|
||||||
|
"keywords": [
|
||||||
|
"parser",
|
||||||
|
"lexer"
|
||||||
|
],
|
||||||
|
"author": "Max Brunsfeld",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"nan": "^2.11.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"tree-sitter-cli": "^0.13.5"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "tree-sitter test"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
#include "tree_sitter/parser.h"
|
||||||
|
#include <node.h>
|
||||||
|
#include "nan.h"
|
||||||
|
|
||||||
|
using namespace v8;
|
||||||
|
|
||||||
|
extern "C" TSLanguage * tree_sitter_css();
|
||||||
|
|
||||||
|
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_css());
|
||||||
|
|
||||||
|
instance->Set(Nan::New("name").ToLocalChecked(), Nan::New("css").ToLocalChecked());
|
||||||
|
module->Set(Nan::New("exports").ToLocalChecked(), instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
NODE_MODULE(tree_sitter_css_binding, Init)
|
||||||
|
|
||||||
|
} // namespace
|
|
@ -0,0 +1,361 @@
|
||||||
|
{
|
||||||
|
"name": "css",
|
||||||
|
"rules": {
|
||||||
|
"stylesheet": {
|
||||||
|
"type": "REPEAT",
|
||||||
|
"content": {
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "rule_set"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "import_statement"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"import_statement": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "@import"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"rule_set": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "selectors"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "block"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"selectors": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "_selector"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "REPEAT",
|
||||||
|
"content": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": ","
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "_selector"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"block": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "{"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "REPEAT",
|
||||||
|
"content": {
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "declaration"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"_selector": {
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "universal_selector"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "type_selector"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "class_selector"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "id_selector"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "attribute_selector"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "child_selector"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "descendant_selector"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"universal_selector": {
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "*"
|
||||||
|
},
|
||||||
|
"type_selector": {
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "identifier"
|
||||||
|
},
|
||||||
|
"class_selector": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "identifier"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id_selector": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "#"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "identifier"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"attribute_selector": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "["
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "_selector"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "IMMEDIATE_TOKEN",
|
||||||
|
"content": {
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "["
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "property_name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "~="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "^="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "|="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "*="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "$="
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "property_value"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "BLANK"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "]"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"child_selector": {
|
||||||
|
"type": "PREC_LEFT",
|
||||||
|
"value": 0,
|
||||||
|
"content": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "_selector"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": ">"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "_selector"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"descendant_selector": {
|
||||||
|
"type": "PREC_LEFT",
|
||||||
|
"value": 0,
|
||||||
|
"content": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "_selector"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "_selector"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"declaration": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "property_name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": ":"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "property_value"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": ";"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"property_name": {
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "identifier"
|
||||||
|
},
|
||||||
|
"identifier": {
|
||||||
|
"type": "PATTERN",
|
||||||
|
"value": "[a-zA-Z-_]+"
|
||||||
|
},
|
||||||
|
"property_value": {
|
||||||
|
"type": "PATTERN",
|
||||||
|
"value": "[^;()\\[\\]]+"
|
||||||
|
},
|
||||||
|
"comment": {
|
||||||
|
"type": "TOKEN",
|
||||||
|
"content": {
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "//"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PATTERN",
|
||||||
|
"value": ".*"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "/*"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PATTERN",
|
||||||
|
"value": "[^*]*\\*+([^\\/*][^*]*\\*+)*"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "/"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"extras": [
|
||||||
|
{
|
||||||
|
"type": "PATTERN",
|
||||||
|
"value": "\\s"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "comment"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflicts": [],
|
||||||
|
"externals": [],
|
||||||
|
"inline": []
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,195 @@
|
||||||
|
#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 TSLexer TSLexer;
|
||||||
|
|
||||||
|
struct TSLexer {
|
||||||
|
int32_t lookahead;
|
||||||
|
TSSymbol result_symbol;
|
||||||
|
void (*advance)(TSLexer *, bool);
|
||||||
|
void (*mark_end)(TSLexer *);
|
||||||
|
uint32_t (*get_column)(TSLexer *);
|
||||||
|
bool (*is_at_included_range_start)(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