<?xml version="1.0" encoding="UTF-8"?> <!-- Kate syntax highlighting for the Objective Caml 'Ocamlllex' --> <!DOCTYPE language SYSTEM "language.dtd" [ <!-- Regular expresion constants: --> <!ENTITY LOWER "a-z\300-\326\330-\337"> <!-- Lowercase Latin-1 letters. --> <!ENTITY UPPER "A-Z\340-\366\370-\377"> <!-- Uppercase Latin-1 letters. --> <!ENTITY LETTER "&LOWER;&UPPER;"> <!-- All Latin-1 letters. --> <!ENTITY LIDENT "[&LOWER;_][&LETTER;0-9_']*"> <!-- Lowercase OCaml identifiers. --> <!ENTITY UIDENT "`?[&UPPER;][&LETTER;0-9_']*"> <!-- Uppercase OCaml identifiers. --> <!ENTITY IDENT "`?[&LETTER;][&LETTER;0-9_']*"> <!-- All OCaml identifiers. --> ]> <language name="Objective Caml Ocamlyacc" section="Sources" extensions="*.mly" mimetype="" version="3" kateversion="2.4" priority="10" author="Glyn Webster (glynwebster@orcon.net.nz) and Vincent Hugot (vincent.hugot@gmail.com)" license="LGPL" > <highlighting> <list name="typed symbol list keywords"> <item>%token</item> <item>%type</item> </list> <list name="symbol list keywords"> <item>%left</item> <item>%right</item> <item>%nonassoc</item> <item>%start</item> </list> <list name="rule keywords"> <item>%prec</item> <item>error</item> </list> <contexts> <!-- Note: Because the Yacc grammar is so simple I've written this so that any symbol that has not been specifically dealt with by a highlighting rule is an error. --> <!-- Declaration section: Header sections and Yacc symbol declararations. --> <!-- A %% marks the end of the Declaration section and the start of the rules section. --> <context name="Declarations" lineEndContext="#stay" attribute="Error"> <Detect2Chars char="%" char1="{" context="Header" attribute="Normal" beginRegion="header" /> <keyword String="typed symbol list keywords" context="Typed Symbol List" attribute="Keyword" /> <keyword String="symbol list keywords" context="Symbol List" attribute="Keyword" /> <Detect2Chars char="%" char1="%" context="Rules" attribute="Normal" /> <IncludeRules context="General" /> </context> <!-- Header section: Ocaml code in the declarations between %{ %} brackets --> <context name="Header" lineEndContext="#stay" attribute="Normal"> <Detect2Chars char="%" char1="}" context="#pop" attribute="Normal" endRegion="header" /> <IncludeRules context="##Objective Caml" includeAttrib="true" /> </context> <!-- A typed symbol list: an optional Ocaml type declaration between < > brackets, followed by a symbol list. --> <context name="Typed Symbol List" lineEndContext="#pop" attribute="Error"> <DetectChar char="<" context="Type" attribute="Normal" /> <RegExpr String="&UIDENT;" context="Symbol List" attribute="Uppercase Name (Token)" /> <RegExpr String="&LIDENT;" context="Symbol List" attribute="Lowercase Name (Rule)" /> <IncludeRules context="General" /> </context> <context name="Type" lineEndContext="#stay" attribute="Normal"> <DetectChar char=">" context="#pop" attribute="Normal" /> <IncludeRules context="##Objective Caml" includeAttrib="true" /> </context> <!-- A symbol list: one line of sybmol names and option comments. --> <context name="Symbol List" lineEndContext="#pop" attribute="Error"> <RegExpr String="&UIDENT;" context="#stay" attribute="Uppercase Name (Token)" /> <RegExpr String="&LIDENT;" context="#stay" attribute="Lowercase Name (Rule)" /> <IncludeRules context="General" /> </context> <!-- Rules section:. --> <!-- A %% marks the end of the rules section and the start of the trailer section: --> <context name="Rules" lineEndContext="#stay" attribute="Error"> <Detect2Chars char="%" char1="%" context="Trailer" attribute="Normal" /> <RegExpr String="&IDENT;" context="Rule, Expecting Colon" attribute="Rule Definition Name" beginRegion="rule" /> <IncludeRules context="General" /> </context> <context name="Rule, Expecting Colon" lineEndContext="#stay" attribute="Error"> <DetectChar char=":" context="Rule" attribute="Normal" /> <!-- Incomplete rule before the start of the trailer: --> <Detect2Chars char="%" char1="%" context="Trailer" attribute="Error" /> <IncludeRules context="General" /> </context> <context name="Rule" lineEndContext="#stay" attribute="Error"> <DetectChar char=";" context="#pop#pop" attribute="Normal" endRegion="rule" /> <DetectChar char="|" context="#stay" attribute="Normal" /> <keyword String="rule keywords" context="#stay" attribute="Keyword" /> <RegExpr String="&UIDENT;" context="#stay" attribute="Uppercase Name (Token)" /> <RegExpr String="&LIDENT;" context="#stay" attribute="Lowercase Name (Rule)" /> <DetectChar char="{" context="Action" attribute="Normal" beginRegion="action" /> <IncludeRules context="General" /> </context> <!-- A rule action: Ocaml code between { } brackets containing $1,$2,$3.. symbols. --> <!-- (The "Nested Action" contexts override the rules for [ ] and { } brackets in the Objective Caml highlighting file. They make make the $1,$2,$3.. symbols show up inside those brackets.) --> <context name="Action" lineEndContext="#stay" attribute="Normal"> <DetectChar char="}" context="#pop" attribute="Normal" endRegion="action" /> <RegExpr String="[$][0-9]+" context="#stay" attribute="Semantic Attribute" /> <DetectChar char="{" context="Nested Action 1" /> <DetectChar char="[" context="Nested Action 2" /> <IncludeRules context="##Objective Caml" includeAttrib="true" /> </context> <context name="Nested Action 1" lineEndContext="#stay" attribute="Normal"> <DetectChar char="}" context="#pop" /> <IncludeRules context="Action" includeAttrib="true" /> </context> <context name="Nested Action 2" lineEndContext="#stay" attribute="Normal"> <DetectChar char="]" context="#pop" /> <IncludeRules context="Action" includeAttrib="true" /> </context> <!-- Trailer section: Ocaml code until the end of the file. --> <context name="Trailer" lineEndContext="#stay" attribute="Normal"> <IncludeRules context="##Objective Caml" includeAttrib="true" /> </context> <!-- General rules for all contexts: --> <!-- 1) Whitespace is expected. --> <!-- 2) Ocamlyacc's comments are in /* */ brackets and are nestable. --> <context name="General" lineEndContext="#stay" attribute="Normal"> <DetectSpaces context="#stay" attribute="Normal" /> <Detect2Chars char="/" char1="*" context="Comment" attribute="Comment" beginRegion="comment" /> </context> <context name="Comment" lineEndContext="#stay" attribute="Comment"> <Detect2Chars char="*" char1="/" context="#pop" attribute="Comment" endRegion="comment" /> <Detect2Chars char="/" char1="*" context="Comment" attribute="Comment" beginRegion="comment" /> </context> </contexts> <itemDatas> <itemData name="Keyword" defStyleNum="dsOthers" bold="true" /> <itemData name="Normal" defStyleNum="dsOthers" /> <itemData name="Uppercase Name (Token)" defStyleNum="dsOthers" /> <itemData name="Lowercase Name (Rule)" defStyleNum="dsOthers" italic="true" /> <itemData name="Rule Definition Name" defStyleNum="dsOthers" italic="true" bold="true" /> <itemData name="Semantic Attribute" defStyleNum="dsOthers" /> <itemData name="Comment" defStyleNum="dsComment" /> <itemData name="Error" defStyleNum="dsError" /> </itemDatas> </highlighting> <general> <keywords casesensitive="true" weakDeliminator="%" /> <comments> <comment name="multiLine" start="(*" end="*)" /> </comments> </general> </language>