Pregunta

Estoy construyendo una solución para un cliente que les permite crear un código muy básico, Ahora he hecho un poco de validación básica de sintaxis, pero estoy atascado en la verificación variable.

Sé JSLint hace esto usando Javascript y me preguntaba si alguien sabía de una buena manera de hacer esto.

Así, por ejemplo, decir que el usuario escribió el código

moose = "barry"
base = 0
if(moose == "barry"){base += 100}

A continuación, estoy tratando de encontrar una manera de aclarar que el "si" es la expresión en la sintaxis correcta, si el alce variable se ha inicializado, etc, etc pero quiero hacer esto sin el escaneo de carácter por carácter, el código es un mini lenguaje construido sólo para esta aplicación de forma es muy muy básico y no tiene de gestionar la memoria o algo por el estilo.

Yo había pensado en la división por primera vez por el retorno de carro y luego por el espacio, pero no hay nada que decir que el usuario va a escribir algo que no gusta o moose="barry" if(moose=="barry") y no hay nada que decir que el usuario no va a mantener el resultado de una condición en línea.

Obviamente compiladores e intérpretes hacen esto en una escala mucho más amplia, pero no estoy seguro si lo hacen carácter por carácter y si lo hacen ¿cómo han optimizado?

(Otra opción es que podría enviarlo de nuevo a PHP para el proceso que luego releave el navegador de la responsabilidad)

¿Alguna sugerencia?

Gracias

El caso de uso es limitado, la sintaxis no se extenderá en este caso, el lenguaje es un lenguaje sencillo guión para que el cliente para crear un costo único basado en la entrada de los usuarios el resultado final será procesada por PHP sin tener en cuenta a asegurar el cálculo no se puede ajustar por el usuario final y para asegurar que no es cierta consistencia.

Así, por ejemplo, dicen que hay un costo de £ 1.00 de base y hay un campo en el formulario llamado "costo adicional", el idioma les permitirá manipular el costo base con relación al campo "costo adicional".

Entonces

base = 1;
if(additional > 100 && additional < 150){base += 50}
elseif(additional == 150){base *= 150}
else{base += additional;}

Este es un ejemplo básico de cómo se utiliza el lenguaje.


Gracias por todas sus respuestas, He investigado un programa de análisis y la creación de uno sería mucho más compleja de lo que se requiere habiendo ejecutar varias pruebas con 1000 de líneas de código y se encontró que carácter por carácter sólo tarda unos segundos para proceso incluso en una sola P4 núcleo con 512 MB de memoria (que es mucho menos que los usos de los clientes)

he decidido construir un comprobador de sintaxis basado en PHP que verificará la información y convertir las variables etc en código PHP válido mientras se está comprobando que (por lo que está listo para ser llamado más tarde sin recompilación) usando esto en lugar de javascript esta parece más apropiado y permitirá código más complejo a surgir sin obstaculizar el proceso de validación

Es sólo tardado una hora y tengo código que es capaz de comprobar la validez de una sentencia if y no está confundido por anidada si de, espacios o expresiones aisladas, hay muy poco para ser revisado mientras que un analizador y lleno lenguaje de script soplado habría tomado mucho más tiempo

todos me han dado mucho que pensar y He clasificado respuestas pertinentes gracias

¿Fue útil?

Solución

If you really want to do this — and by that I mean if you really want your software to work properly and predictably, without a bunch of weird "don't do this" special cases — you're going to have to write a real parser for your language. Once you have that, you can transform any program in your language into a data structure. With that data structure you'll be able to conduct all sorts of analyses of the code, including procedures that at least used to be called use-definition and definition-use chain analysis.

If you concoct a "programming language" that enables some scripting in an application, then no matter how trivial you think it is, somebody will eventually write a shockingly large program with it.

I don't know of any readily-available parser generators that generate JavaScript parsers. Recursive descent parsers are not too hard to write, but they can get ugly to maintain and they make it a little difficult to extend the syntax (esp. if you're not very experienced crafting the original version).

Otros consejos

You might want to look at JS/CC which is a parser generator that generates a parser for a grammer, in Javascript. You will need to figure out how to describe your language using a BNF and EBNF. Also, JS/CC has its own syntax (which is somewhat close to actual BNF/EBNF) for specifying the grammar. Given the grammer, JS/CC will generate a parser for that grammar.

Your other option, as Pointy said, is to write your own lexer and recursive-descent parser from scratch. Once you have a BNF/EBNF, it's not that hard. I recently wrote a parser from an EBNF in Javascript (the grammar was pretty simple so it wasn't that hard to write one YMMV).

To address your comments about it being "client specific". I will also add my own experience here. If you're providing a scripting language and a scripting environment, there is no better route than an actual parser.

Handling special cases through a bunch of if-elses is going to be horribly painful and a maintenance nightmare. When I was a freshman in college, I tried to write my own language. This was before I knew anything about recursive-descent parsers, or just parsers in general. I figured out by myself that code can be broken down into tokens. From there, I wrote an extremely unwieldy parser using a bunch of if-elses, and also splitting the tokens by spaces and other characters (exactly what you described). The end result was terrible.

Once I read about recursive-descent parsers, I wrote a grammar for my language and easily created a parser in a 10th of the time it took me to write my original parser. Seriously, if you want to save yourself a lot of pain, write an actual parser. If you go down your current route, you're going to be fixing issues forever. You're going to have to handle cases where people put the space in the wrong place, or perhaps they have one too many (or one too little) spaces. The only other alternative is to provide an extremely rigid structure (i.e, you must have exactly x number of spaces following this statement) which is liable to make your scripting environment extremely unattractive. An actual parser will automatically fix all these problems.

Javascript has a function 'eval'.

var code = 'alert(1);';
eval(code);

It will show alert. You can use 'eval' to execute basic code.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top