<?xml version="1.0" encoding="UTF-8"?>
<!--

 This file is part of GtkSourceView

 Authors: Waldir Pimenta
 Copyright (C) 2013 Waldir Pimenta <waldir@email.com>

 GtkSourceView is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.

 GtkSourceView is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public License
 along with this library; if not, see <http://www.gnu.org/licenses/>.

-->
<language id="julia" name="Julia" version="2.0" _section="Scientific" >

  <metadata>
    <property name="globs" >*.jl</property>
    <property name="line-comment-start" >#</property>
    <property name="block-comment-start">#=</property>
    <property name="block-comment-end">=#</property>
  </metadata>

  <!--
  A list of styles can be defined here, and optionally mapped to the default styles.
  The full list of available styles can be found in the `def.lang` file.
  -->
  <styles>
    <style id="comment"          name="Comment"           map-to="def:comment" />
    <style id="string"           name="String"            map-to="def:string" />
    <style id="character"        name="Character"         map-to="def:character" />
    <style id="number"           name="Number"            map-to="def:number" />
    <style id="boolean"          name="Boolean"           map-to="def:boolean" />
    <style id="math-constant"    name="Math Constant"     map-to="def:constant" />
    <style id="special-constant" name="Special Constant"  map-to="def:special-constant" />
    <style id="operator"         name="Operator"          map-to="def:operator" />
    <style id="keyword"          name="Keyword"           map-to="def:keyword" />
    <style id="macro"            name="Macro"             map-to="def:preprocessor" />
    <style id="external-command" name="External Command"  map-to="def:constant" />
    <style id="builtin-function" name="Built-in Function" map-to="def:builtin" />
    <style id="module"           name="Module"            map-to="def:builtin" />
    <style id="type"             name="Type"              map-to="def:type" />
  </styles>

  <definitions>

    <context id="string" style-ref="string" class="string" class-disabled="no-spell-check">
      <start>"</start>
      <end>"</end>
      <include>
        <context ref="def:escape" />
      </include>
    </context>

    <!--
    This context needs to be defined before the "operator" context,
    so it takes precedence over the transpose operator, '
    -->
    <context id="character" style-ref="character">
      <match extended="true">
        '(
        ([^\\']|\\.)                 |
        \\[0-7]{1,3}                 |
        \\x[0-9a-fA-F]{1,2}          |
        \\u[0-9a-fA-F]{1,3}          |
        \\u[0-9a-cA-C][0-9a-fA-F]{3} |
        \\u[dD][0-7][0-9a-fA-F]{2}   |
        \\U[0-9a-fA-F]{1,5}          |
        \\U10[0-9a-fA-F]{4}
        )'
      </match>
    </context>

    <context id="number" style-ref="number">
      <match extended="true">
        (?&lt;!\w) 0b[01]+                            | # binary
        (?&lt;!\w) 0o[0-7]+                           | # octal
        (?&lt;!\w) 0x[0-9a-fA-F]+                     | # hexadecimal
        (?&lt;!\w) (\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?   # decimal
      </match>
    </context>

    <context id="boolean" style-ref="boolean">
      <keyword>true|false</keyword>
    </context>

    <context id="math-constant" style-ref="math-constant">
      <match extended="true">
        (?&lt;=\d|\b) pi       \b |
        (?&lt;=\d|\b) e        \b |
        (?&lt;=\d|\b) im       \b |
        (?&lt;=\d|\b) Inf(32)? \b |
        (?&lt;=\d|\b) NaN(32)? \b
      </match>
    </context>

    <context id="special-constant" style-ref="special-constant">
      <keyword>nothing</keyword>
      <keyword>missing</keyword>
      <!-- http://docs.julialang.org/en/latest/stdlib/constants/ -->
      <keyword>ARGS</keyword>
      <keyword>LOAD_PATH</keyword>
      <keyword>CPU_CORES</keyword>
      <keyword>OS_NAME</keyword>
      <keyword>C_NULL</keyword>
      <keyword>WORD_SIZE</keyword>
      <keyword>VERSION</keyword>
      <!-- exports.jl -->
      <keyword>ENDIAN_BOM</keyword>
      <keyword>ENV</keyword>
      <keyword>stderr</keyword>
      <keyword>stdin</keyword>
      <keyword>stdout</keyword>
      <!-- type-related -->
      <keyword>T</keyword>
      <keyword>ANY</keyword>
    </context>

    <!-- http://docs.julialang.org/en/latest/manual/mathematical-operations.html -->
    <context id="operator">
      <include>
        <context ref="octave:operator" />
        <context id="julia-operators" style-ref="operator">
          <match extended="true">
            [$%]=?           |
            \.[&lt;&gt;%']   |
            \.[&lt;&gt;=!]=
          </match>
        </context>
      </include>
    </context>

    <!-- http://docs.julialang.org/en/latest/stdlib/punctuation.html -->
    <context id="punctuation" style-ref="operator">
      <match extended="true">
        \(|\)        |
        \[|\]        |
        \{|\}        |
        \.|,|;|\?    |
        \.\.\.
      </match>
    </context>

    <!-- See *lang_keywords[] in ui/repl-readline.c for a list -->
    <context id="keyword" style-ref="keyword">
      <!-- code blocks -->
      <keyword>begin</keyword>
      <keyword>do</keyword>
      <keyword>for</keyword>
      <keyword>in</keyword>
      <keyword>function</keyword>
      <keyword>if</keyword>
      <keyword>struct</keyword>
      <keyword>mutable struct</keyword>
      <keyword>let</keyword>
      <keyword>quote</keyword>
      <keyword>try</keyword>
      <keyword>type</keyword>
      <keyword>while</keyword>
      <keyword>catch</keyword>
      <keyword>finally</keyword>
      <keyword>else</keyword>
      <keyword>elseif</keyword>
      <keyword>end</keyword>
      <!-- keywords -->
      <keyword>abstract type</keyword>
      <keyword>primitive type</keyword>
      <keyword>bitstype</keyword>
      <keyword>break</keyword>
      <keyword>ccall</keyword>
      <keyword>const</keyword>
      <keyword>continue</keyword>
      <keyword>export</keyword>
      <keyword>global</keyword>
      <keyword>import</keyword>
      <keyword>importall</keyword>
      <keyword>local</keyword>
      <keyword>macro</keyword>
      <keyword>module</keyword>
      <keyword>baremodule</keyword>
      <keyword>return</keyword>
      <keyword>typealias</keyword>
      <keyword>using</keyword>
      <keyword>where</keyword>
      <keyword>new</keyword>
    </context>

    <!-- See http://docs.julialang.org/en/latest/manual/running-external-programs/ -->
    <context id="external-command" style-ref="external-command" >
      <start>`</start>
      <end>`</end>
    </context>

    <!-- jl_init_primitives() in src/builtins.c -->
    <!-- TODO: once the standard library is stabilized,
         add more from exports.jl -->
    <context id="builtin-function" style-ref="builtin-function">
      <keyword>is</keyword>
      <keyword>typeof</keyword>
      <keyword>subtype</keyword>
      <keyword>isa</keyword>
      <keyword>typeassert</keyword>
      <keyword>apply</keyword>
      <keyword>kwcall</keyword>
      <keyword>throw</keyword>
      <keyword>tuple</keyword>
      <keyword>method_exists</keyword>
      <keyword>applicable</keyword>
      <keyword>invoke</keyword>
      <keyword>eval</keyword>
      <keyword>isdefined</keyword>
      <keyword>yieldto</keyword>
    </context>

    <context id="module" style-ref="module">
      <!-- http://docs.julialang.org/en/latest/manual/modules/#standard-modules -->
      <keyword>Base</keyword>
      <keyword>Core</keyword>
      <keyword>Main</keyword>
      <!-- exports.jl -->
      <keyword>PCRE</keyword>
      <keyword>FFTW</keyword>
      <keyword>Collections</keyword>
      <keyword>DSP</keyword>
      <keyword>LinAlg</keyword>
      <keyword>LibRandom</keyword>
      <keyword>Random</keyword>
      <keyword>Math</keyword>
      <keyword>MPFR</keyword>
      <keyword>GMP</keyword>
      <keyword>Sort</keyword>
      <keyword>Test</keyword>
      <keyword>Pkg</keyword>
      <keyword>Operators</keyword>
      <keyword>Errno</keyword>
      <keyword>Meta</keyword>
      <keyword>Graphics</keyword>
    </context>

    <!-- Sources: base/exports.jl and examples/typetree.jl -->
    <context id="type" style-ref="type">
      <keyword>Any|None|Nothing|Missing|Void|Union|Some</keyword>
      <keyword>Type(Constructor|Name|Var|_Array)?|(Union|Data|NonTuple)Type</keyword>
      <keyword>(Abstract|Strided|Bit)?(Array|Matrix|Vector)</keyword>
      <keyword>Abstract(Cmd|RNG|SparseMatrix)</keyword>
      <keyword>(Abstract|Strided)?VecOrMat</keyword>
      <keyword>SparseMatrixCSC</keyword>
      <keyword>(D|Sub((Or)?D)?)Array</keyword>
      <keyword>Chars?</keyword>
      <keyword>(ASCII|Byte|Char|DirectIndex|Generic|Rep|Rev|Rope|Sub|UTF8)?String</keyword>
      <keyword>Bool</keyword>
      <keyword>Number</keyword>
      <keyword>Real</keyword>
      <keyword>Rational</keyword>
      <keyword>ImaginaryUnit</keyword>
      <keyword>Signed|Unsigned</keyword>
      <keyword>Int(eger|Set|8|16|32|64|128)?</keyword>
      <keyword>Uint(8|16|32|64|128)?</keyword>
      <keyword>Float(ingPoint|32|64)</keyword>
      <keyword>Complex(Pair|64|128)?</keyword>
      <keyword>Big(Int|Float)</keyword>
      <keyword>C(float|double|ptrdiff_t|u?(int|long(long)?|char|short)|s?size_t|wchar_t)</keyword>
      <keyword>(Argument|Bounds|Divide|Domain|EOF|Inexact|Key|Load|Memory|Method|Parse|(Stack)?Overflow|System|Type|UV|UndefRef)Error</keyword>
      <keyword>(Error|Interrupt|Disconnect)?Exception</keyword>
      <keyword>Algorithm</keyword>
      <keyword>Associative</keyword>
      <keyword>AsyncStream</keyword>
      <keyword>Box</keyword>
      <keyword>BunchKaufman</keyword>
      <keyword>CPUinfo</keyword>
      <keyword>CallStack</keyword>
      <keyword>Callback</keyword>
      <keyword>Cholesky</keyword>
      <keyword>CholeskyPivoted</keyword>
      <keyword>Cmd(Redirect)?</keyword>
      <keyword>(And|Or)Cmds</keyword>
      <keyword>Colon</keyword>
      <keyword>LU|(((Sym|LDLT|LU)?Tr|B)id|D)iagonal</keyword>
      <keyword>Dict</keyword>
      <keyword>EachLine</keyword>
      <keyword>Eigen</keyword>
      <keyword>EmptyCallStack</keyword>
      <keyword>Enumerate</keyword>
      <keyword>EnvHash</keyword>
      <keyword>Executable</keyword>
      <keyword>Expr(Node)?</keyword>
      <keyword>Factorization</keyword>
      <keyword>FDWatcher</keyword>
      <keyword>(Abstract)?File</keyword>
      <keyword>File(Monitor|Offset)</keyword>
      <keyword>Filter</keyword>
      <keyword>(Intrinsic)?Function</keyword>
      <keyword>Hermitian</keyword>
      <keyword>Hessenberg</keyword>
      <keyword>IO(Buffer|Stream)?</keyword>
      <keyword>InetAddr</keyword>
      <keyword>IpAddr|IPv[46]</keyword>
      <keyword>(Key|Value)Iterator</keyword>
      <keyword>LambdaStaticData</keyword>
      <keyword>LocalProcess</keyword>
      <keyword>Long(Expr|Symbol|Tuple)</keyword>
      <keyword>MersenneTwister</keyword>
      <keyword>Method(Table)?</keyword>
      <keyword>MmapArrayInfo</keyword>
      <keyword>Module</keyword>
      <keyword>NTuple</keyword>
      <keyword>NamedPipe</keyword>
      <keyword>(Getfield|Goto|Label|LineNumber|Quote)Node</keyword>
      <keyword>NotFound</keyword>
      <keyword>OS_FD</keyword>
      <keyword>ObjectIdDict</keyword>
      <keyword>PollingFileWatcher</keyword>
      <keyword>Process(Chain(OrNot)?|Group)?</keyword>
      <keyword>Ptr</keyword>
      <keyword>QR(Pivoted)?</keyword>
      <keyword>Range(s|1|Index|VecIntList)?</keyword>
      <keyword>RawOrBoxedHandle</keyword>
      <keyword>Redirectable</keyword>
      <keyword>Regex(Match(Iterator)?)?</keyword>
      <keyword>RemoteRef</keyword>
      <keyword>Rest</keyword>
      <keyword>Reverse</keyword>
      <keyword>(Generalized)?(SVD|Schur)</keyword>
      <keyword>Set</keyword>
      <keyword>Socket</keyword>
      <keyword>(Merge|Insertion|Tim|Quick)Sort</keyword>
      <keyword>SpawnNullStream</keyword>
      <keyword>Stat</keyword>
      <keyword>StateUpdate</keyword>
      <keyword>StaticVarInfo</keyword>
      <keyword>Symbol(Node)?</keyword>
      <keyword>TTY</keyword>
      <keyword>Task</keyword>
      <keyword>TcpSocket</keyword>
      <keyword>TmStruct</keyword>
      <keyword>Top(Node)?</keyword>
      <keyword>Triangular</keyword>
      <keyword>UV(Handle|PollingWatcher|Stream)</keyword>
      <keyword>UdpSocket</keyword>
      <keyword>Undef(RefTag)?</keyword>
      <keyword>VarTable</keyword>
      <keyword>Vararg</keyword>
      <keyword>VersionNumber</keyword>
      <keyword>Wait(For|Task)</keyword>
      <keyword>Weak(KeyDict|Ref)</keyword>
      <keyword>Woodbury</keyword>
      <keyword>(Timeout|Idle|Single)?AsyncWork</keyword>
      <keyword>Work(er|Item)</keyword>
      <keyword>Zip</keyword>
    </context>

    <context id="comment-multiline-nested" style-ref="comment" class-disabled="no-spell-check" class="comment" >
      <start>#=</start>
      <end>=#</end>
      <include>
        <context ref="comment-multiline-nested"/>
      </include>
    </context>


    <context id="julia" class="no-spell-check">
      <include>
        <context ref="comment-multiline-nested"/>
        <context ref="def:shebang" />
        <context ref="def:shell-like-comment" />
        <context ref="string" />
        <context ref="character" />
        <context ref="number" />
        <context ref="boolean" />
        <context ref="math-constant" />
        <context ref="special-constant" />
        <context ref="operator" />
        <context ref="punctuation" />
        <context ref="keyword" />
        <context ref="external-command" />
        <context ref="builtin-function" />
        <context ref="module" />
        <context ref="type" />
        <context ref="octave:function-handle" style-ref="macro" />
      </include>
    </context>

  </definitions>

</language>
