Thanks for using Compiler Explorer
Sponsors
Jakt
C++
Ada
Analysis
Assembly
C
Carbon
C++ (Circle)
CIRCT
Clean
CMake
COBOL
C++ for OpenCL
MLIR
Cppx
Cppx-Blue
Cppx-Gold
Cpp2-cppfront
Crystal
C#
CUDA C++
D
Dart
Erlang
Fortran
F#
Go
Haskell
HLSL
Hook
ispc
Java
Julia
Kotlin
LLVM IR
LLVM MIR
Modula-2
Nim
Objective-C
Objective-C++
OCaml
OpenCL C
Pascal
Pony
Python
Racket
Ruby
Rust
Scala
Solidity
Swift
Toit
TypeScript Native
Visual Basic
Zig
c++ source #1
Output
Compile to binary object
Link to binary
Execute the code
Intel asm syntax
Demangle identifiers
Filters
Unused labels
Library functions
Directives
Comments
Horizontal whitespace
Compiler
6502-c++ 11.1.0
ARM gcc 10.2 (linux)
ARM gcc 10.2.1 (none)
ARM gcc 10.3 (linux)
ARM gcc 10.3.1 (2021.07 none)
ARM gcc 10.3.1 (2021.10 none)
ARM gcc 10.4 (linux)
ARM gcc 11.1 (linux)
ARM gcc 11.2 (linux)
ARM gcc 11.2.1 (none)
ARM gcc 11.3 (linux)
ARM gcc 12.1 (linux)
ARM gcc 12.2 (linux)
ARM gcc 4.5.4 (linux)
ARM gcc 4.6.4 (linux)
ARM gcc 5.4 (linux)
ARM gcc 5.4.1 (none)
ARM gcc 6.3.0 (linux)
ARM gcc 6.4 (linux)
ARM gcc 7.2.1 (none)
ARM gcc 7.3 (linux)
ARM gcc 7.5 (linux)
ARM gcc 8.2 (WinCE)
ARM gcc 8.2 (linux)
ARM gcc 8.3.1 (none)
ARM gcc 8.5 (linux)
ARM gcc 9.2.1 (none)
ARM gcc 9.3 (linux)
ARM gcc 9.4 (linux)
ARM gcc 9.5 (linux)
ARM msvc v19.0 (WINE)
ARM msvc v19.10 (WINE)
ARM msvc v19.14 (WINE)
ARM64 Morello gcc 10.1 Alpha 2
ARM64 gcc 10.2
ARM64 gcc 10.3
ARM64 gcc 10.4
ARM64 gcc 11.1
ARM64 gcc 11.2
ARM64 gcc 11.3
ARM64 gcc 12.1
ARM64 gcc 12.2.0
ARM64 gcc 5.4
ARM64 gcc 6.3
ARM64 gcc 6.4
ARM64 gcc 7.3
ARM64 gcc 7.5
ARM64 gcc 8.2
ARM64 gcc 8.5
ARM64 gcc 9.3
ARM64 gcc 9.4
ARM64 gcc 9.5
ARM64 gcc trunk
ARM64 msvc v19.14 (WINE)
AVR gcc 10.3.0
AVR gcc 11.1.0
AVR gcc 12.1.0
AVR gcc 12.2.0
AVR gcc 4.5.4
AVR gcc 4.6.4
AVR gcc 5.4.0
AVR gcc 9.2.0
AVR gcc 9.3.0
Arduino Mega (1.8.9)
Arduino Uno (1.8.9)
BPF clang (trunk)
BPF clang 13.0.0
BPF clang 14.0.0
BPF clang 15.0.0
BPF clang 16.0.0
BPF gcc trunk
FRC 2019
FRC 2020
KVX ACB 4.1.0 (GCC 7.5.0)
KVX ACB 4.1.0-cd1 (GCC 7.5.0)
KVX ACB 4.10.0 (GCC 10.3.1)
KVX ACB 4.11.1 (GCC 10.3.1)
KVX ACB 4.2.0 (GCC 7.5.0)
KVX ACB 4.3.0 (GCC 7.5.0)
KVX ACB 4.4.0 (GCC 7.5.0)
KVX ACB 4.6.0 (GCC 9.4.1)
KVX ACB 4.8.0 (GCC 9.4.1)
KVX ACB 4.9.0 (GCC 9.4.1)
MRISC32 gcc (trunk)
MSP430 gcc 4.5.3
MSP430 gcc 5.3.0
MSP430 gcc 6.2.1
MinGW clang 14.0.3
MinGW clang 14.0.6
MinGW clang 15.0.7
MinGW gcc 11.3.0
MinGW gcc 12.1.0
MinGW gcc 12.2.0
RISC-V rv32gc clang (trunk)
RISC-V rv32gc clang 10.0.0
RISC-V rv32gc clang 10.0.1
RISC-V rv32gc clang 11.0.0
RISC-V rv32gc clang 11.0.1
RISC-V rv32gc clang 12.0.0
RISC-V rv32gc clang 12.0.1
RISC-V rv32gc clang 13.0.0
RISC-V rv32gc clang 13.0.1
RISC-V rv32gc clang 14.0.0
RISC-V rv32gc clang 15.0.0
RISC-V rv32gc clang 16.0.0
RISC-V rv32gc clang 9.0.0
RISC-V rv32gc clang 9.0.1
RISC-V rv32gc gcc 10.2.0
RISC-V rv32gc gcc 10.3.0
RISC-V rv32gc gcc 11.2.0
RISC-V rv32gc gcc 11.3.0
RISC-V rv32gc gcc 12.1.0
RISC-V rv32gc gcc 12.2.0
RISC-V rv32gc gcc 8.2.0
RISC-V rv32gc gcc 8.5.0
RISC-V rv32gc gcc 9.4.0
RISC-V rv64gc clang (trunk)
RISC-V rv64gc clang 10.0.0
RISC-V rv64gc clang 10.0.1
RISC-V rv64gc clang 11.0.0
RISC-V rv64gc clang 11.0.1
RISC-V rv64gc clang 12.0.0
RISC-V rv64gc clang 12.0.1
RISC-V rv64gc clang 13.0.0
RISC-V rv64gc clang 13.0.1
RISC-V rv64gc clang 14.0.0
RISC-V rv64gc clang 15.0.0
RISC-V rv64gc clang 16.0.0
RISC-V rv64gc clang 9.0.0
RISC-V rv64gc clang 9.0.1
RISC-V rv64gc gcc 10.2.0
RISC-V rv64gc gcc 10.3.0
RISC-V rv64gc gcc 11.2.0
RISC-V rv64gc gcc 11.3.0
RISC-V rv64gc gcc 12.1.0
RISC-V rv64gc gcc 12.2.0
RISC-V rv64gc gcc 8.2.0
RISC-V rv64gc gcc 8.5.0
RISC-V rv64gc gcc 9.4.0
Raspbian Buster
Raspbian Stretch
SPARC LEON gcc 12.2.0
SPARC gcc 12.2.0
SPARC64 gcc 12.2.0
TI C6x gcc 12.2.0
TI CL430 21.6.1
WebAssembly clang (trunk)
Xtensa ESP32 gcc 11.2.0 (2022r1)
Xtensa ESP32 gcc 8.2.0 (2019r2)
Xtensa ESP32 gcc 8.2.0 (2020r1)
Xtensa ESP32 gcc 8.2.0 (2020r2)
Xtensa ESP32 gcc 8.4.0 (2020r3)
Xtensa ESP32 gcc 8.4.0 (2021r1)
Xtensa ESP32 gcc 8.4.0 (2021r2)
Xtensa ESP32-S2 gcc 11.2.0 (2022r1)
Xtensa ESP32-S2 gcc 8.2.0 (2019r2)
Xtensa ESP32-S2 gcc 8.2.0 (2020r1)
Xtensa ESP32-S2 gcc 8.2.0 (2020r2)
Xtensa ESP32-S2 gcc 8.4.0 (2020r3)
Xtensa ESP32-S2 gcc 8.4.0 (2021r1)
Xtensa ESP32-S2 gcc 8.4.0 (2021r2)
Xtensa ESP32-S3 gcc 11.2.0 (2022r1)
Xtensa ESP32-S3 gcc 8.4.0 (2020r3)
Xtensa ESP32-S3 gcc 8.4.0 (2021r1)
Xtensa ESP32-S3 gcc 8.4.0 (2021r2)
arm64 msvc v19.28 VS16.9
arm64 msvc v19.29 VS16.10
arm64 msvc v19.29 VS16.11
arm64 msvc v19.30
arm64 msvc v19.31
arm64 msvc v19.32
arm64 msvc v19.33
arm64 msvc v19.latest
armv7-a clang (trunk)
armv7-a clang 10.0.0
armv7-a clang 10.0.1
armv7-a clang 11.0.0
armv7-a clang 11.0.1
armv7-a clang 9.0.0
armv7-a clang 9.0.1
armv8-a clang (trunk)
armv8-a clang (trunk, all architectural features)
armv8-a clang 10.0.0
armv8-a clang 10.0.1
armv8-a clang 11.0.0
armv8-a clang 11.0.1
armv8-a clang 12.0.0
armv8-a clang 13.0.0
armv8-a clang 14.0.0
armv8-a clang 15.0.0
armv8-a clang 16.0.0
armv8-a clang 9.0.0
armv8-a clang 9.0.1
ellcc 0.1.33
ellcc 0.1.34
ellcc 2017-07-16
llvm-mos atari 8-bit
llvm-mos commander X16
llvm-mos commodore 64
llvm-mos mega65
llvm-mos nes-cnrom
llvm-mos nes-mmc1
llvm-mos nes-mmc3
llvm-mos nes-nrom
llvm-mos osi-c1p
loongarch64 gcc 12.2.0
mips clang 13.0.0
mips clang 14.0.0
mips clang 15.0.0
mips clang 16.0.0
mips gcc 11.2.0
mips gcc 12.1.0
mips gcc 12.2.0
mips gcc 5.4
mips gcc 9.3.0 (codescape)
mips64 (el) gcc 12.1.0
mips64 (el) gcc 12.2.0
mips64 (el) gcc 5.4
mips64 clang 13.0.0
mips64 clang 14.0.0
mips64 clang 15.0.0
mips64 clang 16.0.0
mips64 gcc 11.2.0
mips64 gcc 12.1.0
mips64 gcc 12.2.0
mips64 gcc 5.4
mips64el clang 13.0.0
mips64el clang 14.0.0
mips64el clang 15.0.0
mips64el clang 16.0.0
mipsel clang 13.0.0
mipsel clang 14.0.0
mipsel clang 15.0.0
mipsel clang 16.0.0
mipsel gcc 12.1.0
mipsel gcc 12.2.0
mipsel gcc 5.4
nanoMIPS gcc 6.3.0 (mtk)
power gcc 11.2.0
power gcc 12.1.0
power gcc 12.2.0
power gcc 4.8.5
power64 AT12.0 (gcc8)
power64 AT13.0 (gcc9)
power64 gcc 11.2.0
power64 gcc 12.1.0
power64 gcc 12.2.0
power64le AT12.0 (gcc8)
power64le AT13.0 (gcc9)
power64le clang (trunk)
power64le gcc 11.2.0
power64le gcc 12.1.0
power64le gcc 12.2.0
power64le gcc 6.3.0
powerpc64 clang (trunk)
s390x gcc 11.2.0
s390x gcc 12.1.0
s390x gcc 12.2.0
sh gcc 12.2.0
sh gcc 4.9.4
sh gcc 9.5.0
x64 msvc v19.0 (WINE)
x64 msvc v19.10 (WINE)
x64 msvc v19.14
x64 msvc v19.14 (WINE)
x64 msvc v19.15
x64 msvc v19.16
x64 msvc v19.20
x64 msvc v19.21
x64 msvc v19.22
x64 msvc v19.23
x64 msvc v19.24
x64 msvc v19.25
x64 msvc v19.26
x64 msvc v19.27
x64 msvc v19.28
x64 msvc v19.28 VS16.9
x64 msvc v19.29 VS16.10
x64 msvc v19.29 VS16.11
x64 msvc v19.30
x64 msvc v19.31
x64 msvc v19.32
x64 msvc v19.33
x64 msvc v19.latest
x86 djgpp 4.9.4
x86 djgpp 5.5.0
x86 djgpp 6.4.0
x86 djgpp 7.2.0
x86 msvc v19.0 (WINE)
x86 msvc v19.10 (WINE)
x86 msvc v19.14
x86 msvc v19.14 (WINE)
x86 msvc v19.15
x86 msvc v19.16
x86 msvc v19.20
x86 msvc v19.21
x86 msvc v19.22
x86 msvc v19.23
x86 msvc v19.24
x86 msvc v19.25
x86 msvc v19.26
x86 msvc v19.27
x86 msvc v19.28
x86 msvc v19.28 VS16.9
x86 msvc v19.29 VS16.10
x86 msvc v19.29 VS16.11
x86 msvc v19.30
x86 msvc v19.31
x86 msvc v19.32
x86 msvc v19.33
x86 msvc v19.latest
x86 nvc++ 22.11
x86 nvc++ 22.7
x86 nvc++ 22.9
x86 nvc++ 23.1
x86-64 Zapcc 190308
x86-64 clang (amd-stg-open)
x86-64 clang (assertions trunk)
x86-64 clang (experimental -Wlifetime)
x86-64 clang (experimental P1061)
x86-64 clang (experimental P1144)
x86-64 clang (experimental P1221)
x86-64 clang (experimental metaprogramming - P2632)
x86-64 clang (experimental pattern matching)
x86-64 clang (old concepts branch)
x86-64 clang (reflection)
x86-64 clang (resugar)
x86-64 clang (thephd.dev)
x86-64 clang (trunk)
x86-64 clang (widberg)
x86-64 clang 10.0.0
x86-64 clang 10.0.1
x86-64 clang 11.0.0
x86-64 clang 11.0.1
x86-64 clang 12.0.0
x86-64 clang 12.0.1
x86-64 clang 13.0.0
x86-64 clang 13.0.1
x86-64 clang 14.0.0
x86-64 clang 15.0.0
x86-64 clang 16.0.0
x86-64 clang 3.0.0
x86-64 clang 3.1
x86-64 clang 3.2
x86-64 clang 3.3
x86-64 clang 3.4.1
x86-64 clang 3.5
x86-64 clang 3.5.1
x86-64 clang 3.5.2
x86-64 clang 3.6
x86-64 clang 3.7
x86-64 clang 3.7.1
x86-64 clang 3.8
x86-64 clang 3.8.1
x86-64 clang 3.9.0
x86-64 clang 3.9.1
x86-64 clang 4.0.0
x86-64 clang 4.0.1
x86-64 clang 5.0.0
x86-64 clang 5.0.1
x86-64 clang 5.0.2
x86-64 clang 6.0.0
x86-64 clang 6.0.1
x86-64 clang 7.0.0
x86-64 clang 7.0.1
x86-64 clang 7.1.0
x86-64 clang 8.0.0
x86-64 clang 8.0.1
x86-64 clang 9.0.0
x86-64 clang 9.0.1
x86-64 clang rocm-4.5.2
x86-64 clang rocm-5.0.2
x86-64 clang rocm-5.1.3
x86-64 clang rocm-5.2.3
x86-64 clang rocm-5.3.3
x86-64 gcc (contract labels)
x86-64 gcc (contracts)
x86-64 gcc (coroutines)
x86-64 gcc (modules)
x86-64 gcc (trunk)
x86-64 gcc 10.1
x86-64 gcc 10.2
x86-64 gcc 10.3
x86-64 gcc 10.4
x86-64 gcc 11.1
x86-64 gcc 11.2
x86-64 gcc 11.3
x86-64 gcc 12.1
x86-64 gcc 12.2
x86-64 gcc 4.1.2
x86-64 gcc 4.4.7
x86-64 gcc 4.5.3
x86-64 gcc 4.6.4
x86-64 gcc 4.7.1
x86-64 gcc 4.7.2
x86-64 gcc 4.7.3
x86-64 gcc 4.7.4
x86-64 gcc 4.8.1
x86-64 gcc 4.8.2
x86-64 gcc 4.8.3
x86-64 gcc 4.8.4
x86-64 gcc 4.8.5
x86-64 gcc 4.9.0
x86-64 gcc 4.9.1
x86-64 gcc 4.9.2
x86-64 gcc 4.9.3
x86-64 gcc 4.9.4
x86-64 gcc 5.1
x86-64 gcc 5.2
x86-64 gcc 5.3
x86-64 gcc 5.4
x86-64 gcc 5.5
x86-64 gcc 6.1
x86-64 gcc 6.2
x86-64 gcc 6.3
x86-64 gcc 6.4
x86-64 gcc 7.1
x86-64 gcc 7.2
x86-64 gcc 7.3
x86-64 gcc 7.4
x86-64 gcc 7.5
x86-64 gcc 8.1
x86-64 gcc 8.2
x86-64 gcc 8.3
x86-64 gcc 8.4
x86-64 gcc 8.5
x86-64 gcc 9.1
x86-64 gcc 9.2
x86-64 gcc 9.3
x86-64 gcc 9.4
x86-64 gcc 9.5
x86-64 icc 13.0.1
x86-64 icc 16.0.3
x86-64 icc 17.0.0
x86-64 icc 18.0.0
x86-64 icc 19.0.0
x86-64 icc 19.0.1
x86-64 icc 2021.1.2
x86-64 icc 2021.2.0
x86-64 icc 2021.3.0
x86-64 icc 2021.4.0
x86-64 icc 2021.5.0
x86-64 icc 2021.6.0
x86-64 icc 2021.7.0
x86-64 icc 2021.7.1
x86-64 icx 2021.1.2
x86-64 icx 2021.2.0
x86-64 icx 2021.3.0
x86-64 icx 2021.4.0
x86-64 icx 2022.0.0
x86-64 icx 2022.1.0
x86-64 icx 2022.2.0
x86-64 icx 2022.2.1
zig c++ 0.10.0
zig c++ 0.6.0
zig c++ 0.7.0
zig c++ 0.7.1
zig c++ 0.8.0
zig c++ 0.9.0
zig c++ trunk
Options
Source code
#include <boost/spirit/include/qi.hpp> #include <string> namespace qi = boost::spirit::qi; // http://developers.google.com/protocol-buffers/docs/reference/proto2-spec template <typename It> struct proto_grammar : qi::grammar<It> { typedef qi::rule<It, char()> char_rule_type; typedef qi::rule<It, std::string()> string_rule_type; proto_grammar() : proto_grammar::base_type(_proto) { using qi::lit; using qi::digit; using qi::no_skip; using qi::char_; const auto init_id_ = [&no_skip, &char_]( char_rule_type& id, char_rule_type& l , char_rule_type& dd, char_rule_type& underscore) { id %= no_skip[l >> *(l | dd | underscore)]; }; const auto init_type_ = [&no_skip]( char_rule_type& dot, string_rule_type& id , string_rule_type& name, string_rule_type& type) { type %= no_skip[(dot >> *(id >> dot) >> name | *(id >> dot) >> name )]; }; // Delimiters and such _underscore %= char_("_"); _backslash %= char_("\\"); _dot %= char_("."); _zed %= char_("0"); _ex %= char_("xX"); _ex %= char_("eE"); _plus_minus %= char_("+-"); _inf %= lit("inf"); _nan %= lit("nan"); _quote %= char_("\""); _tick %= char_("'"); _eq %= char_("="); _eos %= char_(";"); _paren_open %= char_("("); _paren_close %= char_(")"); _comma %= char_(","); _square_bracket_open %= char_("["); _square_bracket_close %= char_("]"); _brace_open %= char_("{"); _brace_close %= char_("}"); _bracket_open %= char_("<"); _bracket_close %= char_(">"); // Letters and digits _let %= char_("A-Za-z"); _cap_let %= char_("A-Z"); _dec_dig %= char_("0-9"); _oct_dig %= char_("0-7"); _hex_dig %= char_("0-9A-Fa-f"); // Identifiers init_id_(_let, _dec_dig, _id); init_id_(_let, _dec_dig, _full_id); init_id_(_let, _dec_dig, _msg_name); init_id_(_let, _dec_dig, _enum_name); init_id_(_let, _dec_dig, _field_name); init_id_(_let, _dec_dig, _oneof_name); init_id_(_let, _dec_dig, _oneof_name); init_id_(_let, _dec_dig, _map_name); init_id_(_let, _dec_dig, _service_name); init_id_(_let, _dec_dig, _rpc_name); init_id_(_let, _dec_dig, _stream_name); init_type_(_dot, _id, _msg_name, _msg_type); init_type_(_dot, _id, _enum_name, _enum_type); _group_name %= _cap_let >> *(_let >> _dec_dig >> _underscore); // Integer literals _dec_lit %= no_skip[char_("1-9") >> *_dec_dig]; _oct_lit %= no_skip[_zed >> *_oct_dig]; _hex_lit %= no_skip[_zed >> _ex >> +_hex_dig]; _int_lit %= _dec_lit | _oct_lit | _hex_lit; // Floating-point literals _decs %= +_dec_dig; _exp %= _ee >> (_decs | _plus_minus >> _decs); // TODO: TBD: this one is a bit tricky: there's probably better ways to attack this one from a Boost Spirit POV... // floatLit = ( decimals "." [ decimals ] [ exponent ] | decimals exponent | "."decimals [ exponent ] ) | "inf" | "nan" _float_lit %= (_decs >> _dot >> -_decs >> -_exp | _decs >> _exp | _dot >> _decs >> -_exp) | _inf | _nan; // Boolean _bool_lit %= lit("true") | lit("false"); // String literals _quote_or_tick %= char_("'\""); _char_esc %= _backslash >> char_("abfnrtv\\'\""); _oct_esc %= _backslash >> _oct_dig >> _oct_dig >> _oct_dig; _hex_esc %= _backslash >> _ex >> _hex_dig >> _hex_dig; // The last bit in this phrase is literally, "Or Any Characters Not in the Sequence". _char_val %= _hex_esc | _oct_esc | _char_esc | !char_("\0\n\\"); /* Kleene zero or more might work as well: * strLit = ( "'" { charValue } "'" ) | ( '"' { charValue } '"' ) */ _str_lit %= (_tick >> (_tick | +_char_val >> _tick)) | (_quote >> (_quote | +_char_val >> _quote)); // Empty Statement _empty_statement %= _eos; // Constant _const %= _full_id | (-_plus_minus >> _int_lit) | (-_plus_minus >> _float_lit) | _str_lit | _bool_lit ; // Syntax // This is just lazy spec authorship IMO: syntax = "syntax" "=" quote "proto2" quote ";" _syntax %= lit("syntax") >> _eq >> no_skip[ (_tick >> lit("proto2") >> _tick) | (_quote >> lit("proto2") >> _quote) ]; // Import Statement // import = "import" [ "weak" | "public" ] strLit ";" _import %= lit("import") >> -(lit("weak") | lit("public")) >> _str_lit >> _empty_statement; // Package // package = "package" fullIdent ";" _package %= lit("package") >> _full_id >> _empty_statement; // Option _opt_name %= no_skip[ (_id | _paren_open >> _full_id >> _paren_close) >> *(_dot >> _id) ]; _opt %= lit("option") >> _opt_name >> _eq >> _const >> _empty_statement; // Fields _field_num %= _int_lit; _label %= lit("required") | lit("optional") | lit("repeated"); _type %= lit("double") | lit("float") | lit("int32") | lit("int64") | lit("uint32") | lit("uint64") | lit("sint32") | lit("sint64") | lit("fixed32") | lit("fixed64") | lit("sfixed32") | lit("sfixed64") | lit("bool") | lit("string") | lit("bytes") | _msg_type | _enum_type ; // Normal field _field_opt %= _opt_name >> _eq >> _const; _field_opts %= _field_opt % _comma; _field %= _label >> _type >> _field_name >> _eq >> _field_num >> -(_square_bracket_open >> _field_opts >> _square_bracket_closed) >> _empty_statement; // Group field _group %= _label >> lit("group") >> _group_name >> _eq >> _field_num >> _msg_body; // Oneof and oneof field _oneof_field %= _type >> _field_name >> _eq >> _field_num >> -(_square_bracket_open >> _field_opts >> _square_bracket_closed) >> _empty_statement; _oneof %= lit("oneof") >> _oneof_name >> _brace_open >> *(_oneof_field >> _empty_statement) >> _brace_closed; // Map field _key_type %= lit("int32") | lit("int64") | lit("uint32") | lit("uint64") | lit("sint32") | lit("sint64") | lit("fixed32") | lit("fixed64") | lit("sfixed32") | lit("sfixed64") | lit("bool") | lit("string") ; // Long-winded phrase to say this: mapField = "map" "<" keyType "," type ">" mapName "=" fieldNumber [ "[" fieldOptions "]" ] ";" _map_field %= lit("map") >> _bracket_open >> _key_type >> _comma >> _type >> _bracket_close >> _map_name >> _eq >> _field_num >> -(_square_bracket_open >> _field_opts >> _square_bracket_closed) >> _empty_statement; // Extensions and Reserved, Extensions ... _range %= _int_lit >> -(lit("to") >> (_int_lit | lit("max")); _ranges %= _range % _comma; _extensions %= lit("extensions") >> _ranges >> _empty_statement; // Reserved _reserved %= lit("reserved") >> (_ranges | _field_names) >> _empty_statement; _field_names %= _field_name % _comma; // Up to this point it has been elementary bits and pieces... // Enum definition _enum_val_opt %= _opt_name >> _eq >> _const; _enum_field %= _id >> _eq > _int_lit >> -(_square_bracket_open >> (_enum_val_opt % _comma) >> _square_bracket_closed) >> _empty_statement; _enum_body %= _brace_open >> *(_opt | _enum_field | _empty_statement) >> _brace_closed; _enum %= lit("enum") >> _enum_name >> _enum_body; // Message definition _msg %= lit("message") >> _msg_name >> _msg_body; _msg_body %= _brace_open >> *( _field | _enum | _msg | _extend | _extensions | _group | _opt | _oneof | _map_field | _reserved | _empty_statement ) >> _brace_closed; // Extend _extend %= lit("extend") >> _msg_type >> _brace_open >> *(_field | _group | _empty_statement) >> _brace_closed; // Service definition _service %= lit("service") >> _service_name >> _brace_open >> *(_opt | _rpc | _stream | _empty_statement) >> _brace_closed; _rpc %= lit("rpc") >> _rpc_name >> _paren_open >> -lit("stream") >> _msg_type >> _paren_close >> lit("returns") >> _paren_open >> -lit("stream") >> _msg_type >> _paren_close >> ((_brace_open >> *(_opt | _empty_statement) >> _brace_closed) | _empty_statement) ; _stream %= lit("stream") >> _stream_name >> _paren_open >> _msg_type >> _comma >> _msg_type >> _paren_close >> ((_brace_open >> *(_opt | _empty_statement) >> _brace_closed) | _empty_statement) ; // Proto file _top_level_def %= _msg | _enum | _extend | _service; _proto %= _syntax >> *(_import | _package | _opt | _top_level_def | _empty_statement); } private: char_rule_type _underscore; char_rule_type _backslash; char_rule_type _dot; char_rule_type _zed; char_rule_type _ex; char_rule_type _ee; char_rule_type _eq; char_rule_type _plus_minus; string_rule_type _inf; string_rule_type _nan; char_rule_type _quote; char_rule_type _tick; char_rule_type _paren_open; char_rule_type _paren_close; char_rule_type _square_bracket_open; char_rule_type _square_bracket_closed; char_rule_type _brace_open; char_rule_type _brace_closed; char_rule_type _comma; char_rule_type _bracket_open; char_rule_type _bracket_closed; char_rule_type _let; char_rule_type _cap_let; char_rule_type _dec_dig; char_rule_type _oct_dig; char_rule_type _hex_dig; string_rule_type _id; string_rule_type _full_id; string_rule_type _msg_name; string_rule_type _enum_name; string_rule_type _field_name; string_rule_type _oneof_name; string_rule_type _map_name; string_rule_type _service_name; string_rule_type _rpc_name; string_rule_type _stream_name; string_rule_type _msg_type; string_rule_type _enum_type; string_rule_type _group_name; string_rule_type _int_lit; string_rule_type _dec_lit; string_rule_type _oct_lit; string_rule_type _hex_lit; string_rule_type _float_lit; string_rule_type _decs; string_rule_type _exp; string_rule_type _bool_lit; char_rule_type _quote_or_tick; string_rule_type _char_esc; string_rule_type _oct_esc; string_rule_type _hex_esc; string_rule_type _char_val; string_rule_type _str_lit; string_rule_type _empty_statement; string_rule_type _const; string_rule_type _syntax; string_rule_type _import; string_rule_type _package; string_rule_type _opt; string_rule_type _opt_name; string_rule_type _label; string_rule_type _type; string_rule_type _field_num; string_rule_type _field; string_rule_type _field_opt; string_rule_type _field_opts; string_rule_type _group; string_rule_type _oneof; string_rule_type _oneof_field; string_rule_type _map_field; string_rule_type _key_type; string_rule_type _range; string_rule_type _ranges; string_rule_type _extensions; string_rule_type _reserved; string_rule_type _field_names; string_rule_type _enum_val_opt; string_rule_type _enum_field; string_rule_type _enum_body; string_rule_type _enum; string_rule_type _msg; string_rule_type _msg_body; string_rule_type _extend; string_rule_type _service; string_rule_type _rpc; string_rule_type _stream; string_rule_type _top_level_def; string_rule_type _proto; }; int main() { return 0; }
Become a Patron
Sponsor on GitHub
Donate via PayPal
Source on GitHub
Mailing list
Installed libraries
Wiki
Report an issue
How it works
Contact the author
CE on Mastodon
About the author
Statistics
Changelog
Version tree