Regex для идентификатора VHDL - PullRequest
4 голосов
/ 01 ноября 2011

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

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 19 сентября 2013

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

В своем обновлении вопроса вы предлагаете: {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.Вы можете найти больше информации об этих символах здесь .

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

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

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

à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
0 голосов
/ 01 ноября 2011
(?!.*__)[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 “_” «[^_]»
...