mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 06:38:20 +00:00
76 lines
2.9 KiB
Python
76 lines
2.9 KiB
Python
from pygments.lexer import RegexLexer, bygroups, include
|
|
from pygments.token import *
|
|
|
|
__all__ = ["BroLexer"]
|
|
|
|
class BroLexer(RegexLexer):
|
|
name = 'Bro'
|
|
aliases = ['bro']
|
|
filenames = ['*.bro']
|
|
|
|
_hex = r'[0-9a-fA-F_]+'
|
|
_float = r'((\d*\.?\d+)|(\d+\.?\d*))([eE][-+]?\d+)?'
|
|
_h = r'[A-Za-z0-9][-A-Za-z0-9]*'
|
|
|
|
tokens = {
|
|
'root': [
|
|
# Whitespace
|
|
('^@.*?\n', Comment.Preproc),
|
|
(r'#.*?\n', Comment.Single),
|
|
(r'\n', Text),
|
|
(r'\s+', Text),
|
|
(r'\\\n', Text),
|
|
# Keywords
|
|
(r'(add|alarm|break|case|const|continue|delete|do|else|enum|event'
|
|
r'|export|for|function|if|global|local|module|next'
|
|
r'|of|print|redef|return|schedule|when|while)\b', Keyword),
|
|
(r'(addr|any|bool|count|counter|double|file|int|interval|net'
|
|
r'|pattern|port|record|set|string|subnet|table|time|timer'
|
|
r'|vector)\b', Keyword.Type),
|
|
(r'(T|F)\b', Keyword.Constant),
|
|
(r'(&)((?:add|delete|expire)_func|attr|(create|read|write)_expire'
|
|
r'|default|raw_output|encrypt|group|log'
|
|
r'|mergeable|optional|persistent|priority|redef'
|
|
r'|rotate_(?:interval|size)|synchronized)\b', bygroups(Punctuation,
|
|
Keyword)),
|
|
(r'\s+module\b', Keyword.Namespace),
|
|
# Addresses, ports and networks
|
|
(r'\d+/(tcp|udp|icmp|unknown)\b', Number),
|
|
(r'(\d+\.){3}\d+', Number),
|
|
(r'(' + _hex + r'){7}' + _hex, Number),
|
|
(r'0x' + _hex + r'(' + _hex + r'|:)*::(' + _hex + r'|:)*', Number),
|
|
(r'((\d+|:)(' + _hex + r'|:)*)?::(' + _hex + r'|:)*', Number),
|
|
(r'(\d+\.\d+\.|(\d+\.){2}\d+)', Number),
|
|
# Hostnames
|
|
(_h + r'(\.' + _h + r')+', String),
|
|
# Numeric
|
|
(_float + r'\s+(day|hr|min|sec|msec|usec)s?\b', Literal.Date),
|
|
(r'0[xX]' + _hex, Number.Hex),
|
|
(_float, Number.Float),
|
|
(r'\d+', Number.Integer),
|
|
(r'/', String.Regex, 'regex'),
|
|
(r'"', String, 'string'),
|
|
# Operators
|
|
(r'[!%*/+-:<=>?~|]', Operator),
|
|
(r'([-+=&|]{2}|[+-=!><]=)', Operator),
|
|
(r'(in|match)\b', Operator.Word),
|
|
(r'[{}()\[\]$.,;]', Punctuation),
|
|
# Identfier
|
|
(r'([_a-zA-Z]\w*)(::)', bygroups(Name, Name.Namespace)),
|
|
(r'[a-zA-Z_][a-zA-Z_0-9]*', Name)
|
|
],
|
|
'string': [
|
|
(r'"', String, '#pop'),
|
|
(r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
|
|
(r'[^\\"\n]+', String),
|
|
(r'\\\n', String),
|
|
(r'\\', String)
|
|
],
|
|
'regex': [
|
|
(r'/', String.Regex, '#pop'),
|
|
(r'\\[\\nt/]', String.Regex), # String.Escape is too intense.
|
|
(r'[^\\/\n]+', String.Regex),
|
|
(r'\\\n', String.Regex),
|
|
(r'\\', String.Regex)
|
|
]
|
|
}
|