Estoy tratando de extraer todas las variables globales (p. ej., float) de un código determinado:
float aaa = 3.0; float sat( float t ) { return clamp( t, 0.0, 1.0 ); } float bbb = 3.0; vec3 spectrum_offset( float t ) { float t0 = 3.0; return clamp( vec3( -t0, 1.0-abs(t0), t0), 0.0, 1.0); }Mi resultado esperado es:
float aaa = 3.0; float bbb = 3.0;Probé con la siguiente expresión regular:
^\s*float\s+.*\s*=\s*.*;
Un ejemplo en línea en regexr.com
lo que me da el resultado:
float aaa = 3.0; float bbb = 3.0; float t0 = 3.0; Como puede ver, el último t0 está dentro del cuerpo de una función, por lo que este es el que no debe seleccionarse.
¿Cómo puedo descartar la variable dentro de cualquier cuerpo de función dejando solo las que están en el área global?
Cualquier consejo será apreciado, gracias :)
Si bien esta respuesta no usa directamente expresiones regulares, publico esto como una solución alternativa para analizar lo que parece un código GLSL.
En general, intentar analizar cualquier cosa que se considere un lenguaje de programación utilizando expresiones regulares es un mal plan. Esto se debe a la complejidad de los idiomas, es decir, cosas como comentarios, alcance variable, caracteres de escape, etc.
Siempre es mejor usar un analizador creado para analizar el idioma. Por lo general, hay analizadores disponibles para muchos idiomas que crean un AST.
scope que contiene una lista de globales.sat también se considera incluida en el scopefloat .globals AST de salida incluye los números de línea y la posición de los globales encontrados. var tokenString = require('glsl-tokenizer/string'); var parseTokens = require('glsl-parser/direct') const code = ` float aaa = 3.0; float sat( float t ) { return clamp( t, 0.0, 1.0 ); } float bbb = 3.0; vec3 spectrum_offset( float t ) { float t0 = 3.0; return clamp( vec3( -t0, 1.0-abs(t0), t0), 0.0, 1.0); } `; const tokens = tokenString(code); const ast = parseTokens(tokens) function filterObject(obj, callback) { return Object.fromEntries(Object.entries(obj). filter(([key, val]) => callback(val, key))); } const globals = filterObject(ast.scope, x => ( x.parent.type === 'decllist' && x.parent.parent.token.data == "float" )); return globals;Puede ver este código ejecutándose aquí: https://runkit.com/deanmarktaylor/find-global-variables-in-glsl-code
Aquí hay ejemplos de objetos de salida, tenga en cuenta el número de línea y la posición que podrían ser útiles. 
Si busca hacer algo más que simplemente saber dónde están las variables en el código y manipular estas variables encontradas... En lugar de manipular la cadena de las variables float globales encontradas, puede encontrar que es mejor usar el AST, ajustarlo y luego generar el código del AST.