Подтвердить что ты не робот

Как написать linter?

В свое время я работаю, а другие в моей команде пишут множество аппаратных моделей в Verilog-AMS, язык, поддерживаемый в первую очередь коммерческими поставщиками и несколькими проектами симулятора open source. Одной вещью, которая сделает поддержку друг друга более полезной, станет LINTER, который будет проверять наш код на общие проблемы и помогать в обеспечении стиля форматирования общего кода. Я, конечно, хочу иметь возможность добавлять свои собственные правила, и после того, как я докажу их полезность для себя, продвигайте их к остальной части команды. Я не против делать работу, которая должна быть выполнена, но, конечно, также хочет использовать работу других существующих проектов.

Имеет ли разрешенный язык синтаксис в формате yacc или bison, дайте мне ногу? или я должен просто сосать каждый оператор языка в строку perl и использовать сопоставление шаблонов, чтобы найти то, что мне не нравится?

(большинство ошибок синтаксиса и компиляции легко пойманы коммерческими инструментами.. но у нас есть некоторые из наших собственных возможностей.)

4b9b3361

Ответ 1

lex/flex и yacc/bison предоставляют простые в использовании, хорошо понятые генераторы лексера и парсера, и я действительно рекомендую сделать что-то подобное, а не делать это процедурно, например. Perl. Регулярные выражения - это мощный материал для разрыва строк с относительно, но не полностью фиксированной структурой. С любым реальным языком программирования размер вашего конечного автомата становится просто неуправляемым с чем-то вроде Real Lexer/Parser (tm). Представьте, что вы имеете дело со всеми возможными перехватами ключевых слов, идентификаторов, операторов, посторонних круглых скобок, посторонних точек с запятой и комментариев, которые разрешены в чем-то вроде Verilog AMS, с регулярными выражениями и процедурным кодом.

Там нет отрицания наличия там существенной кривой обучения, но написания грамматики, которую вы можете использовать для flex и bison, и что-то полезное в дереве синтаксиса, которое выходит из бизона, будет гораздо лучше использовать ваше время чем писать тонну кода строковой обработки особого кода, который более естественно имел дело с использованием синтаксического дерева в первую очередь. Кроме того, то, что вы узнаете, написав его таким образом, действительно расширит ваш набор навыков таким образом, что писать кучу взломанного кода Perl просто не будет, поэтому, если у вас есть средства, я настоятельно рекомендую его: -)

Кроме того, если вы ленивы, ознакомьтесь с плагинами Eclipse, которые выполняют подсветку синтаксиса и базовый рефакторинг для Verilog и VHDL. Они находятся в невероятно примитивном состоянии, последний раз я проверил, но у них может быть какой-то код, который вы ищете, или, по крайней мере, базовый фрагмент кода, чтобы лучше понять ваш подход в сворачивании.

Ответ 2

Я написал пару парсеров verilog, и я бы предложил PCCTS/ANTLR, если ваш любимый язык программирования - C/С++/Java. Существует PCCTS/ANTLR Verilog grammar, с которой вы можете начать. Мой любимый генератор синтаксического анализа Zebu, который основан на Common Lisp.

Конечно, большая задача - указать все правила перебора. Имеет смысл сделать какой-то язык, чтобы указать правила линта.

Ответ 3

Не стоит недооценивать объем работы, которая входит в linter. Анализ является легкой частью, потому что у вас есть инструменты (bison, flex, ANTLR/PCCTS), чтобы автоматизировать большую часть этого.

Но как только вы разобрались, то что? Вы должны построить семантическое дерево для дизайна. В зависимости от того, насколько сложны ваши входы, вы должны разработать дизайн Verilog-AMS (т.е. Разрешить параметры, развернуть генерацию и т.д. Если вы используете эти функции). И только тогда вы можете попытаться реализовать правила.

Я бы серьезно рассмотрел другие возможные решения перед написанием linter, если только количество пользователей и потенциальная экономия времени не оправдывают время разработки.

Ответ 4

При попытке найти ответ я нашел это на ANTLR - может быть полезно

Ответ 6

yacc/bison определенно дает вам преимущество, так как для хорошей листинга потребуется разбор программы. Regex (истинное регулярное выражение, по крайней мере) может охватывать тривиальные случаи, но легко написать код, который регулярные выражения не совпадают, но все еще плохой стиль.

Ответ 7

ANTLR выглядит альтернативным путем к более распространенному (что я слышал о них раньше). Метод YACC/BISON, который, как оказалось, также обычно использует LEX/FLEX в качестве интерфейса.

a Быстрый просмотр страницы man-страницы FLEX заставляет меня думать, что это может быть основой для этого типа регулярного выражения.

Хорошо. Я позволю этому тушить немного дольше, а затем посмотрю, как быстро я смогу создать синтаксический анализатор прототипов в том или ином виде.

и немного дольше