1<lexer>
  2  <config>
  3    <name>SPARQL</name>
  4    <alias>sparql</alias>
  5    <filename>*.rq</filename>
  6    <filename>*.sparql</filename>
  7    <mime_type>application/sparql-query</mime_type>
  8  </config>
  9  <rules>
 10    <state name="string-escape">
 11      <rule pattern="u[0-9A-Fa-f]{4}">
 12        <token type="LiteralStringEscape"/>
 13        <pop depth="1"/>
 14      </rule>
 15      <rule pattern="U[0-9A-Fa-f]{8}">
 16        <token type="LiteralStringEscape"/>
 17        <pop depth="1"/>
 18      </rule>
 19      <rule pattern=".">
 20        <token type="LiteralStringEscape"/>
 21        <pop depth="1"/>
 22      </rule>
 23    </state>
 24    <state name="end-of-string">
 25      <rule pattern="(@)([a-zA-Z]+(?:-[a-zA-Z0-9]+)*)">
 26        <bygroups>
 27          <token type="Operator"/>
 28          <token type="NameFunction"/>
 29        </bygroups>
 30        <pop depth="2"/>
 31      </rule>
 32      <rule pattern="\^\^">
 33        <token type="Operator"/>
 34        <pop depth="2"/>
 35      </rule>
 36      <rule>
 37        <pop depth="2"/>
 38      </rule>
 39    </state>
 40    <state name="root">
 41      <rule pattern="\s+">
 42        <token type="Text"/>
 43      </rule>
 44      <rule pattern="((?i)select|construct|describe|ask|where|filter|group\s+by|minus|distinct|reduced|from\s+named|from|order\s+by|desc|asc|limit|offset|bindings|load|clear|drop|create|add|move|copy|insert\s+data|delete\s+data|delete\s+where|delete|insert|using\s+named|using|graph|default|named|all|optional|service|silent|bind|union|not\s+in|in|as|having|to|prefix|base)\b">
 45        <token type="Keyword"/>
 46      </rule>
 47      <rule pattern="(a)\b">
 48        <token type="Keyword"/>
 49      </rule>
 50      <rule pattern="(<(?:[^<>"{}|^`\\\x00-\x20])*>)">
 51        <token type="NameLabel"/>
 52      </rule>
 53      <rule pattern="(_:[_\p{L}\p{N}](?:[-_.\p{L}\p{N}]*[-_\p{L}\p{N}])?)">
 54        <token type="NameLabel"/>
 55      </rule>
 56      <rule pattern="[?$][_\p{L}\p{N}]+">
 57        <token type="NameVariable"/>
 58      </rule>
 59      <rule pattern="([\p{L}][-_.\p{L}\p{N}]*)?(\:)((?:[_:\p{L}\p{N}]|(?:%[0-9A-Fa-f][0-9A-Fa-f])|(?:\\[ _~.\-!$&"()*+,;=/?#@%]))(?:(?:[-_:.\p{L}\p{N}]|(?:%[0-9A-Fa-f][0-9A-Fa-f])|(?:\\[ _~.\-!$&"()*+,;=/?#@%]))*(?:[-_:\p{L}\p{N}]|(?:%[0-9A-Fa-f][0-9A-Fa-f])|(?:\\[ _~.\-!$&"()*+,;=/?#@%])))?)?">
 60        <bygroups>
 61          <token type="NameNamespace"/>
 62          <token type="Punctuation"/>
 63          <token type="NameTag"/>
 64        </bygroups>
 65      </rule>
 66      <rule pattern="((?i)str|lang|langmatches|datatype|bound|iri|uri|bnode|rand|abs|ceil|floor|round|concat|strlen|ucase|lcase|encode_for_uri|contains|strstarts|strends|strbefore|strafter|year|month|day|hours|minutes|seconds|timezone|tz|now|md5|sha1|sha256|sha384|sha512|coalesce|if|strlang|strdt|sameterm|isiri|isuri|isblank|isliteral|isnumeric|regex|substr|replace|exists|not\s+exists|count|sum|min|max|avg|sample|group_concat|separator)\b">
 67        <token type="NameFunction"/>
 68      </rule>
 69      <rule pattern="(true|false)">
 70        <token type="KeywordConstant"/>
 71      </rule>
 72      <rule pattern="[+\-]?(\d+\.\d*[eE][+-]?\d+|\.?\d+[eE][+-]?\d+)">
 73        <token type="LiteralNumberFloat"/>
 74      </rule>
 75      <rule pattern="[+\-]?(\d+\.\d*|\.\d+)">
 76        <token type="LiteralNumberFloat"/>
 77      </rule>
 78      <rule pattern="[+\-]?\d+">
 79        <token type="LiteralNumberInteger"/>
 80      </rule>
 81      <rule pattern="(\|\||&&|=|\*|\-|\+|/|!=|<=|>=|!|<|>)">
 82        <token type="Operator"/>
 83      </rule>
 84      <rule pattern="[(){}.;,:^\[\]]">
 85        <token type="Punctuation"/>
 86      </rule>
 87      <rule pattern="#[^\n]*">
 88        <token type="Comment"/>
 89      </rule>
 90      <rule pattern=""""">
 91        <token type="LiteralString"/>
 92        <push state="triple-double-quoted-string"/>
 93      </rule>
 94      <rule pattern=""">
 95        <token type="LiteralString"/>
 96        <push state="single-double-quoted-string"/>
 97      </rule>
 98      <rule pattern="'''">
 99        <token type="LiteralString"/>
100        <push state="triple-single-quoted-string"/>
101      </rule>
102      <rule pattern="'">
103        <token type="LiteralString"/>
104        <push state="single-single-quoted-string"/>
105      </rule>
106    </state>
107    <state name="triple-double-quoted-string">
108      <rule pattern=""""">
109        <token type="LiteralString"/>
110        <push state="end-of-string"/>
111      </rule>
112      <rule pattern="[^\\]+">
113        <token type="LiteralString"/>
114      </rule>
115      <rule pattern="\\">
116        <token type="LiteralString"/>
117        <push state="string-escape"/>
118      </rule>
119    </state>
120    <state name="single-double-quoted-string">
121      <rule pattern=""">
122        <token type="LiteralString"/>
123        <push state="end-of-string"/>
124      </rule>
125      <rule pattern="[^"\\\n]+">
126        <token type="LiteralString"/>
127      </rule>
128      <rule pattern="\\">
129        <token type="LiteralString"/>
130        <push state="string-escape"/>
131      </rule>
132    </state>
133    <state name="triple-single-quoted-string">
134      <rule pattern="'''">
135        <token type="LiteralString"/>
136        <push state="end-of-string"/>
137      </rule>
138      <rule pattern="[^\\]+">
139        <token type="LiteralString"/>
140      </rule>
141      <rule pattern="\\">
142        <token type="LiteralStringEscape"/>
143        <push state="string-escape"/>
144      </rule>
145    </state>
146    <state name="single-single-quoted-string">
147      <rule pattern="'">
148        <token type="LiteralString"/>
149        <push state="end-of-string"/>
150      </rule>
151      <rule pattern="[^'\\\n]+">
152        <token type="LiteralString"/>
153      </rule>
154      <rule pattern="\\">
155        <token type="LiteralString"/>
156        <push state="string-escape"/>
157      </rule>
158    </state>
159  </rules>
160</lexer>