diff --git a/docs/cton_lexer.py b/docs/cton_lexer.py index 0567b748c7..0df2e6208a 100644 --- a/docs/cton_lexer.py +++ b/docs/cton_lexer.py @@ -2,9 +2,12 @@ # # Pygments lexer for Cretonne. -from pygments.lexer import RegexLexer, bygroups +from pygments.lexer import RegexLexer, bygroups, words from pygments.token import * +def keywords(*args): + return words(args, prefix=r'\b', suffix=r'\b') + class CretonneLexer(RegexLexer): name = 'Cretonne' aliases = ['cton'] @@ -13,19 +16,30 @@ class CretonneLexer(RegexLexer): tokens = { 'root': [ (r';.*?$', Comment.Single), - (r'\b(function|entry)\b', Keyword), - (r'\b(align)\b', Name.Attribute), + # Strings are in double quotes, support \xx escapes only. + (r'"([^"\\]+|\\[0-9a-fA-F]{2})*"', String), + # A naked function name following 'function' is also a string. + (r'\b(function)([ \t]+)(\w+)\b', bygroups(Keyword, Whitespace, String.Symbol)), + # Numbers. + (r'[-+]?0[xX][0-9a-fA-F]+', Number.Hex), + (r'[-+]?0[xX][0-9a-fA-F]*\.[0-9a-fA-F]*([pP]\d+)?', Number.Hex), + (r'[-+]?\d+\.\d+([eE]\d+)?', Number.Float), + (r'[-+]?\d+', Number.Integer), + # Reserved words. + (keywords('function', 'entry'), Keyword), + # Known attributes. + (keywords('align'), Name.Attribute), # Well known value types. (r'\b(bool|i\d+|f32|f64)(x\d+)?\b', Keyword.Type), - (r'\d+', Number.Integer), - (r'0[xX][0-9a-fA-F]+', Number.Hex), # v = value # ss = stack slot (r'(v|ss)\d+', Name.Variable), # ebb = extended basic block (r'(ebb)\d+', Name.Label), + # Match instruction names in context. (r'(=)( *)([a-z]\w*)', bygroups(Operator, Whitespace, Name.Function)), (r'^( +)([a-z]\w*\b)(?! *[,=])', bygroups(Whitespace, Name.Function)), + # Other names: results and arguments (r'[a-z]\w*', Name), (r'->|=|:', Operator), (r'[{}(),.]', Punctuation),