1<lexer>
  2  <config>
  3    <name>BibTeX</name>
  4    <alias>bib</alias>
  5    <alias>bibtex</alias>
  6    <filename>*.bib</filename>
  7    <mime_type>text/x-bibtex</mime_type>
  8    <case_insensitive>true</case_insensitive>
  9    <not_multiline>true</not_multiline>
 10  </config>
 11  <rules>
 12    <state name="closing-brace">
 13      <rule>
 14        <include state="whitespace"/>
 15      </rule>
 16      <rule pattern="[})]">
 17        <token type="Punctuation"/>
 18        <pop depth="1"/>
 19      </rule>
 20    </state>
 21    <state name="braced-string">
 22      <rule pattern="\{">
 23        <token type="LiteralString"/>
 24        <push/>
 25      </rule>
 26      <rule pattern="\}">
 27        <token type="LiteralString"/>
 28        <pop depth="1"/>
 29      </rule>
 30      <rule pattern="[^\{\}]+">
 31        <token type="LiteralString"/>
 32      </rule>
 33    </state>
 34    <state name="whitespace">
 35      <rule pattern="\s+">
 36        <token type="Text"/>
 37      </rule>
 38    </state>
 39    <state name="value">
 40      <rule>
 41        <include state="whitespace"/>
 42      </rule>
 43      <rule pattern="[a-z_@!$&*+\-./:;<>?\[\\\]^`|~][\w@!$&*+\-./:;<>?\[\\\]^`|~]*">
 44        <token type="NameVariable"/>
 45      </rule>
 46      <rule pattern=""">
 47        <token type="LiteralString"/>
 48        <push state="quoted-string"/>
 49      </rule>
 50      <rule pattern="\{">
 51        <token type="LiteralString"/>
 52        <push state="braced-string"/>
 53      </rule>
 54      <rule pattern="[\d]+">
 55        <token type="LiteralNumber"/>
 56      </rule>
 57      <rule pattern="#">
 58        <token type="Punctuation"/>
 59      </rule>
 60      <rule>
 61        <pop depth="1"/>
 62      </rule>
 63    </state>
 64    <state name="quoted-string">
 65      <rule pattern="\{">
 66        <token type="LiteralString"/>
 67        <push state="braced-string"/>
 68      </rule>
 69      <rule pattern=""">
 70        <token type="LiteralString"/>
 71        <pop depth="1"/>
 72      </rule>
 73      <rule pattern="[^\{\"]+">
 74        <token type="LiteralString"/>
 75      </rule>
 76    </state>
 77    <state name="root">
 78      <rule>
 79        <include state="whitespace"/>
 80      </rule>
 81      <rule pattern="@comment">
 82        <token type="Comment"/>
 83      </rule>
 84      <rule pattern="@preamble">
 85        <token type="NameClass"/>
 86        <push state="closing-brace" state="value" state="opening-brace"/>
 87      </rule>
 88      <rule pattern="@string">
 89        <token type="NameClass"/>
 90        <push state="closing-brace" state="field" state="opening-brace"/>
 91      </rule>
 92      <rule pattern="@[a-z_@!$&*+\-./:;<>?\[\\\]^`|~][\w@!$&*+\-./:;<>?\[\\\]^`|~]*">
 93        <token type="NameClass"/>
 94        <push state="closing-brace" state="command-body" state="opening-brace"/>
 95      </rule>
 96      <rule pattern=".+">
 97        <token type="Comment"/>
 98      </rule>
 99    </state>
100    <state name="command-body">
101      <rule>
102        <include state="whitespace"/>
103      </rule>
104      <rule pattern="[^\s\,\}]+">
105        <token type="NameLabel"/>
106        <push state="#pop" state="fields"/>
107      </rule>
108    </state>
109    <state name="fields">
110      <rule>
111        <include state="whitespace"/>
112      </rule>
113      <rule pattern=",">
114        <token type="Punctuation"/>
115        <push state="field"/>
116      </rule>
117      <rule>
118        <pop depth="1"/>
119      </rule>
120    </state>
121    <state name="=">
122      <rule>
123        <include state="whitespace"/>
124      </rule>
125      <rule pattern="=">
126        <token type="Punctuation"/>
127        <pop depth="1"/>
128      </rule>
129    </state>
130    <state name="field">
131      <rule>
132        <include state="whitespace"/>
133      </rule>
134      <rule pattern="[a-z_@!$&*+\-./:;<>?\[\\\]^`|~][\w@!$&*+\-./:;<>?\[\\\]^`|~]*">
135        <token type="NameAttribute"/>
136        <push state="value" state="="/>
137      </rule>
138      <rule>
139        <pop depth="1"/>
140      </rule>
141    </state>
142    <state name="opening-brace">
143      <rule>
144        <include state="whitespace"/>
145      </rule>
146      <rule pattern="[{(]">
147        <token type="Punctuation"/>
148        <pop depth="1"/>
149      </rule>
150    </state>
151  </rules>
152</lexer>