Pregunta

En mi trabajo diario, yo y otros miembros de mi equipo escribimos muchos modelos de hardware en Verilog-AMS, un lenguaje respaldado principalmente por proveedores comerciales y algunos proyectos de simuladores de código abierto.Una cosa que haría que el soporte mutuo del código fuera más útil sería un LINTER que verificaría nuestro código en busca de problemas comunes y ayudaría a aplicar un estilo de formato de código compartido.Por supuesto, quiero poder agregar mis propias reglas y, después de demostrarme su utilidad, promocionarlas al resto del equipo.No me importa hacer el trabajo que hay que hacer, pero por supuesto también quiero aprovechar el trabajo de otros proyectos existentes.

¿Tener la sintaxis del lenguaje permitida en formato yacc o bison me da una ventaja?¿O debería simplemente incorporar cada declaración del idioma en una cadena de Perl y usar la coincidencia de patrones para encontrar las cosas que no me gustan?

(La mayoría de los errores de sintaxis y compilación se detectan fácilmente con las herramientas comerciales.pero tenemos algunas de nuestras propias extensiones).

¿Fue útil?

Solución

lex/flex y yacc/bison proporcionan generadores de analizadores y lexers fáciles de usar y bien entendidos, y realmente recomendaría hacer algo así en lugar de hacerlo de forma procesal, por ejemplo.Perla.Las expresiones regulares son cosas poderosas para desgarrar cadenas con una estructura relativamente fija, pero no totalmente.Con cualquier lenguaje de programación real, el tamaño de su máquina de estados llega a ser simplemente inmanejable con cualquier cosa que no sea un Real Lexer/Parser (tm).Imagine tratar con todas las intercalaciones posibles de palabras clave, identificadores, operadores, paréntesis extraños, puntos y comas extraños y comentarios que están permitidos en algo como Verilog AMS, solo con expresiones regulares y código de procedimiento.

No se puede negar que hay una curva de aprendizaje sustancial ahí, pero escribir una gramática que puedas usar para flex y bison, y hacer algo útil en el árbol de sintaxis que surge de bison, será un uso mucho mejor de tu tiempo que escribir un tonelada de código de procesamiento de cadenas de casos especiales que se trata de forma más natural utilizando un árbol de sintaxis en primer lugar.Además, lo que aprendas escribiéndolo de esta manera realmente ampliará tus habilidades de una manera que escribir un montón de código Perl hacky no lo hará, así que si tienes los medios, lo recomiendo ampliamente ;-)

Además, si es perezoso, consulte los complementos de Eclipse que resaltan la sintaxis y refactorizan básica para Verilog y VHDL.Están en un estado increíblemente primitivo, la última vez que lo verifiqué, pero es posible que tengan parte del código que está buscando, o al menos un fragmento de código básico que pueda analizar para informar mejor su enfoque al desarrollar el suyo propio.

Otros consejos

He escrito un par de analizadores Verilog y sugeriría PCCTS/ANTLR si su lenguaje de programación favorito es C/C++/Java.Hay un Gramática PCCTS/ANTLR Verilog con el que puedes empezar.Mi generador de analizadores favorito es Cebú que se basa en Common Lisp.

Por supuesto, el gran trabajo es especificar todas las reglas de linting.Tiene sentido crear algún tipo de lenguaje para especificar también las reglas de linting.

No subestimes la cantidad de trabajo que implica un linter.El análisis es la parte fácil porque tienes herramientas (bison, flex, ANTLR/PCCTS) para automatizar gran parte.

Pero una vez que tienes un análisis, ¿luego qué?Debes construir un árbol semántico para el diseño.Dependiendo de qué tan complicadas sean sus entradas, deberá elaborar el diseño de Verilog-AMS (es decir,resolver parámetros, desenrollar genera, etc.Si utiliza esas funciones).Y sólo entonces podrás intentar implementar reglas.

Consideraría seriamente otras posibles soluciones antes de escribir un linter, a menos que la cantidad de usuarios y el posible ahorro de tiempo justifiquen el tiempo de desarrollo.

Al tratar de encontrar mi respuesta, encontré esto en antlr - podría ser de utilidad

Si usa Java (y por lo tanto IDEA), el IDE extensiones para idiomas personalizados podría ser de utilidad

yacc/bison Definitivamente te da una ventaja, ya que un buen linting requeriría analizar el programa.Las expresiones regulares (al menos las verdaderas expresiones regulares) pueden cubrir casos triviales, pero es fácil escribir código que las expresiones regulares no coincidan pero que aún tengan un mal estilo.

ANTLR parece ser un camino alternativo al más común (OK I He oído hablar de ellos antes) enfoque YACC/BISON, que resulta que también suele utilizar LEX/FLEX como interfaz.

Una lectura rápida de la página de manual de FLEX me hace pensar que podría ser el marco para ese tipo de idea de expresión regular.

De acuerdo..Dejaré que esto se cocine un poco más y luego veré qué tan rápido puedo construir un prototipo de analizador en uno u otro.

y un poquito más

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