Переменная gl_FragColor
недоступна в профиле ядра GLSL 4.4, поскольку она устарела. Поскольку вы не указываете профиль compatibility
, предполагается значение по умолчанию core
. Либо используйте
#version 440 compatibility
для своих шейдеров, либо, что еще лучше, используйте подход GLSL 4.4 и выше:
#version 440 core
layout(location = 0) out vec4 OUT;
void main(){
OUT = vec4(0.0, 1.0, 0.0, 1.0);
}
Я думаю, что это может работать. Если кто-либо видит что-то, что я не делаю, как причина, она не будет работать, ответьте.
if\s*\(((?:[^\(\)]|\((?1)\))*+)\)\s*{((?:[^{}]|{(?2)})*+)}
Единственная проблема, с которой это должно встретиться теперь, состоит в том, если существует если оператор в если оператор.
Я протестировал это на каждом допустимом, если оператор, о котором я могу думать, который мог бы повредить его и единственная вещь, что он не продолжает работать, является тем, который содержит строку с несопоставленной круглой скобкой.
Обновление: Я нашел ошибку с вышеупомянутым регулярным выражением. Это не ловит, если операторы, который содержит строки с несопоставленной круглой скобкой в их условии или разделах оператора. Как следующий пример:
if (var1 == "("){
echo "{";
}
Однако это - допустимое если оператор. Решение:
if\s*\(((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^\(\)]|\((?1)\))*+)\)\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?2)})*+)}\s*
Это регулярное выражение получает все, если операторы даже, которые содержат строки с несопоставленной круглой скобкой.
ОБНОВЛЕНИЕ: у Меня теперь есть он так, чтобы еще были получения и еще если операторы, которые присоединены если операторы. Единственная проблема состоит в том, что группы получения, которые это возвращает, еще являются последними и еще последними если в если оператор. Надо надеяться, я выясню, как обойти это также.
if\s*\(((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^\(\)]|\((?1)\))*+)\)\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?2)})*+)}\s*(?:(?:else\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?3)})*+)}\s*)|(?:else\s*if\s*\(((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^\(\)]|\((?4)\))*+)\)\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?5)})*+)}\s*))*;
Если Вы хотите проверить его, вот большой веб-сайт для него: http://gskinner.com/RegExr/
Это не возможно с регулярными выражениями, так как регулярные выражения могут только соответствовать регулярным языкам и тому, который Вы пытаетесь проанализировать, является контекстно-свободным и не регулярным (благодаря dirkgently и dmckee).
Взгляните на WP: Теория формальных языков - Вы, интересно...
Btw. Вы не можете даже проверить выражение, только сделанное из круглых скобок, если это корректно ( [[][]]
корректно, но []][
не), который является "подпроблемой" той, которую Вы дали выше.
Необходимо написать код на полном по Тьюрингу языке. Существуют инструменты, которые могут автоматически создать код для Вас, такой как Flex. Однако, если у Вас просто есть простая проблема, является, вероятно, самым легким просто написать некоторый простой код парсинга самих. Вот является некоторый пример кодом C#, который мог бы помочь Вам начать.
public void TestIf()
{
var s = @"if (condition_function(params)) {
statements;
}";
var ifRegex = @"if *\(.*\) *{.*}";
if (Regex.IsMatch(s, ifRegex, RegexOptions.Singleline))
{
var firstParens = s.IndexOf('(');
if (firstParens != -1)
{
var conditionPart = s.Skip(firstParens + 1);
int stack = 1;
int lastParens = -1;
while(stack > 0)
{
for (int i = 0; i < conditionPart.Count(); i++)
{
var c = conditionPart.ElementAt(i);
if (c == '(')
{
stack++;
}
if (c == ')')
{
stack--;
}
if (stack == 0)
{
lastParens = i;
break;
}
}
}
if (lastParens != -1)
{
var condition = conditionPart.Take(lastParens);
Console.WriteLine(new string(condition.ToArray()));
}
}
}
}
Вы пытаетесь записать регулярное выражение для парсинга нерегулярного языка? Это никогда не будет лететь.
Если необходимо использовать regexp даже при том, что он никогда не будет ловить все случаи, этот лучше:
if\s*\(((?!\s*\{).+)\)\s*\{(.|\s)*?\}
Это использует положительное предвидение ((?!\s*\{).
) которые удостоверяются для получения всех до закрытия )
(кроме того, если Ваш оператор условия имеет"{
"в нем! Это - то, где regexp не может помочь Вам),
r = /\bif\s*\(/
txt = <<TXT
if(test)
if (test)
if (xyz)
; if
print x if(true)
TXT
p txt.scan(r)
если (что-то).. что-то может быть чем-либо.. если будет строка с концом круглой скобки в нем, и Вы хотите иметь дело правильно с соответствием парам круглой скобки затем, то Вы быстро закончите с большим regex.
Также, против какого языка Вы пытаетесь соответствовать?
быстрый выстрел в него...
if\s*?\(.*?)\s*?(({?\s*?(.*?;)+\s*?})|(.*?;))