blob: f4986f6d8040fb182b9fd90c60222cd9dd8b7853 [file] [log] [blame]
# -*- coding: utf-8 -*- #
module Rouge
module Lexers
class Go < RegexLexer
title "Go"
desc 'The Go programming language (http://golang.org)'
tag 'go'
aliases 'go', 'golang'
filenames '*.go'
mimetypes 'text/x-go', 'application/x-go'
def self.analyze_text(text)
return 0
end
# Characters
WHITE_SPACE = /[\s\t\r\n]+/
NEWLINE = /\n/
UNICODE_CHAR = /[^\n]/
UNICODE_LETTER = /[[:alpha:]]/
UNICODE_DIGIT = /[[:digit:]]/
# Letters and digits
LETTER = /#{UNICODE_LETTER}|_/
DECIMAL_DIGIT = /[0-9]/
OCTAL_DIGIT = /[0-7]/
HEX_DIGIT = /[0-9A-Fa-f]/
# Comments
LINE_COMMENT = /\/\/(?:(?!#{NEWLINE}).)*/
GENERAL_COMMENT = /\/\*(?:(?!\*\/).)*\*\//m
COMMENT = /#{LINE_COMMENT}|#{GENERAL_COMMENT}/
# Keywords
KEYWORD = /\b(?:
break | default | func
| interface | select | case
| defer | go | map
| struct | chan | else
| goto | package | switch
| const | fallthrough | if
| range | type | continue
| for | import | return
| var
)\b/x
# Identifiers
IDENTIFIER = / (?!#{KEYWORD})
#{LETTER}(?:#{LETTER}|#{UNICODE_DIGIT})* /x
# Operators and delimiters
OPERATOR = / \+= | \+\+ | \+ | &\^= | &\^
| &= | && | & | == | =
| \!= | \! | -= | -- | -
| \|= | \|\| | \| | <= | <-
| <<= | << | < | \*= | \*
| \^= | \^ | >>= | >> | >=
| > | \/ | \/= | := | %
| %= | \.\.\. | \. | :
/x
SEPARATOR = / \( | \) | \[ | \] | \{
| \} | , | ;
/x
# Integer literals
DECIMAL_LIT = /[0-9]#{DECIMAL_DIGIT}*/
OCTAL_LIT = /0#{OCTAL_DIGIT}*/
HEX_LIT = /0[xX]#{HEX_DIGIT}+/
INT_LIT = /#{HEX_LIT}|#{DECIMAL_LIT}|#{OCTAL_LIT}/
# Floating-point literals
DECIMALS = /#{DECIMAL_DIGIT}+/
EXPONENT = /[eE][+\-]?#{DECIMALS}/
FLOAT_LIT = / #{DECIMALS} \. #{DECIMALS}? #{EXPONENT}?
| #{DECIMALS} #{EXPONENT}
| \. #{DECIMALS} #{EXPONENT}?
/x
# Imaginary literals
IMAGINARY_LIT = /(?:#{DECIMALS}|#{FLOAT_LIT})i/
# Rune literals
ESCAPED_CHAR = /\\[abfnrtv\\'"]/
LITTLE_U_VALUE = /\\u#{HEX_DIGIT}{4}/
BIG_U_VALUE = /\\U#{HEX_DIGIT}{8}/
UNICODE_VALUE = / #{UNICODE_CHAR} | #{LITTLE_U_VALUE}
| #{BIG_U_VALUE} | #{ESCAPED_CHAR}
/x
OCTAL_BYTE_VALUE = /\\#{OCTAL_DIGIT}{3}/
HEX_BYTE_VALUE = /\\x#{HEX_DIGIT}{2}/
BYTE_VALUE = /#{OCTAL_BYTE_VALUE}|#{HEX_BYTE_VALUE}/
CHAR_LIT = /'(?:#{UNICODE_VALUE}|#{BYTE_VALUE})'/
ESCAPE_SEQUENCE = / #{ESCAPED_CHAR}
| #{LITTLE_U_VALUE}
| #{BIG_U_VALUE}
| #{HEX_BYTE_VALUE}
/x
# String literals
RAW_STRING_LIT = /`(?:#{UNICODE_CHAR}|#{NEWLINE})*`/
INTERPRETED_STRING_LIT = / "(?: (?!")
(?: #{UNICODE_VALUE} | #{BYTE_VALUE} )
)*" /x
STRING_LIT = /#{RAW_STRING_LIT}|#{INTERPRETED_STRING_LIT}/
# Predeclared identifiers
PREDECLARED_TYPES = /\b(?:
bool | byte | complex64
| complex128 | error | float32
| float64 | int8 | int16
| int32 | int64 | int
| rune | string | uint8
| uint16 | uint32 | uint64
| uintptr | uint
)\b/x
PREDECLARED_CONSTANTS = /\b(?:true|false|iota|nil)\b/
PREDECLARED_FUNCTIONS = /\b(?:
append | cap | close | complex
| copy | delete | imag | len
| make | new | panic | print
| println | real | recover
)\b/x
state :simple_tokens do
rule(COMMENT, Comment)
rule(KEYWORD, Keyword)
rule(PREDECLARED_TYPES, Keyword::Type)
rule(PREDECLARED_FUNCTIONS, Name::Builtin)
rule(PREDECLARED_CONSTANTS, Name::Constant)
rule(IMAGINARY_LIT, Num)
rule(FLOAT_LIT, Num)
rule(INT_LIT, Num)
rule(CHAR_LIT, Str::Char)
rule(OPERATOR, Operator)
rule(SEPARATOR, Punctuation)
rule(IDENTIFIER, Name)
rule(WHITE_SPACE, Other)
end
state :root do
mixin :simple_tokens
rule(/`/, Str, :raw_string)
rule(/"/, Str, :interpreted_string)
end
state :interpreted_string do
rule(ESCAPE_SEQUENCE, Str::Escape)
rule(/\\./, Error)
rule(/"/, Str, :pop!)
rule(/[^"\\]+/, Str)
end
state :raw_string do
rule(/`/, Str, :pop!)
rule(/[^`]+/m, Str)
end
end
end
end