Вопрос

В своей повседневной работе я и другие члены моей команды пишу множество моделей оборудования на Verilog-AMS, языке, поддерживаемом в основном коммерческими поставщиками и несколькими проектами симуляторов с открытым исходным кодом.Одна вещь, которая могла бы сделать поддержку кода друг друга более полезной, — это ЛИНТЕР, который проверял бы наш код на наличие распространенных проблем и помогал обеспечить соблюдение общего стиля форматирования кода.Я, конечно, хочу иметь возможность добавлять свои собственные правила и, после того как я докажу их полезность самому себе, продвигать их остальной команде.Я не против выполнить ту работу, которую нужно сделать, но, конечно, я также хочу использовать работу других существующих проектов.

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Пытаясь найти ответ, я нашел это на АНТЛР - может быть полезен

Если вы вообще используете Java (и, следовательно, IDEA), IDE расширения для пользовательских языков может быть полезен

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top