<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "language.dtd">
<!--
		
		G-code syntax highlighting for KatePart
		
		Copy this file to :  ~/.tde/share/apps/katepart/syntax/
		
		Copyright © 2016 by Fernand Veilleux (fernveilleux@gmail.com)
		All rights reserved.
		
		This library is free software; you can redistribute it and/or
		modify it under the terms of the GNU Library General Public
		License as published by the Free Software Foundation; either
		version 2 of the License, or (at your option) any later version.
		
		This library 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
		Library General Public License for more details.
		
		You should have received a copy of the GNU Library General Public
		License along with this library; if not, write to the
		Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
		Boston, MA  02110-1301, USA.
		
		-->
<language name="G-Code"
					version="1.00-1"
					kateversion="3.8"
					section="Other"
					extensions="*.ngc"
					mimetype="text/ngc"
					author="Fernand Veilleux (fernveilleux@gmail.com)"
					license="LGPL">
	
	<highlighting>
		<list name="operators">
			<item>and</item>
			<item>or</item>
			<item>xor</item>
			<item>eq</item>
			<item>ne</item>
			<item>gt</item>
			<item>ge</item>
			<item>lt</item>
			<item>le</item>
			<item>mod</item>
		</list>
		
		<list name="functions">
			<item>atan</item>
			<item>abs</item>
			<item>acos</item>
			<item>asin</item>
			<item>cos</item>
			<item>exp</item>
			<item>exists</item>
			<item>fix</item>
			<item>fup</item>
			<item>ln</item>
			<item>round</item>
			<item>sin</item>
			<item>sqrt</item>
			<item>tan</item>
		</list>
		
		<list name="o_sub">
			<item>sub</item>
			<item>endsub</item>
			<item>call</item>
			<item>return</item>
		</list>
		
		<list name="keyword">
			<item>do</item>
			<item>while</item>
			<item>endwhile</item>
			<item>repeat</item>
			<item>endrepeat</item>
			<item>break</item>
			<item>continue</item>
			<item>if</item>
			<item>elseif</item>
			<item>else</item>
			<item>endif</item>
		</list>
		
		<contexts>
			<context name="Alert" attribute="Alert" lineEndContext="#pop">
				<RegExpr String="^[\s\t]*[nN][\s\t]*[\d]{1,5}" attribute="Line Number"/>
				<DetectSpaces attribute="Normal Text"/>
				<DetectChar char="%" attribute="M-word"/>
				<DetectChar char="[" attribute="Brackets"/>
				<DetectChar char="]" attribute="Brackets"/>
				<DetectChar char="(" lookAhead="1" context="parenthese"/>
				<DetectChar char="#" lookAhead="1" context="hash1"/>
				<RegExpr String="[.][\d\s\t]*[.]" lookAhead="1" context="alert"/>
				<RegExpr String="[.][\d\s\t]*" attribute="Number"/>
				<RegExpr String="[\d][\d\s\t]*[.][\d\s\t]*[.]" lookAhead="1" context="alert"/>
				<RegExpr String="[\d][\d\s\t]*[.]?[\d\s\t]*" attribute="Number"/>
				<RegExpr String="[+\-*/=]" attribute="Operator"/>
				<RegExpr String=";.*$" attribute="Comment"/>
				<keyword String="functions" attribute="Function"/>
				<keyword String="operators" attribute="Operator"/>
				<keyword String="o_sub" attribute="Sub-program"/>
				<keyword String="keyword" attribute="Keyword"/>
				<RegExpr String="[oO][\s\t]*&lt;[\s\t]*&gt;" lookAhead="1" context="alert"/>
				<RegExpr String="[oO][\s\t]*([\d]+|&lt;[^>]*&gt;)" attribute="O-word"/>
				<RegExpr String="[abcu-z][\s\t]*[+\-\d#\[.]" insensitive="1" lookAhead="1" context="coords"/>
				<RegExpr String="[abcu-z].*$" insensitive="1" attribute="Alert"/>
				<RegExpr String="[deh-lpqr@^][\s\t]*[+\-\d#\[.]" insensitive="1" lookAhead="1" context="opts"/>
				<RegExpr String="[deh-lpqr@^].*$" insensitive="1" attribute="Alert"/>
				<RegExpr String="[gG][\s\t]*[\d]+[\s\t]*[.]?[\s\t]*[\d]*" attribute="G-word"/>
				<RegExpr String="[gG][\s\t]*[\[#]" lookAhead="1" context="gword"/>
				<RegExpr String="[tsTS][\s\t]*[+\d#\[]" lookAhead="1" context="tools"/>
				<RegExpr String="[fF][\s\t]*[+\d#\[.]" lookAhead="1" context="feed"/>
				<RegExpr String="[mM][\s\t]*[1][\s\t]*[\d][\s\t]*[\d]" attribute="M-word (user)"/>
				<RegExpr String="[mM][\s\t]*([\d][\s\t]*[\d]?|[+#\[])" lookAhead="1" context="mword"/>
				<RegExpr String=".*$" attribute="Alert"/>
			</context>
			
			<context name="feed" attribute="Alert" lineEndContext="#pop">
				<RegExpr String="[fF]" attribute="Tool" context="#pop"/>
			</context>
			
			<context name="tools" attribute="Alert" lineEndContext="#pop">
				<RegExpr String="[tsTS]" attribute="Tool" context="#pop"/>
			</context>
			
			<context name="gword" attribute="Alert" lineEndContext="#pop">
				<RegExpr String="[gG]" attribute="G-word" context="#pop"/>
			</context>
			
			<context name="mword" attribute="Alert" lineEndContext="#pop">
				<RegExpr String="[mM]" attribute="M-word" context="#pop"/>
			</context>
			
			<context name="coords" attribute="Alert" lineEndContext="#pop">
				<RegExpr String="[abcu-z]" insensitive="1" attribute="Coordinate" context="#pop"/>
			</context>
			
			<context name="opts" attribute="Alert" lineEndContext="#pop">
				<RegExpr String="[deh-lpqr@^]" insensitive="1" attribute="G-options" context="#pop"/>
			</context>
			
			<context name="parenthese" attribute="Alert" lineEndContext="#pop">
				<RegExpr String="\([\s\t]*(PRINT|DEBUG|MSG|AXIS|(PROBE(CLOSE|OPEN))|(LOG(OPEN|CLOSE|APPEND|[\s]|[\,])))[^\)]*\)"
								 insensitive="1" attribute="Message" context="#pop"/>
				<RegExpr String="\([^\)]*\)" attribute="Comment" context="#pop"/>
			</context>
			
			<context name="hash1" attribute="Alert" lineEndContext="#pop">
				<RegExpr String="#[\s\t]*&lt;[\s\t]*&gt;" context="alert"/>
				<RegExpr String="#[0\s\t]*(5000)" attribute="Param (global)" context="#pop"/>
				<RegExpr String="#[0\s\t]*[1-4][0-9]{3}" attribute="Param (global)" context="#pop"/>
				<RegExpr String="#[0\s\t]*[1-9][\d]{2}" attribute="Param (global)" context="#pop"/>
				<RegExpr String="#[0\s\t]*[4-9][\d]{1}" attribute="Param (global)" context="#pop"/>
				<RegExpr String="#[0\s\t]*[3][1-9]" attribute="Param (global)" context="#pop"/>
				<RegExpr String="#[0\s\t]*(30)" attribute="Param (local)" context="#pop"/>
				<RegExpr String="#[0\s\t]*[12][0-9]{1}" attribute="Param (local)" context="#pop"/>
				<RegExpr String="#[0\s\t]*[1-9]{1}" attribute="Param (local)" context="#pop"/>
				<RegExpr String="#[\s\t]*&lt;[\s\t]*_[^>]*&gt;" attribute="Param (global)" context="#pop"/>
				<RegExpr String="#[\s\t]*&lt;[^>]*&gt;" attribute="Param (local)" context="#pop"/>
				<RegExpr String="[#][\s\t]*[#][\s\t]*[#]+" lookAhead="1" context="alert"/>
				<RegExpr String="#[\s\t]*#[\s\t]*[&lt;\[]" lookAhead="1" context="hash2"/>
				<RegExpr String="#[\s\t]*#" attribute="Param (local)" context="#pop"/>
				<RegExpr String="#[\s\t]*\[" lookAhead="1" context="hash2"/>
			</context>
			
			<context name="hash2" attribute= "Alert" lineEndContext="#pop">        
				<RegExpr String="#" attribute="Param (local)" context="#pop#pop"/>
			</context>
			
			<context name="alert" attribute="Alert" lineEndContext="#pop">
			</context>      
		</contexts>
		
		<itemDatas>
			<itemData name="Normal Text" defStyleNum="dsNormal"/>
			<itemData name="Brackets" defStyleNum="dsNormal"/>
			<itemData name="Comment" defStyleNum="dsComment"/>
			<itemData name="Coordinate" defStyleNum="dsNormal" color="#A57800" bold="1" italic="0"/>
			<itemData name="Function" defStyleNum="dsFunction" color="#800080" bold="1" italic="1"/>
			<itemData name="G-options" defStyleNum="dsNormal" color="#800080"  bold="1" italic="0"/>
			<itemData name="G-word" defStyleNum="dsNormal" selColor="#FFFFFF"  bold="1" italic="0"/>
			<itemData name="Keyword" defStyleNum="dsNormal" bold="1" italic="1"/>
			<itemData name="Line Number" defStyleNum="dsComment"/>
			<itemData name="Message" defStyleNum="dsNormal" italic="1" />
			<itemData name="M-word" defStyleNum="dsNormal" color="#A07400" bold="0" italic="0" />
			<itemData name="M-word (user)" defStyleNum="dsNormal" color="#A07400" bold="1" italic="1"/>
			<itemData name="Number" defStyleNum="dsDecVal" color="#A64C00" bold="1" italic="0"/>
			<itemData name="Operator" defStyleNum="dsOperator" color="#000080" bold="1" italic="0"/>
			<itemData name="O-word" defStyleNum="dsControlFlow" color="#BB7B40" bold="0" italic="0"/>
			<itemData name="Param (global)" defStyleNum="dsVariable" color="#149E05" bold="0" italic="0"/>
			<itemData name="Param (local)" defStyleNum="dsVariable" color="#0950AB" bold="0" italic="0"/>
			<itemData name="Sub-program" defStyleNum="dsKeyword" color="#700070" bold="0" italic="0"/>
			<itemData name="Tool" defStyleNum="dsNormal" color="#0000D6" bold="1" italic="0"/>
			<itemData name="Alert" defStyleNum="dsError"/>
		</itemDatas>
	</highlighting>
	
	<general>
		<folding indentationsensitive="1"/>
		<comments>
			<comment name="singleLine" start=";"/>
		</comments>
		<keywords casesensitive="0"/>
	</general>
</language>
 
