Регулярное выражение для идентификатора VHDL

Я пытаюсь проанализировать свой код VHDL для дополнительных проверок.

Я ищу регулярное выражение, которое проверяет корректные идентификаторы в VHDL. И я все еще довольно новичок в регулярных выражениях.

он имеет следующие правила:

  • может содержать только буквы алфавита (A..Z a..z), цифры (0..9) и подчеркивание ('_')

  • должно начинаться с и буквы алфавита

  • не может заканчиваться подчеркиванием

  • не может включать два последовательных символа подчеркивания

Итак, моя текущая проблема заключается в проверке двух последовательных символов подчеркивания...

Обновление: я думаю, я только что сам ответил на вопрос... пожалуйста, перепроверьте

[A-Za-z](_?[A-Za-z0-9])*

person sebs    schedule 31.10.2011    source источник
comment
Это охватывает основные идентификаторы. Но VHDL также поддерживает расширенные идентификаторы, заключенные в обратную косую черту, которые могут содержать любой графический символ ISO Latin-1 (включая обратную косую черту, если она удвоена).   -  person mark4o    schedule 01.11.2011
comment
@sebs, да, ты прав, я удалил свой ответ.   -  person Bart Kiers    schedule 01.11.2011


Ответы (2)


(?!.*__)[a-zA-Z][\w]*[^_]

Это должно сработать.

Пояснение:

 # (?!.*__)[a-zA-Z][\w]*[^_]
# 
# Assert that it is impossible to match the regex below starting at this position (negative lookahead) «(?!.*__)»
#    Match any single character that is not a line break character «.*»
#       Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
#    Match the characters “__” literally «__»
# Match a single character present in the list below «[a-zA-Z]»
#    A character in the range between “a” and “z” «a-z»
#    A character in the range between “A” and “Z” «A-Z»
# Match a single character that is a “word character” (letters, digits, etc.) «[\w]*»
#    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
# Match any character that is NOT a “_” «[^_]»
person FailedDev    schedule 31.10.2011

Основные идентификаторы

В своем обновлении вопроса вы предлагаете: {letter}({underscore}?{letter_or_digit})*. Это именно то, что предлагает спецификация VHDL для выражения. Также стоит отметить, что базовые идентификаторы нечувствительны к регистру. То есть id и ID рассматриваются как один и тот же идентификатор.

Расширенные идентификаторы

Однако в VHDL также есть расширенные идентификаторы. Подходящим регулярным выражением для них было бы:

({backslash}{Any ISO 8859-1 except backslash}*{backslash})+

Зарезервированные слова

Также обратите внимание, что следующие идентификаторы не обрабатываются традиционным образом, а являются зарезервированными словами: Это список из спецификации 2002 года. В зависимости от версии спецификации, которую вы реализуете, зарезервированных слов может быть больше или меньше.

abs access after alias all and architecture array assert attribute begin block
body buffer bus case component configuration constant disconnect downto else
elsif end entity exit file for function generate generic group guarded if
impure in inertial inout is label library linkage literal loop map mod nand
new next nor not null of on open or others out package port postponed
procedural procedure process protected pure range record reference register
reject rem report return rol ror select severity shared signal sla sll sra srl
subtype then to transport type unaffected units until use variable wait when
while with xnor xor

Буквы

Также стоит отметить, что в VHDL [A-Za-z] — это не все буквы алфавита. Вы также должны включить латинские символы ISO 8859-1. Дополнительную информацию об этих символах можно найти здесь.

Но, как говорится, вот лишние прописные буквы:

À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß 

А вот и лишние строчные буквы:

à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
person Bill Lynch    schedule 19.09.2013