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

 TinyBASIC Language Definition for GtkSourceView

 Author:  Damian Gareth Walker
 Created: 10-Aug-2019

-->
<language id="tinybasic" _name="Tiny BASIC" version="2.0" _section="Source">
  <metadata>
    <property name="mimetypes">text/x-tinybasic</property>
    <property name="globs">*.bas</property>
    <property name="line-comment-start">!</property>
  </metadata>

  <styles>
    <style id="comment" _name="Comment" map-to="def:comment"/>
    <style id="floating-point" _name="Floating Point" map-to="def:floating-point"/>
    <style id="keyword" _name="Keyword" map-to="def:keyword"/>
    <style id="intrinsic" _name="Intrinsic function" map-to="def:builtin"/>
    <style id="decimal" _name="Decimal" map-to="def:decimal"/>
    <style id="type" _name="Data Type" map-to="def:type"/>
  </styles>

  <default-regex-options case-sensitive="false"/>

  <definitions>

    <!-- Note: contains an hack to avoid considering ^COMMON a comment -->
    <context id="line-comment" style-ref="comment" end-at-line-end="true"
      class="comment" class-disabled="no-spell-check">
      <start>^\s*rem([^A-za-z]|$)</start>
      <include>
        <context ref="def:escape"/>
        <context ref="def:in-line-comment"/>
      </include>
    </context>

    <context id="keywords" style-ref="keyword">
      <keyword>then</keyword>
    </context>

    <context id="commands" style-ref="keyword">
      <keyword>if</keyword>
      <keyword>goto</keyword>
      <keyword>gosub</keyword>
      <keyword>return</keyword>
      <keyword>let</keyword>
      <keyword>print</keyword>
      <keyword>input</keyword>
    </context>

    <context id="decimal" style-ref="decimal">
      <match extended="true">
        (?&lt;![\w\.])
        [+-]? ([1-9][0-9]*|0)
        ([_]([0-9]+|[a-z][\w_]*))?
        (?![\w\.])
      </match>
    </context>

    <context id="tinybasic" class="no-spell-check">
      <include>
        <context ref="decimal"/>
        <context ref="def:string"/>
        <context ref="line-comment"/>
        <context ref="keywords"/>
        <context ref="commands"/>
      </include>
    </context>

  </definitions>
</language>
