blob: c4b475322ce2007145352e1818b8e064502bae73 [file] [log] [blame]
# -*- coding: utf-8 -*- #
module Rouge
module Lexers
class Julia < RegexLexer
title "Julia"
desc "The Julia programming language"
tag 'julia'
aliases 'jl'
filenames '*.jl'
mimetypes 'text/x-julia', 'application/x-julia'
def self.analyze_text(text)
1 if text.shebang? 'julia'
end
BUILTINS = /\b(?:
applicable | assert | convert
| dlopen | dlsym | edit
| eps | error | exit
| finalizer | hash | im
| Inf | invoke | is
| isa | isequal | load
| method_exists | Nan | new
| ntuple | pi | promote
| promote_type | realmax | realmin
| sizeof | subtype | system
| throw | tuple | typemax
| typemin | typeof | uid
| whos
)\b/x
KEYWORDS = /\b(?:
function | return | module | import | export
| if | else | elseif | end | for
| in | while | try | catch | super
| const
)\b/x
TYPES = /\b(?:
Int | UInt | Int8
| UInt8 | Int16 | UInt16
| Int32 | UInt32 | Int64
| UInt64 | Int128 | UInt128
| Float16 | Float32 | Float64
| Bool | Inf | Inf16
| Inf32 | NaN | NaN16
| NaN32 | BigInt | BigFloat
| Char | ASCIIString | UTF8String
| UTF16String | UTF32String | AbstractString
| WString | String | Regex
| RegexMatch | Complex64 | Complex128
| Any | Nothing | None
)\b/x
OPERATORS = / \+ | = | - | \* | \/
| \\ | & | \| | \$ | ~
| \^ | % | ! | >>> | >>
| << | && | \|\| | \+= | -=
| \*= | \/= | \\= | ÷= | %=
| \^= | &= | \|= | \$= | >>>=
| >>= | <<= | == | != |
| <= | | >= | | \.
| :: | <: | -> | \? | \.\*
| \.\^ | \.\\ | \.\/ | \\ | <
| >
/x
PUNCTUATION = / [ \[ \] { } : \( \) , ; @ ] /x
state :root do
rule /\n/, Text
rule /[^\S\n]+/, Text
rule /#=/, Comment::Multiline, :blockcomment
rule /#.*$/, Comment
rule OPERATORS, Operator
rule /\\\n/, Text
rule /\\/, Text
# functions
rule /(function)((?:\s|\\\s)+)/ do
groups Keyword, Name::Function
push :funcname
end
# types
rule /(type|typealias|abstract)((?:\s|\\\s)+)/ do
groups Keyword, Name::Class
push :typename
end
rule TYPES, Keyword::Type
# keywords
rule /(local|global|const)\b/, Keyword::Declaration
rule KEYWORDS, Keyword
rule BUILTINS, Name::Builtin
# backticks
rule /`.*?`/, Literal::String::Backtick
# chars
rule /'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,3}|\\u[a-fA-F0-9]{1,4}|\\U[a-fA-F0-9]{1,6}|[^\\\'\n])'/, Literal::String::Char
# try to match trailing transpose
rule /(?<=[.\w)\]])\'+/, Operator
# strings
rule /(?:[IL])"/, Literal::String, :string
rule /[E]?"/, Literal::String, :string
# names
rule /@[\w.]+/, Name::Decorator
rule /(?:[a-zA-Z_\u00A1-\uffff]|[\u1000-\u10ff])(?:[a-zA-Z_0-9\u00A1-\uffff]|[\u1000-\u10ff])*!*/, Name
rule PUNCTUATION, Other
# numbers
rule /(\d+(_\d+)+\.\d*|\d*\.\d+(_\d+)+)([eEf][+-]?[0-9]+)?/, Literal::Number::Float
rule /(\d+\.\d*|\d*\.\d+)([eEf][+-]?[0-9]+)?/, Literal::Number::Float
rule /\d+(_\d+)+[eEf][+-]?[0-9]+/, Literal::Number::Float
rule /\d+[eEf][+-]?[0-9]+/, Literal::Number::Float
rule /0b[01]+(_[01]+)+/, Literal::Number::Bin
rule /0b[01]+/, Literal::Number::Bin
rule /0o[0-7]+(_[0-7]+)+/, Literal::Number::Oct
rule /0o[0-7]+/, Literal::Number::Oct
rule /0x[a-fA-F0-9]+(_[a-fA-F0-9]+)+/, Literal::Number::Hex
rule /0x[a-fA-F0-9]+/, Literal::Number::Hex
rule /\d+(_\d+)+/, Literal::Number::Integer
rule /\d+/, Literal::Number::Integer
end
state :funcname do
rule /[a-zA-Z_]\w*/, Name::Function, :pop!
rule /\([^\s\w{]{1,2}\)/, Operator, :pop!
rule /[^\s\w{]{1,2}/, Operator, :pop!
end
state :typename do
rule /[a-zA-Z_]\w*/, Name::Class, :pop!
end
state :stringescape do
rule /\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})/,
Literal::String::Escape
end
state :blockcomment do
rule /[^=#]/, Comment::Multiline
rule /#=/, Comment::Multiline, :blockcomment
rule /\=#/, Comment::Multiline, :pop!
rule /[=#]/, Comment::Multiline
end
state :string do
mixin :stringescape
rule /"/, Literal::String, :pop!
rule /\\\\|\\"|\\\n/, Literal::String::Escape # included here for raw strings
rule /\$(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?/, Literal::String::Interpol
rule /[^\\"$]+/, Literal::String
# quotes, dollar signs, and backslashes must be parsed one at a time
rule /["\\]/, Literal::String
# unhandled string formatting sign
rule /\$/, Literal::String
end
end
end
end