2008-09-16 8 views
17

En mi trabajo diario, yo y otros en mi equipo escribimos muchos modelos de hardware en Verilog-AMS, un lenguaje soportado principalmente por vendedores comerciales y algunos proyectos de simuladores de código abierto. Una cosa que haría que apoyar el código de cada uno sea más útil sería un LINTER que verificaría nuestro código en busca de problemas comunes y ayudaría a imponer un estilo de formato de código compartido. Por supuesto, quiero ser capaz de agregar mis propias reglas y, después de probar su utilidad para mí, promoverlas al resto del equipo. No me importa hacer el trabajo que tiene que hacerse, pero de Por supuesto, también quiero aprovechar el trabajo de otros proyectos existentes.¿Cómo escribir un linter?

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

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

Respuesta

14

lex/yacc flex y/bisontes proporcionar una fácil de usar, bien entendido lexer- y analizador-generadores, y realmente recomiendo hacer algo así en lugar de hacerlo procesalmente en, por ejemplo Perl. Las expresiones regulares son elementos poderosos para desgarrar cadenas con una estructura relativamente fija, pero no totalmente fija. Con cualquier lenguaje de programación real, el tamaño de su máquina de estado llega a ser simplemente inmanejable con algo menos que un Lexer/Analizador real (tm). Imagine tratar con todos los entrelazamientos posibles de palabras clave, identificadores, operadores, paréntesis superfluos, puntos y comas extraños, y comentarios que están permitidos en algo como Verilog AMS, con expresiones regulares y código de procedimiento solo.

No se puede negar que hay una curva de aprendizaje sustancial allí, pero escribir una gramática que pueda usar para flex y bison y hacer algo útil en el árbol de sintaxis que sale del bisonte será un mejor uso de su En vez de escribir una tonelada de código de procesamiento de cadenas de casos especiales, se trata más naturalmente de usar un árbol de sintaxis en primer lugar. Además, lo que aprenda escribiéndolo de esta manera ampliará realmente sus habilidades de manera que escribir un montón de código Perl hacky simplemente no lo hará, así que si tiene los medios, lo recomiendo ;-)

Además, si eres flojo, mira los plugins de Eclipse que resaltan la sintaxis y la refactorización básica para Verilog y VHDL.Están en un estado increíblemente primitivo, la última vez que lo verifiqué, pero pueden tener parte del código que estás buscando o, al menos, una pieza de código de referencia que debes analizar para mejorar tu enfoque y mejorar el tuyo.

0

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

+0

Parece interesante. – jbdavid

0

Si utiliza Java en absoluto (y por lo tanto IDEA), el IDE de extensions for custom languages podría ser de utilidad

+0

Mi "IDE" es Cadence Library Manager + Nedit, con el resaltado de sintaxis (incorporado) Verilog, agregando mis propios patrones para admitir Verilog-A y Verilog-AMS. No veo mucho valor en Java para el tipo de trabajo que estoy haciendo. – jbdavid

0

yacc/bison definitivamente le da una ventaja, ya que una buena formación de pelusas requeriría analizar el programa. Regex (verdadero regex, al menos) podría cubrir casos triviales, pero es fácil escribir código que las expresiones regulares no coinciden pero que siguen siendo de estilo incorrecto.

0

antlr parece ser una vía alternativa a la más común (OK I oído hablar de ellos antes) YACC aproximación/bisonte, el cual resulta que también utilizan comúnmente LEX/FLEX como interfaz.

una lectura rápida de la página del manual FLEX tipo de me hacen pensar Podría ser el marco para ese tipo de expresiones regulares de la idea ..

Ok .. Voy a dejar este guiso un poco más, y luego ver cómo rápidamente puedo construir un analizador sintáctico en uno u otro.

y un poco más

2

He escrito un par de analizadores verilog y sugiero PCCTS/ANTLR si tu lenguaje de programación favorito es C/C++/Java. Hay un PCCTS/ANTLR Verilog grammar con el que puede comenzar. Mi generador de analizador favorito es Zebu que se basa en Common Lisp.

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

2

No subestime la cantidad de trabajo que entra en un linter. El análisis es la parte fácil porque tiene herramientas (bison, flex, ANTLR/PCCTS) para automatizar gran parte de ella.

Pero una vez que tienes un análisis, ¿entonces qué? Debes construir un árbol semántico para el diseño. Dependiendo de cuán complicadas sean sus entradas, debe elaborar el diseño de Verilog-AMS (es decir, resolver parámetros, desenrollar genera, etc., si usa esas características). Y solo entonces puedes tratar de implementar reglas.

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

+0

Amen. Ver http://www.semanticdesigns.com/Products/DMS/DMSToolkit para maquinaria de análisis genérico que va más allá del análisis. DMS se usa para construir herramientas personalizadas. Aun así, construir un Linter para VerilogAMS aún sería una tarea bastante grande. –