Регулярное выражение, чтобы определить, если операторы

Переменная 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);
}
5
задан Chris Cudmore 16 March 2009 в 20:10
поделиться

7 ответов

Я думаю, что это может работать. Если кто-либо видит что-то, что я не делаю, как причина, она не будет работать, ответьте.

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/

8
ответ дан 18 December 2019 в 05:50
поделиться

Это не возможно с регулярными выражениями, так как регулярные выражения могут только соответствовать регулярным языкам и тому, который Вы пытаетесь проанализировать, является контекстно-свободным и не регулярным (благодаря dirkgently и dmckee).

Взгляните на WP: Теория формальных языков - Вы, интересно...

Btw. Вы не можете даже проверить выражение, только сделанное из круглых скобок, если это корректно ( [[][]] корректно, но []][ не), который является "подпроблемой" той, которую Вы дали выше.

13
ответ дан 18 December 2019 в 05:50
поделиться

Необходимо написать код на полном по Тьюрингу языке. Существуют инструменты, которые могут автоматически создать код для Вас, такой как 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()));
          }
        }
      }
    } 
3
ответ дан 18 December 2019 в 05:50
поделиться

Вы пытаетесь записать регулярное выражение для парсинга нерегулярного языка? Это никогда не будет лететь.

5
ответ дан 18 December 2019 в 05:50
поделиться

Если необходимо использовать regexp даже при том, что он никогда не будет ловить все случаи, этот лучше:

if\s*\(((?!\s*\{).+)\)\s*\{(.|\s)*?\}

Это использует положительное предвидение ((?!\s*\{).) которые удостоверяются для получения всех до закрытия ) (кроме того, если Ваш оператор условия имеет"{"в нем! Это - то, где regexp не может помочь Вам),

0
ответ дан 18 December 2019 в 05:50
поделиться
r = /\bif\s*\(/

txt = <<TXT
if(test)
if (test)
if  (xyz)
; if
print x if(true)
TXT

p txt.scan(r)

если (что-то).. что-то может быть чем-либо.. если будет строка с концом круглой скобки в нем, и Вы хотите иметь дело правильно с соответствием парам круглой скобки затем, то Вы быстро закончите с большим regex.

Также, против какого языка Вы пытаетесь соответствовать?

1
ответ дан 18 December 2019 в 05:50
поделиться

быстрый выстрел в него...

if\s*?\(.*?)\s*?(({?\s*?(.*?;)+\s*?})|(.*?;))
0
ответ дан 18 December 2019 в 05:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: