1<lexer>
  2  <config>
  3    <name>Protocol Buffer Text Format</name>
  4    <alias>txtpb</alias>
  5    <filename>*.txtpb</filename>
  6    <filename>*.textproto</filename>
  7    <filename>*.textpb</filename>
  8    <filename>*.pbtxt</filename>
  9    <mime_type>application/x-protobuf-text</mime_type>
 10    <case_insensitive>false</case_insensitive>
 11    <dot_all>false</dot_all>
 12    <ensure_nl>true</ensure_nl>
 13  </config>
 14  <rules>
 15    <state name="double-quote">
 16      <rule pattern="\\[abfnrtv\\\?&#39;&#34;]">
 17        <token type="LiteralStringEscape"/>
 18      </rule>
 19      <rule pattern="\\[0-7]{1,3}">
 20        <token type="LiteralStringEscape"/>
 21      </rule>
 22      <rule pattern="\\x[0-9a-fA-F]{1,2}">
 23        <token type="LiteralStringEscape"/>
 24      </rule>
 25      <rule pattern="\\u[0-9a-fA-F]{4}">
 26        <token type="LiteralStringEscape"/>
 27      </rule>
 28      <rule pattern="\\U000[0-9a-fA-F]{5}">
 29        <token type="LiteralStringEscape"/>
 30      </rule>
 31      <rule pattern="\\U0010[0-9a-fA-F]{4}">
 32        <token type="LiteralStringEscape"/>
 33      </rule>
 34      <rule pattern="[^&#34;\\]+">
 35        <token type="LiteralStringDouble"/>
 36      </rule>
 37      <rule pattern="&#34;">
 38        <token type="LiteralStringDouble"/>
 39        <pop depth="1"/>
 40      </rule>
 41    </state>
 42
 43    <state name="single-quote">
 44      <rule pattern="\\[abfnrtv\\\?&#39;&#34;]">
 45        <token type="LiteralStringEscape"/>
 46      </rule>
 47      <rule pattern="\\[0-7]{1,3}">
 48        <token type="LiteralStringEscape"/>
 49      </rule>
 50      <rule pattern="\\x[0-9a-fA-F]{1,2}">
 51        <token type="LiteralStringEscape"/>
 52      </rule>
 53      <rule pattern="\\u[0-9a-fA-F]{4}">
 54        <token type="LiteralStringEscape"/>
 55      </rule>
 56      <rule pattern="\\U000[0-9a-fA-F]{5}">
 57        <token type="LiteralStringEscape"/>
 58      </rule>
 59      <rule pattern="\\U0010[0-9a-fA-F]{4}">
 60        <token type="LiteralStringEscape"/>
 61      </rule>
 62      <rule pattern="[^&#39;\\]+">
 63        <token type="LiteralStringSingle"/>
 64      </rule>
 65      <rule pattern="&#39;">
 66        <token type="LiteralStringSingle"/>
 67        <pop depth="1"/>
 68      </rule>
 69    </state>
 70
 71    <state name="root">
 72      <!-- Comments -->
 73      <rule pattern="#.*\n">
 74        <token type="CommentSingle"/>
 75      </rule>
 76
 77      <!-- Whitespace -->
 78      <rule pattern="[ \n\t\v\f\r]+">
 79        <token type="Text"/>
 80      </rule>
 81
 82      <!-- Operators -->
 83      <rule pattern="-">
 84        <token type="Operator" />
 85      </rule>
 86
 87      <!-- Special float literals -->
 88      <rule pattern="(?i)(?:inf|infinity)\b">
 89        <token type="LiteralNumberFloat"/>
 90      </rule>
 91      <rule pattern="(?i)nan\b">
 92        <token type="LiteralNumberFloat"/>
 93      </rule>
 94
 95      <!-- Float literals with suffix (must come before decimal integers) -->
 96      <rule pattern="(?:0|[1-9][0-9]*)[fF]">
 97        <token type="LiteralNumberFloat"/>
 98      </rule>
 99
100      <!-- Float literals -->
101      <rule pattern="\.[0-9]+(?:[eE][+-]?[0-9]+)?[fF]?">
102        <token type="LiteralNumberFloat"/>
103      </rule>
104      <rule pattern="(?:0|[1-9][0-9]*)\.[0-9]*(?:[eE][+-]?[0-9]+)?[fF]?">
105        <token type="LiteralNumberFloat"/>
106      </rule>
107      <rule pattern="(?:0|[1-9][0-9]*)[eE][+-]?[0-9]+[fF]?">
108        <token type="LiteralNumberFloat"/>
109      </rule>
110      
111      <!-- Hexadecimal integers -->
112      <rule pattern="0[xX][0-9a-fA-F]+">
113        <token type="LiteralNumberHex"/>
114      </rule>
115      
116      <!-- Octal integers -->
117      <rule pattern="0[0-7]+">
118        <token type="LiteralNumberOct"/>
119      </rule>
120      
121      <!-- Decimal integers -->
122      <rule pattern="(?:0|[1-9][0-9]*)">
123        <token type="LiteralNumberInteger"/>
124      </rule>
125      
126      <!-- Boolean keywords -->
127      <rule pattern="\b(?:[Tt]rue|[Ff]alse|t|f)\b">
128        <token type="KeywordConstant"/>
129      </rule>
130      
131      <!-- Strings -->
132      <rule pattern="&#34;">
133        <token type="LiteralStringDouble"/>
134        <push state="double-quote"/>
135      </rule>
136      <rule pattern="&#39;">
137        <token type="LiteralStringSingle"/>
138        <push state="single-quote"/>
139      </rule>
140      
141      <!-- Qualified names (with dots) for field paths and type URLs -->
142      <rule pattern="[a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*)+">
143        <token type="NameNamespace"/>
144      </rule>
145      
146      <!-- Field names and identifiers (including enum values) -->
147      <rule pattern="[a-zA-Z_][a-zA-Z0-9_]*">
148        <token type="Name"/>
149      </rule>
150      
151      <!-- URL paths in type URLs for Any expansion -->
152      <rule pattern="/[a-zA-Z_][a-zA-Z0-9_/.]*">
153        <token type="NameNamespace"/>
154      </rule>
155      
156      <!-- Punctuation -->
157      <rule pattern="[:;,&lt;&gt;\[\]{}]">
158        <token type="Punctuation"/>
159      </rule>
160    </state>
161  </rules>
162</lexer>