Fix errors in grammar syntax (#416)

This commit is contained in:
Daelon Suzuka
2022-10-25 19:47:31 -04:00
committed by GitHub
parent 8cef9532a7
commit 5a67e4c78d
5 changed files with 265 additions and 55 deletions

View File

@@ -1,10 +1,6 @@
{
"version": "v0.6.0",
"scopeName": "source.gdresource",
"uuid": "e076faa2-3c52-42fa-a8e6-9a7c453c1a5b",
"information_for_contributors": [
"aster: galaster@foxmail.com"
],
"patterns": [
{
"include": "#embedded_shader"

View File

@@ -1,7 +1,5 @@
{
"fileTypes": [
"gd"
],
"fileTypes": ["gd"],
"scopeName": "source.gdscript",
"name": "GDScript",
"patterns": [
@@ -286,8 +284,11 @@
"in_keyword": {
"patterns": [
{
"match": "\\b(?<=for\\s[\\w]*\\s)(in)\\b",
"name": "keyword.control.gdscript"
"match": "\\b(for)\\s+[a-zA-Z_]\\w*\\s+(in)\\b",
"captures": {
"1": { "name": "keyword.control.gdscript" },
"2": { "name": "keyword.control.gdscript" }
}
},
{
"match": "\\bin\\b",
@@ -356,7 +357,7 @@
},
"patterns": [
{
"match": "(:)\\s*([\\w]*)?",
"match": "(:)\\s*([a-zA-Z_]\\w*)?",
"captures": {
"1": {
"name": "punctuation.separator.annotation.gdscript"
@@ -371,7 +372,7 @@
"name": "keyword.operator.assignment.gdscript"
},
{
"match": "(setget)\\s+([\\w]*)(?:[,]\\s*([\\w]*))?",
"match": "(setget)\\s+([a-zA-Z_]\\w*)(?:[,]\\s*([a-zA-Z_]\\w*))?",
"captures": {
"1": {
"name": "storage.type.const.gdscript"
@@ -416,7 +417,7 @@
"include": "#line_continuation"
},
{
"match": "\\s*(\\-\\>)\\s*([a-zA-Z_][a-zA-Z_0-9]*)\\s*\\:",
"match": "\\s*(\\-\\>)\\s*([a-zA-Z_]\\w*)\\s*\\:",
"captures": {
"1": {},
"2": {
@@ -448,7 +449,7 @@
"name": "storage.type.new.gdscript"
}
},
"match": "\\b([a-zA-Z_][a-zA-Z_0-9]*).(new)\\("
"match": "\\b([a-zA-Z_]\\w*).(new)\\("
},
"class_is": {
"captures": {
@@ -459,7 +460,7 @@
"name": "entity.name.type.class.gdscript"
}
},
"match": "\\s+(is)\\s+([a-zA-Z_][a-zA-Z_0-9]*)"
"match": "\\s+(is)\\s+([a-zA-Z_]\\w*)"
},
"class_enum": {
"captures": {
@@ -481,10 +482,10 @@
"name": "class.other.gdscript"
}
},
"match": "(?<=class_name)\\s+([a-zA-Z_][a-zA-Z_0-9]*(\\.([a-zA-Z_][a-zA-Z_0-9]*))?)"
"match": "(?<=class_name)\\s+([a-zA-Z_]\\w*(\\.([a-zA-Z_]\\w*))?)"
},
"extends": {
"match": "(?<=extends)\\s+[a-zA-Z_][a-zA-Z_0-9]*(\\.([a-zA-Z_][a-zA-Z_0-9]*))?",
"match": "(?<=extends)\\s+[a-zA-Z_]\\w*(\\.([a-zA-Z_]\\w*))?",
"name": "entity.other.inherited-class.gdscript"
},
"builtin_func": {
@@ -540,11 +541,11 @@
},
"patterns": [
{
"match": "[a-zA-Z_][a-zA-Z_0-9]*/?",
"match": "[a-zA-Z_]\\w*/?",
"name": "constant.character.escape"
},
{
"match": "%[a-zA-Z_][a-zA-Z_0-9]*/?",
"match": "%[a-zA-Z_]\\w*/?",
"name": "invalid.illegal.escape.gdscript"
}
]
@@ -573,7 +574,7 @@
"name": "support.class.library.gdscript"
},
"signal_declaration_bare": {
"match": "(?x) \\s*\n (signal) \\s+\n ([a-zA-Z_][a-zA-Z_0-9]*)(?=[\\n\\s])",
"match": "(?x) \\s*\n (signal) \\s+\n ([a-zA-Z_]\\w*)(?=[\\n\\s])",
"captures": {
"1": {
"name": "storage.type.function.gdscript"
@@ -585,7 +586,7 @@
},
"signal_declaration": {
"name": "meta.signal.gdscript",
"begin": "(?x) \\s*\n (signal) \\s+\n ([a-zA-Z_][a-zA-Z_0-9]*) \\s*\n (?=\\()",
"begin": "(?x) \\s*\n (signal) \\s+\n ([a-zA-Z_]\\w*) \\s*\n (?=\\()",
"end": "((?=[#'\"\\n]))",
"beginCaptures": {
"1": {
@@ -603,7 +604,7 @@
"include": "#line_continuation"
},
{
"match": "\\s*(\\-\\>)\\s*([a-zA-Z_][a-zA-Z_0-9]*)\\s*\\:",
"match": "\\s*(\\-\\>)\\s*([a-zA-Z_]\\w*)\\s*\\:",
"captures": {
"1": {},
"2": {
@@ -636,7 +637,7 @@
},
"function_declaration": {
"name": "meta.function.gdscript",
"begin": "(?x) \\s*\n (func) \\s+\n ([a-zA-Z_][a-zA-Z_0-9]*) \\s*\n (?=\\()",
"begin": "(?x) \\s*\n (func) \\s+\n ([a-zA-Z_]\\w*) \\s*\n (?=\\()",
"end": "((:)|(?=[#'\"\\n]))",
"beginCaptures": {
"1": {
@@ -659,7 +660,7 @@
"include": "#line_continuation"
},
{
"match": "\\s*(\\-\\>)\\s*([a-zA-Z_][a-zA-Z_0-9]*)\\s*\\:",
"match": "\\s*(\\-\\>)\\s*([a-zA-Z_]\\w*)\\s*\\:",
"captures": {
"1": {},
"2": {
@@ -692,7 +693,7 @@
"include": "#annotated_parameter"
},
{
"match": "(?x)\n ([[:alpha:]_]\\w*)\n \\s* (?: (,) | (?=[)#\\n=]))\n",
"match": "(?x)\n ([a-zA-Z_]\\w*)\n \\s* (?: (,) | (?=[)#\\n=]))\n",
"captures": {
"1": {
"name": "variable.parameter.function.language.gdscript"
@@ -730,7 +731,7 @@
]
},
"annotated_parameter": {
"begin": "(?x)\n \\b\n ([[:alpha:]_]\\w*) \\s* (:)\n",
"begin": "(?x)\n \\b\n ([a-zA-Z_]\\w*) \\s* (:)\n",
"end": "(,)|(?=\\))",
"beginCaptures": {
"1": {
@@ -795,7 +796,7 @@
"function_call": {
"name": "meta.function-call.gdscript",
"comment": "Regular function call of the type \"name(args)\"",
"begin": "(?x)\n \\b(?=\n ([[:alpha:]_]\\w*) \\s* (\\()\n )\n",
"begin": "(?x)\n \\b(?=\n ([a-zA-Z_]\\w*) \\s* (\\()\n )\n",
"end": "(\\))",
"endCaptures": {
"1": {
@@ -822,7 +823,7 @@
{
"comment": "Some color schemas support meta.function-call.generic scope",
"name": "support.function.any-method.gdscript",
"match": "(?x)\n \\b ([[:alpha:]_]\\w*) \\b\n"
"match": "(?x)\n \\b ([a-zA-Z_]\\w*) \\b\n"
}
]
},
@@ -841,7 +842,7 @@
"match": "(,)"
},
{
"match": "\\b([[:alpha:]_]\\w*)\\s*(=)(?!=)",
"match": "\\b([a-zA-Z_]\\w*)\\s*(=)(?!=)",
"captures": {
"1": {
"name": "variable.parameter.function-call.gdscript"

View File

@@ -76,7 +76,7 @@
},
"classifier": {
"name": "meta.classifier.gdshader",
"begin": "(?=\b(?:shader_type|render_mode)\b)",
"begin": "(?=\\b(?:shader_type|render_mode)\\b)",
"patterns": [
{
"include": "#comment"
@@ -95,11 +95,11 @@
},
"classifierKeyword": {
"name": "keyword.language.classifier.gdshader",
"match": "\b(?:shader_type|render_mode)\b"
"match": "\\b(?:shader_type|render_mode)\\b"
},
"identifierClassification": {
"name": "entity.other.inherited-class.gdshader",
"match": "\b[a-z_]+\b"
"match": "\\b[a-z_]+\\b"
},
"definition": {
"patterns": [
@@ -133,7 +133,7 @@
]
},
"structDefinition": {
"begin": "(?=\b(?:struct)\b)",
"begin": "(?=\\b(?:struct)\\b)",
"patterns": [
{
"include": "#comment"
@@ -155,11 +155,11 @@
},
"structKeyword": {
"name": "keyword.other.struct.gdshader",
"match": "\b(?:struct)\b"
"match": "\\b(?:struct)\\b"
},
"structName": {
"name": "entity.name.type.struct.gdshader",
"match": "\b[a-zA-Z_]\\w*\b"
"match": "\\b[a-zA-Z_]\\w*\\b"
},
"structDefinitionBlock": {
"name": "meta.definition.block.struct.gdshader",
@@ -190,7 +190,7 @@
},
"fieldDefinition": {
"name": "meta.definition.field.gdshader",
"begin": "\b[a-zA-Z_]\\w*\b",
"begin": "\\b[a-zA-Z_]\\w*\\b",
"beginCaptures": {
"0": {
"patterns": [
@@ -225,7 +225,7 @@
},
"fieldName": {
"name": "entity.name.variable.field.gdshader",
"match": "\b[a-zA-Z_]\\w*\b"
"match": "\\b[a-zA-Z_]\\w*\\b"
},
"keyword": {
"patterns": [
@@ -254,23 +254,23 @@
},
"controlKeyword": {
"name": "keyword.control.gdshader",
"match": "\b(?:if|else|do|while|for|continue|break|switch|case|default|return|discard)\b"
"match": "\\b(?:if|else|do|while|for|continue|break|switch|case|default|return|discard)\\b"
},
"modifierKeyword": {
"name": "storage.modifier.gdshader",
"match": "\b(?:const|global|instance|uniform|varying|in|out|inout|flat|smooth)\b"
"match": "\\b(?:const|global|instance|uniform|varying|in|out|inout|flat|smooth)\\b"
},
"precisionKeyword": {
"name": "storage.type.built-in.primitive.precision.gdshader",
"match": "\b(?:low|medium|high)p\b"
"match": "\\b(?:low|medium|high)p\\b"
},
"typeKeyword": {
"name": "support.type.gdshader",
"match": "\b(?:void|bool|[biu]?vec[234]|u?int|float|mat[234]|[iu]?sampler(?:3D|2D(?:Array)?)|samplerCube)\b"
"match": "\\b(?:void|bool|[biu]?vec[234]|u?int|float|mat[234]|[iu]?sampler(?:3D|2D(?:Array)?)|samplerCube)\\b"
},
"hintKeyword": {
"name": "support.type.annotation.gdshader",
"match": "\b(?:source_color|hint_(?:color|range|(?:black_)?albedo|normal|(?:default_)?(?:white|black)|aniso|anisotropy|roughness_(?:[rgba]|normal|gray))|filter_(?:nearest|linear)(?:_mipmap(?:_anisotropic)?)?|repeat_(?:en|dis)able)\b"
"match": "\\b(?:source_color|hint_(?:color|range|(?:black_)?albedo|normal|(?:default_)?(?:white|black)|aniso|anisotropy|roughness_(?:[rgba]|normal|gray))|filter_(?:nearest|linear)(?:_mipmap(?:_anisotropic)?)?|repeat_(?:en|dis)able)\\b"
},
"element": {
"patterns": [
@@ -314,51 +314,65 @@
},
"literalFloat": {
"name": "constant.numeric.float.gdshader",
"match": "\b(?:\\d+[eE][-+]?\\d+|(?:\\d*[.]\\d+|\\d+[.])(?:[eE][-+]?\\d+)?)[fF]?"
"match": "\\b(?:\\d+[eE][-+]?\\d+|(?:\\d*[.]\\d+|\\d+[.])(?:[eE][-+]?\\d+)?)[fF]?"
},
"literalInt": {
"name": "constant.numeric.integer.gdshader",
"match": "\b(?:0[xX][0-9A-Fa-f]+|\\d+[uU]?)\b"
"match": "\\b(?:0[xX][0-9A-Fa-f]+|\\d+[uU]?)\\b"
},
"literalBool": {
"name": "constant.language.boolean.gdshader",
"match": "\b(?:false|true)\b"
"match": "\\b(?:false|true)\\b"
},
"identifierType": {
"name": "entity.name.type.gdshader",
"match": "\b[a-zA-Z_]\\w*(?=(?:\\s*\\[\\s*\\w*\\s*\\])?\\s+[a-zA-Z_]\\w*\b)"
"match": "\\b[a-zA-Z_]\\w*(?=(?:\\s*\\[\\s*\\w*\\s*\\])?\\s+[a-zA-Z_]\\w*\\b)"
},
"constructor": {
"name": "entity.name.type.constructor.gdshader",
"match": "\b[a-zA-Z_]\\w*(?=\\s*\\[\\s*\\w*\\s*\\]\\s*[(])|\b[A-Z]\\w*(?=\\s*[(])"
"match": "\\b[a-zA-Z_]\\w*(?=\\s*\\[\\s*\\w*\\s*\\]\\s*[(])|\\b[A-Z]\\w*(?=\\s*[(])"
},
"processorFunction": {
"name": "support.function.gdshader",
"match": "\b(?:vertex|fragment|light|start|process|sky|fog)(?=(?:\\s|/\\*(?:\\*(?!/)|[^*])*\\*/)*[(])"
"match": "\\b(?:vertex|fragment|light|start|process|sky|fog)(?=(?:\\s|/\\*(?:\\*(?!/)|[^*])*\\*/)*[(])"
},
"identifierFunction": {
"name": "entity.name.function.gdshader",
"match": "\b[a-zA-Z_]\\w*(?=(?:\\s|/\\*(?:\\*(?!/)|[^*])*\\*/)*[(])"
"match": "\\b[a-zA-Z_]\\w*(?=(?:\\s|/\\*(?:\\*(?!/)|[^*])*\\*/)*[(])"
},
"swizzling": {
"name": "variable.other.property.gdshader",
"match": "(?<=[.]\\s*)(?:[xyzw]{2,4}|[rgba]{2,4}|[stpq]{2,4})\b"
"match": "([.])\\s*([xyzw]{2,4}|[rgba]{2,4}|[stpq]{2,4})\\b",
"captures": {
"1": {
"name": "punctuation.accessor.gdshader"
},
"2": {
"name": "variable.other.property.gdshader"
}
}
},
"identifierField": {
"name": "entity.name.variable.field.gdshader",
"match": "(?<=[.]\\s*)[a-zA-Z_]\\w*\b"
"match": "([.])\\s*([a-zA-Z_]\\w*)\\b(?!\\s*\\()",
"captures": {
"1": {
"name": "punctuation.accessor.gdshader"
},
"2": {
"name": "entity.name.variable.field.gdshader"
}
}
},
"constantFloat": {
"name": "constant.language.float.gdshader",
"match": "\b(?:E|PI|TAU)\b"
"match": "\\b(?:E|PI|TAU)\\b"
},
"languageVariable": {
"name": "variable.language.gdshader",
"match": "\b(?:[A-Z][A-Z_0-9]*)\b"
"match": "\\b(?:[A-Z][A-Z_0-9]*)\\b"
},
"identifierVariable": {
"name": "variable.name.gdshader",
"match": "\b[a-zA-Z_]\\w*\b"
"match": "\\b[a-zA-Z_]\\w*\\b"
},
"separator": {
"patterns": [

View File

@@ -0,0 +1,193 @@
shader_type spatial;
render_mode wireframe;
const lowp vec3 v[1] = lowp vec3[1] ( vec3(0, 0, 1) );
void fn() {
// The required amount of scalars
vec4 a0 = vec4(0.0, 1.0, 2.0, 3.0);
// Complementary vectors and/or scalars
vec4 a1 = vec4(vec2(0.0, 1.0), vec2(2.0, 3.0));
vec4 a2 = vec4(vec3(0.0, 1.0, 2.0), 3.0);
// A single scalar for the whole vector
vec4 a3 = vec4(0.0);
mat2 m2 = mat2(vec2(1.0, 0.0), vec2(0.0, 1.0));
mat3 m3 = mat3(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, 0.0, 1.0));
mat4 identity = mat4(1.0);
mat3 basis = mat3(identity);
mat4 m4 = mat4(basis);
mat2 m2a = mat2(m4);
vec4 a = vec4(0.0, 1.0, 2.0, 3.0);
vec3 b = a.rgb; // Creates a vec3 with vec4 components.
vec3 b1 = a.ggg; // Also valid; creates a vec3 and fills it with a single vec4 component.
vec3 b2 = a.bgr; // "b" will be vec3(2.0, 1.0, 0.0).
vec3 b3 = a.xyz; // Also rgba, xyzw are equivalent.
vec3 b4 = a.stp; // And stpq (for texture coordinates).
b.bgr = a.rgb; // Valid assignment. "b"'s "blue" component will be "a"'s "red" and vice versa.
lowp vec4 v0 = vec4(0.0, 1.0, 2.0, 3.0); // low precision, usually 8 bits per component mapped to 0-1
mediump vec4 v1 = vec4(0.0, 1.0, 2.0, 3.0); // medium precision, usually 16 bits or half float
highp vec4 v2 = vec4(0.0, 1.0, 2.0, 3.0); // high precision, uses full float or integer range (default)
const vec2 aa = vec2(0.0, 1.0);
vec2 bb;
bb = aa; // valid
const vec2 V1 = vec2(1, 1), V2 = vec2(2, 2);
float fa = 1.0;
float fb = 1.0f;
float fc = 1e-1;
uint ua = 1u;
uint ub = uint(1);
bool cond = false;
// `if` and `else`.
if (cond) {
} else {
}
// Ternary operator.
// This is an expression that behaves like `if`/`else` and returns the value.
// If `cond` evaluates to `true`, `result` will be `9`.
// Otherwise, `result` will be `5`.
int i, result = cond ? 9 : 5;
// `switch`.
switch (i) { // `i` should be a signed integer expression.
case -1:
break;
case 0:
return; // `break` or `return` to avoid running the next `case`.
case 1: // Fallthrough (no `break` or `return`): will run the next `case`.
case 2:
break;
//...
default: // Only run if no `case` above matches. Optional.
break;
}
// `for` loop. Best used when the number of elements to iterate on
// is known in advance.
for (int i = 0; i < 10; i++) {
}
// `while` loop. Best used when the number of elements to iterate on
// is not known in advance.
while (cond) {
}
// `do while`. Like `while`, but always runs at least once even if `cond`
// never evaluates to `true`.
do {
} while (cond);
}
const float PI_ = 3.14159265358979323846;
struct PointLight {
vec3 position;
vec3 color;
float intensity;
};
struct Scene {
PointLight lights[2];
};
const Scene scene = Scene(PointLight[2](
PointLight(vec3(0.0, 0.0, 0.0), vec3(1.0, 0.0, 0.0), 1.0),
PointLight(vec3(0.0, 0.0, 0.0), vec3(1.0, 0.0, 0.0), 1.0)
));
Scene construct_scene(PointLight light1, PointLight light2) {
return Scene({light1, light2});
}
varying flat vec3 some_color;
varying float var_arr[3];
varying smooth vec3 some_light;
uniform float some_value;
uniform vec4 color : hint_color;
uniform float amount : hint_range(0, 1);
uniform vec4 other_color : hint_color = vec4(1.0);
uniform vec4 some_vector = vec4(0.0);
uniform vec4 some_color2 : hint_color = vec4(1.0);
void vertex() {
const float arr[] = { 1.0, 0.5, 0.0 };
COLOR.r = arr[0]; // valid
float arr2[3];
arr2[0] = 1.0; // setter
COLOR.r = arr2[0]; // getter
PointLight light;
light.position = vec3(0.0);
light.color = vec3(1.0, 0.0, 0.0);
light.intensity = 0.5;
COLOR.rgb = construct_scene(
PointLight(vec3(0.0, 0.0, 0.0), vec3(1.0, 0.0, 0.0), 1.0),
PointLight(vec3(0.0, 0.0, 0.0), vec3(1.0, 0.0, 1.0), 1.0)
).lights[0].color;
some_color = NORMAL; // Make the normal the color.
var_arr[0] = 1.0;
var_arr[1] = 0.0;
}
void fragment() {
float arr[3];
float float_arr[3] = float[3] (1.0, 0.5, 0.0); // first constructor
int int_arr[3] = int[] (2, 1, 0); // second constructor
vec2 vec2_arr[3] = { vec2(1.0, 1.0), vec2(0.5, 0.5), vec2(0.0, 0.0) }; // third constructor
bool bool_arr[] = { true, true, false }; // fourth constructor - size is defined automatically from the element count
float a[3] = float[3] (1.0, 0.5, 0.0),
b[2] = { 1.0, 0.5 },
c[] = { 0.7 },
d = 0.0,
e[5];
float arr2[] = { 0.0, 1.0, 0.5, -1.0 };
for (int i = 0; i < arr2.length(); i++) {
}
ALBEDO = v[0];
PointLight light = PointLight(vec3(0.0), vec3(1.0, 0.0, 0.0), 0.5);
ALBEDO = scene.lights[0].color;
const float EPSILON = 0.0001, value = 0.f;
if (value >= 0.3 - EPSILON && value <= 0.3 + EPSILON) {
discard;
}
ALBEDO = vec3(var_arr[0], var_arr[1], var_arr[2]); // red color
some_light = ALBEDO * 100.0; // Make a shining light.
}
void sum2(int a, in int b, inout int result) {
result = a + b;
}
void sub2(const int a, const in int b, out int result) {
result = a - b;
}
global uniform sampler2D global1;
instance uniform int un = 0;
void light() {
DIFFUSE_LIGHT = some_color * 100.; // optionally
DIFFUSE_LIGHT = some_light;
}

View File

@@ -241,6 +241,12 @@ class InnerClass:
for i in range(10): # "in" should be purple (control flow)
list.append(i)
for child in get_children():
print(child)
for child in get_children():
print(child)
if true and true:
pass
elif 'foo' in list: # "in" should be blue (boolean operator)