

Barra de Salud : 
Mensajes : 299
Reputación : 64 Monedas de oro : 1681 Monedas de Platino : 0 ![[Propuesta] Crear "nuevo" vJASS Empty](https://2img.net/i/fa/empty.gif)
Inventario : ![[Propuesta] Crear "nuevo" vJASS Empysl10](https://i.servimg.com/u/f73/18/43/73/24/empysl10.png) ![[Propuesta] Crear "nuevo" vJASS Empysl10](https://i.servimg.com/u/f73/18/43/73/24/empysl10.png)
![[Propuesta] Crear "nuevo" vJASS Empty](https://2img.net/i/fa/empty.gif) | (#) Tema: [Propuesta] Crear "nuevo" vJASS Miér Mar 26, 2014 7:11 pm | |
| Estoy considerando muy seriamente iniciar un proyecto meramente didactico el cual tiene como objetivo crear un muy sencillo "nuevo" vJASS. El mismo ademas, requerira una modificacion a TESH (lo que le da color al codigo en World Edit) para que se adapte a la nueva sintaxis (la cual sera c-like por cierto). El lenguaje que tengo en mente para desarrollar este proyecto es Python (si no lo conoces, esta bien, es muy facil aprenderlo). Para que se den una idea, la primera tarea sera que TESH pueda dar correcto formato al siguiente codigo: [jass]class Ejemplo { public method __construct() { BJDebugMsg("Mensaje de prueba"); } }[/jass] Y la segunda tarea, será que el codigo generado sea el siguiente: [jass]function Ejemplo__construct takes nothing returns nothing call BJDebugMsg("Mensaje de prueba") endfunction[/jass] Ademas, en caso de haber algún error de sintaxis, se le debe notificar al usuario. Aquellos que quieran participar, deben tener minimo un conocimiento medio en programacion. El tener experiencia en este tipo de proyectos no es requerido (por mi parte nunca hice algo parecido y es mas o menos la idea). Los interesados haganme saber. Saludos. edit: Los otros dias comence e hice esto rapidamente: - progreso:
- gramatica:
- Código:
-
from pyparsing import *
alpha = Word(alphas) publicKeyword = Keyword("public") protectedKeyword = Keyword("protected") number = Word(nums) string = "\"" + Word(alphanums) + "\"" rawcode = "'" + Word(alphanums, max=4, min=4) + "'" # rawcodes solamente pueden ser de 4 caracteres de largo variableType = alpha operator = Word("-+*/", max=1) relationalOperator = (Word("<>!", max=1) + Optional("=")) ^ Word("==") # !=, ==, <, >, etc logicalOperator = Word("&&") ^ Word("||") # si falta el operador not, pero es mas facil agregarlo directamente en la expresion boleana values = Forward() typedArgument = variableType - alpha + Optional("=" - values) # argumentos en los cuales se debe especificar el tipo (por ejemplo: <unit> caster) typedArguments = typedArgument - ZeroOrMore("," - typedArgument) arguments = values - ZeroOrMore("," - values) # argumentos en donde no se debe especificar el tipo functionCall = alpha - "(" - ZeroOrMore(arguments) - ")" methodCall = alpha - "." - functionCall anonymousFunction = Forward() value = (functionCall ^ anonymousFunction ^ alpha ^ number ^ string ^ rawcode) values <<= value - ZeroOrMore(operator - value) variableDeclaration = variableType - alpha - Optional("=" - OneOrMore(values)) setVariable = Optional(alpha + ".") - alpha - Optional(operator) - "=" - OneOrMore(values) blockCode = Forward() booleanExpression = Optional("!") + value + Optional(relationalOperator + value) booleanExpresions = booleanExpression - ZeroOrMore(logicalOperator - booleanExpression) returnDefinition = Keyword("return") - (OneOrMore(values) ^ ZeroOrMore(booleanExpresions) ^ Empty()) elseifDefinition = Keyword("elseif") - "(" - OneOrMore(booleanExpression) - ")" - blockCode elseDefinition = Keyword("else") - blockCode ifDefinition = Keyword("if") - "(" - OneOrMore(booleanExpression) - ")" - blockCode - ZeroOrMore(elseifDefinition) + Optional(elseDefinition) expression = ((functionCall ^ returnDefinition ^ variableDeclaration ^ setVariable ^ methodCall) - ";") ^ ifDefinition blockCode <<= "{" - Group(ZeroOrMore(expression)) - "}" functionDefinition = Optional(publicKeyword) + variableType - alpha - "(" - ZeroOrMore(typedArguments) - ")" - blockCode anonymousFunction <<= variableType - "(" - ZeroOrMore(typedArguments) - ")" - blockCode staticKeyword = Keyword("static") methodDefinition = Optional(publicKeyword ^ protectedKeyword) + Optional(staticKeyword) + variableType - alpha - "(" - ZeroOrMore(typedArguments) - ")" - blockCode propertyDefinition = Optional(publicKeyword ^ protectedKeyword) + Optional(staticKeyword) + variableDeclaration classBody = "{" - Group(ZeroOrMore(methodDefinition) & ZeroOrMore(propertyDefinition - ";")) - "}" classDefinition = Optional(publicKeyword) + Keyword("class") - alpha - classBody globalVariableDefinition = Optional(publicKeyword) + variableDeclaration libraryBody = Group(ZeroOrMore(functionDefinition) & ZeroOrMore(globalVariableDefinition - ";") & ZeroOrMore(classDefinition)) requirement = alpha requirements = requirement - ZeroOrMore("," - requirement) grammar = Keyword("library") - alpha - Optional(Keyword("requires") - OneOrMore(requirements)) - "{" - libraryBody - "}"
# cargamos y leemos el archivo de prueba testFile = open("example.txt", "r") code = testFile.read() testFile.close()
# y vemos que sale <.< parsed = grammar.parseString(code, parseAll=True)
print code print parsed
# luego de "desmenuzar" el codigo, hay que ir parte por parte # para pasar el codigo a jass puro # en esta parte, solamente mostramos el nombre de la libreria print "El nombre de la libreria es: ", parsed[1]
- ayuda para entender la gramatica:
Para la gramatica utilizo PyParsing (referencia rapida) el cual debo decir es bastante intuitivo. Basicamente:
- alpha = Letras de a - z
- Keyword("x") = Establece una palabra clave (como return o call por ejemplo)
- number = Numeros de 0-9
- alphanums = Letras y numeros
- ^ = Significa "o" (or) (por ejemplo, false ^ true, se traduce a false o true)
- Forward() = Algunas expresiones requieren de otras que aun no han sido establecidas. Forward() resuelve este problema
- <<= = Se utiliza al usar Forward()
- expresion1 - expresion2 o expresion1 + expresion2 = Significa que primero se debe cumplir la expresion1 y debe seguirla la segunda expresion (que tambien debe cumplirse). Usar "+" o "-" es lo mismo. "+" se usa en Optional y "-" es para tener un mejor rastreo de errores
- Group = Lo utilizare para cuando haya que pasar todo a jass puro, ignorar.
- expresion1 & expresion2 = Util cuando no queremos que el orden importe (por ejemplo en el cuerpo de una clase, podemos tener la definicion de properties en cualquier parte al igual que sus metodos)
Se la banca bastante, le duele un poco procesar el codigo (tarda un rato, algo asi como 1 segundo, 2-3 cuando tiene sus dias) pero arroja buenos resultados. example.txt - codigo que uso para las pruebas:
- Spoiler:
[jass]library t requires hola, pepe, salt { public unit y = 2 + 8 + 5 - 2;
class Ejemplo { unit y = 2;
protected void saludar(unit u) { GroupEnumUnitsInRange(g, 0, 0, 200, Filter(boolean() { if ( true ) { return false; } return GetWidgetLife() != 0 && 1 <= 0; })); }
protected void constructor() { this.saludar(); } }
class Ejemplo { protected void saludar(unit u) { GroupEnumUnitsInRange(g, 0, 0, 200, Filter(boolean() { if ( true ) { return false; } return GetWidgetLife() > 0 && 1 < 0; })); }
protected void constructor() { this.saludar(); } }
unit doSomething() { KillUnit(CreateUnit(2), 5 + 7 + 9); unit = CreateUnit(); } public unit doSomething(unit target) { KillUnit(CreateUnit(2), 5 + 7 + 9); }
unit doSomething() { KillUnit(CreateUnit(2), 5 + 7 + 9); unit = CreateUnit(); } public unit doSomething(unit target) { KillUnit(CreateUnit(2), 5 + 7 + 9); } }[/jass]
- notas:
Cambie ligeramente la sintaxis a como se proponia en un inicio (las palabras clave function/method han sido removidas) y ademas, agregue un poco de funcionalidad extra (como funciones anonimas y argumentos con valores por defecto) como para hacerlo mas interesante.
Última edición por Ruke el Dom Mar 30, 2014 6:14 pm, editado 4 veces |
|


Barra de Salud : 
Mensajes : 546
Reputación : 151 Monedas de oro : -194 Monedas de Platino : 0 ![[Propuesta] Crear "nuevo" vJASS Empty](https://2img.net/i/fa/empty.gif)
Inventario : ![[Propuesta] Crear "nuevo" vJASS Empysl10](https://i.servimg.com/u/f73/18/43/73/24/empysl10.png) ![[Propuesta] Crear "nuevo" vJASS Empysl10](https://i.servimg.com/u/f73/18/43/73/24/empysl10.png)
![[Propuesta] Crear "nuevo" vJASS Empty](https://2img.net/i/fa/empty.gif) | (#) Tema: Re: [Propuesta] Crear "nuevo" vJASS Miér Mar 26, 2014 7:20 pm | |
| cual es el objetivo d esto wn. no es a muchos los que le interesa aprender vjass asi se cambie la sintaxis seguira siendo la misma wea...
mejor creemos un juego y a tomar por culo :v  Desarrollador de Software Contactar |
|


Barra de Salud : 
Mensajes : 3664
Reputación : 730 Monedas de oro : 11244 Monedas de Platino : 0 ![[Propuesta] Crear "nuevo" vJASS Empty](https://2img.net/i/fa/empty.gif)
Inventario : ![[Propuesta] Crear "nuevo" vJASS Empysl10](https://i.servimg.com/u/f73/18/43/73/24/empysl10.png) ![[Propuesta] Crear "nuevo" vJASS Empysl10](https://i.servimg.com/u/f73/18/43/73/24/empysl10.png)
![[Propuesta] Crear "nuevo" vJASS Empty](https://2img.net/i/fa/empty.gif) | (#) Tema: Re: [Propuesta] Crear "nuevo" vJASS Miér Mar 26, 2014 8:12 pm | |
| Lamentablemente solo programo JASS, pero apoyo el proyecto en espíritu  |
|


Barra de Salud : 
Mensajes : 299
Reputación : 64 Monedas de oro : 1681 Monedas de Platino : 0 ![[Propuesta] Crear "nuevo" vJASS Empty](https://2img.net/i/fa/empty.gif)
Inventario : ![[Propuesta] Crear "nuevo" vJASS Empysl10](https://i.servimg.com/u/f73/18/43/73/24/empysl10.png) ![[Propuesta] Crear "nuevo" vJASS Empysl10](https://i.servimg.com/u/f73/18/43/73/24/empysl10.png)
![[Propuesta] Crear "nuevo" vJASS Empty](https://2img.net/i/fa/empty.gif) | (#) Tema: Re: [Propuesta] Crear "nuevo" vJASS Miér Mar 26, 2014 8:19 pm | |
| - Marcos_M escribió:
- Lamentablemente solo programo JASS, pero apoyo el proyecto en espíritu
 Pensaba que te ibas a sumar :c |
|
Soldado

Barra de Salud : 
Mensajes : 120
Reputación : 32 Monedas de oro : 406 ![[Propuesta] Crear "nuevo" vJASS Empty](https://2img.net/i/fa/empty.gif)
Inventario : ![[Propuesta] Crear "nuevo" vJASS Empysl10](https://i.servimg.com/u/f73/18/43/73/24/empysl10.png) ![[Propuesta] Crear "nuevo" vJASS Empysl10](https://i.servimg.com/u/f73/18/43/73/24/empysl10.png)
![[Propuesta] Crear "nuevo" vJASS Empty](https://2img.net/i/fa/empty.gif) | (#) Tema: Re: [Propuesta] Crear "nuevo" vJASS Miér Mar 26, 2014 8:36 pm | |
| (lol XD un juego nuevo Koleshy...), analizando un poco el objetivo del proyecto es lo siguiente.. En si lo que se puede hacer en we es bien amplio, y si se tiene un entorno mas estructurado con extensiones claro (como el wurstScript que supongo que es la idea de ruke  ), seria mas facil generar codigo y el uso compartido le daria un punto a su favor... cosa que no posee :b aun el we.. Bueno, eso es lo que creo :V ... |
|


Barra de Salud : 
Mensajes : 3664
Reputación : 730 Monedas de oro : 11244 Monedas de Platino : 0 ![[Propuesta] Crear "nuevo" vJASS Empty](https://2img.net/i/fa/empty.gif)
Inventario : ![[Propuesta] Crear "nuevo" vJASS Empysl10](https://i.servimg.com/u/f73/18/43/73/24/empysl10.png) ![[Propuesta] Crear "nuevo" vJASS Empysl10](https://i.servimg.com/u/f73/18/43/73/24/empysl10.png)
![[Propuesta] Crear "nuevo" vJASS Empty](https://2img.net/i/fa/empty.gif) | (#) Tema: Re: [Propuesta] Crear "nuevo" vJASS Miér Mar 26, 2014 8:55 pm | |
| Hagan un GUI con Structs! |
|


Barra de Salud : 
Mensajes : 299
Reputación : 64 Monedas de oro : 1681 Monedas de Platino : 0 ![[Propuesta] Crear "nuevo" vJASS Empty](https://2img.net/i/fa/empty.gif)
Inventario : ![[Propuesta] Crear "nuevo" vJASS Empysl10](https://i.servimg.com/u/f73/18/43/73/24/empysl10.png) ![[Propuesta] Crear "nuevo" vJASS Empysl10](https://i.servimg.com/u/f73/18/43/73/24/empysl10.png)
![[Propuesta] Crear "nuevo" vJASS Empty](https://2img.net/i/fa/empty.gif) | (#) Tema: Re: [Propuesta] Crear "nuevo" vJASS Dom Mar 30, 2014 5:38 pm | |
| Comenzando con la gramatica. |
|
![[Propuesta] Crear "nuevo" vJASS Empty](https://2img.net/i/fa/empty.gif) | (#) Tema: Re: [Propuesta] Crear "nuevo" vJASS ![[Propuesta] Crear "nuevo" vJASS Clock10](https://i.servimg.com/u/f73/18/43/73/24/clock10.png) | |
| |
|