1<lexer>
  2  <config>
  3    <name>Protocol Buffer</name>
  4    <alias>protobuf</alias>
  5    <alias>proto</alias>
  6    <filename>*.proto</filename>
  7  </config>
  8  <rules>
  9    <state name="package">
 10      <rule pattern="[a-zA-Z_]\w*">
 11        <token type="NameNamespace"/>
 12        <pop depth="1"/>
 13      </rule>
 14      <rule>
 15        <pop depth="1"/>
 16      </rule>
 17    </state>
 18    <state name="message">
 19      <rule pattern="[a-zA-Z_]\w*">
 20        <token type="NameClass"/>
 21        <pop depth="1"/>
 22      </rule>
 23      <rule>
 24        <pop depth="1"/>
 25      </rule>
 26    </state>
 27    <state name="type">
 28      <rule pattern="[a-zA-Z_]\w*">
 29        <token type="Name"/>
 30        <pop depth="1"/>
 31      </rule>
 32      <rule>
 33        <pop depth="1"/>
 34      </rule>
 35    </state>
 36    <state name="root">
 37      <rule pattern="[ \t]+">
 38        <token type="Text"/>
 39      </rule>
 40      <rule pattern="[,;{}\[\]()<>]">
 41        <token type="Punctuation"/>
 42      </rule>
 43      <rule pattern="/(\\\n)?/(\n|(.|\n)*?[^\\]\n)">
 44        <token type="CommentSingle"/>
 45      </rule>
 46      <rule pattern="/(\\\n)?\*(.|\n)*?\*(\\\n)?/">
 47        <token type="CommentMultiline"/>
 48      </rule>
 49      <rule pattern="\b(extensions|required|repeated|optional|returns|default|option|packed|import|ctype|oneof|max|rpc|to)\b">
 50        <token type="Keyword"/>
 51      </rule>
 52      <rule pattern="(sfixed32|sfixed64|fixed32|fixed64|sint32|sint64|double|string|uint32|uint64|int32|float|int64|bytes|bool)\b">
 53        <token type="KeywordType"/>
 54      </rule>
 55      <rule pattern="(true|false)\b">
 56        <token type="KeywordConstant"/>
 57      </rule>
 58      <rule pattern="(package)(\s+)">
 59        <bygroups>
 60          <token type="KeywordNamespace"/>
 61          <token type="Text"/>
 62        </bygroups>
 63        <push state="package"/>
 64      </rule>
 65      <rule pattern="(message|extend)(\s+)">
 66        <bygroups>
 67          <token type="KeywordDeclaration"/>
 68          <token type="Text"/>
 69        </bygroups>
 70        <push state="message"/>
 71      </rule>
 72      <rule pattern="(enum|group|service)(\s+)">
 73        <bygroups>
 74          <token type="KeywordDeclaration"/>
 75          <token type="Text"/>
 76        </bygroups>
 77        <push state="type"/>
 78      </rule>
 79      <rule pattern="\".*?\"">
 80        <token type="LiteralString"/>
 81      </rule>
 82      <rule pattern="\'.*?\'">
 83        <token type="LiteralString"/>
 84      </rule>
 85      <rule pattern="(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*">
 86        <token type="LiteralNumberFloat"/>
 87      </rule>
 88      <rule pattern="(\d+\.\d*|\.\d+|\d+[fF])[fF]?">
 89        <token type="LiteralNumberFloat"/>
 90      </rule>
 91      <rule pattern="(\-?(inf|nan))\b">
 92        <token type="LiteralNumberFloat"/>
 93      </rule>
 94      <rule pattern="0x[0-9a-fA-F]+[LlUu]*">
 95        <token type="LiteralNumberHex"/>
 96      </rule>
 97      <rule pattern="0[0-7]+[LlUu]*">
 98        <token type="LiteralNumberOct"/>
 99      </rule>
100      <rule pattern="\d+[LlUu]*">
101        <token type="LiteralNumberInteger"/>
102      </rule>
103      <rule pattern="[+-=]">
104        <token type="Operator"/>
105      </rule>
106      <rule pattern="([a-zA-Z_][\w.]*)([ \t]*)(=)">
107        <bygroups>
108          <token type="Name"/>
109          <token type="Text"/>
110          <token type="Operator"/>
111        </bygroups>
112      </rule>
113      <rule pattern="[a-zA-Z_][\w.]*">
114        <token type="Name"/>
115      </rule>
116    </state>
117  </rules>
118</lexer>