We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
I've just added this project grammar to https://mingodad.github.io/parsertl-playground/playground/ an Yacc/Lex compatible online editor/tester (select Protocompile parser from Examples then click Parse to see a parse tree for the content in Input Source), it also generate an EBNF understood by (IPV4) https://rr.red-dove.com/ui or (IPV6) https://www.bottlecaps.de/rr/ui to generate a nice navigable railroad diagram (see instruction bellow at the top).
Yacc/Lex
Protocompile parser
Examples
Parse
Input Source
EBNF
I hope it can help develop/debug/document this project grammar.
// // EBNF to be viewd at // (IPV6) https://www.bottlecaps.de/rr/ui // (IPV4) https://rr.red-dove.com/ui // // Copy and paste this at one of the urls shown above in the 'Edit Grammar' tab // then click the 'View Diagram' tab. // file::= syntaxDecl | editionDecl | fileBody | syntaxDecl fileBody | editionDecl fileBody | /*%empty*/ fileBody::= semicolons fileElements fileElements::= fileElements fileElement | fileElement fileElement::= importDecl | packageDecl | optionDecl | messageDecl | enumDecl | extensionDecl | serviceDecl semicolonList::= ';' | semicolonList ';' semicolons::= semicolonList | /*%empty*/ semicolon::= ';' | /*%empty*/ syntaxDecl::= _SYNTAX '=' stringLit ';' editionDecl::= _EDITION '=' stringLit ';' importDecl::= _IMPORT stringLit semicolons | _IMPORT _WEAK stringLit semicolons | _IMPORT _PUBLIC stringLit semicolons packageDecl::= _PACKAGE qualifiedIdentifier semicolons qualifiedIdentifier::= identifier | qualifiedIdentifier '.' identifier qualifiedIdentifierDot::= qualifiedIdentifierFinal | qualifiedIdentifierLeading qualifiedIdentifierFinal qualifiedIdentifierLeading::= qualifiedIdentifierEntry | qualifiedIdentifierLeading qualifiedIdentifierEntry qualifiedIdentifierFinal::= identifier | qualifiedIdentifierEntry qualifiedIdentifierEntry::= identifier '.' msgElementIdent::= msgElementName | msgElementIdent '.' identifier extElementIdent::= extElementName | extElementIdent '.' identifier oneofElementIdent::= oneofElementName | oneofElementIdent '.' identifier notGroupElementIdent::= notGroupElementName | notGroupElementIdent '.' identifier mtdElementIdent::= mtdElementIdentFinal | mtdElementIdentLeading mtdElementIdentFinal mtdElementIdentLeading::= mtdElementIdentEntry | mtdElementIdentLeading mtdElementIdentEntry mtdElementIdentFinal::= mtdElementName | mtdElementIdentEntry mtdElementIdentEntry::= mtdElementName '.' oneofOptionDecl::= _OPTION optionName '=' optionValue semicolon optionDecl::= _OPTION optionName '=' optionValue semicolons optionNamePart::= identifier | extensionName optionNameEntry::= optionNamePart '.' optionNameFinal::= optionNamePart | optionNameEntry optionNameLeading::= optionNameEntry | optionNameLeading optionNameEntry optionName::= optionNameFinal | optionNameLeading optionNameFinal extensionName::= '(' typeName ')' optionValue::= scalarValue | messageLiteralWithBraces scalarValue::= stringLit | numLit | specialFloatLit | identifier numLit::= _FLOAT_LIT | '-' _FLOAT_LIT | _INT_LIT | '-' _INT_LIT specialFloatLit::= '-' _INF | '-' _NAN stringLit::= _STRING_LIT | stringLit _STRING_LIT messageLiteralWithBraces::= '{' messageTextFormat '}' | '{' '}' messageTextFormat::= messageLiteralFields messageLiteralFields::= messageLiteralFieldEntry | messageLiteralFieldEntry messageLiteralFields messageLiteralFieldEntry::= messageLiteralField | messageLiteralField ',' | messageLiteralField ';' messageLiteralField::= messageLiteralFieldName ':' fieldValue | messageLiteralFieldName messageValue messageLiteralFieldName::= identifier | '[' qualifiedIdentifierDot ']' | '[' qualifiedIdentifierDot '/' qualifiedIdentifierDot ']' fieldValue::= fieldScalarValue | messageLiteral | listLiteral fieldScalarValue::= stringLit | numLit | '-' identifier | identifier messageValue::= messageLiteral | listOfMessagesLiteral messageLiteral::= messageLiteralWithBraces | '<' messageTextFormat '>' | '<' '>' listLiteral::= '[' listElements ']' | '[' ']' listElements::= listElement | listElements ',' listElement listElement::= fieldScalarValue | messageLiteral listOfMessagesLiteral::= '[' messageLiterals ']' | '[' ']' messageLiterals::= messageLiteral | messageLiterals ',' messageLiteral typeName::= qualifiedIdentifierDot | '.' qualifiedIdentifierDot msgElementTypeIdent::= msgElementIdent | '.' qualifiedIdentifier extElementTypeIdent::= extElementIdent | '.' qualifiedIdentifier oneofElementTypeIdent::= oneofElementIdent | '.' qualifiedIdentifier notGroupElementTypeIdent::= notGroupElementIdent | '.' qualifiedIdentifier mtdElementTypeIdent::= mtdElementIdent | '.' qualifiedIdentifierDot fieldCardinality::= _REQUIRED | _OPTIONAL | _REPEATED compactOptions::= '[' compactOptionDecls ']' | '[' ']' compactOptionDecls::= compactOptionFinal | compactOptionLeadingDecls compactOptionFinal compactOptionLeadingDecls::= compactOptionEntry | compactOptionLeadingDecls compactOptionEntry compactOptionFinal::= compactOption | compactOptionEntry compactOptionEntry::= compactOption ',' compactOption::= optionName '=' optionValue | optionName groupDecl::= fieldCardinality _GROUP identifier '=' _INT_LIT '{' messageBody '}' | fieldCardinality _GROUP identifier '=' _INT_LIT compactOptions '{' messageBody '}' messageGroupDecl::= fieldCardinality _GROUP identifier '=' _INT_LIT '{' messageBody '}' semicolons | fieldCardinality _GROUP identifier '=' _INT_LIT compactOptions '{' messageBody '}' semicolons | fieldCardinality _GROUP identifier '{' messageBody '}' semicolons | fieldCardinality _GROUP identifier compactOptions '{' messageBody '}' semicolons oneofDecl::= _ONEOF identifier '{' oneofBody '}' semicolons oneofBody::= /*%empty*/ | oneofElements oneofElements::= oneofElements oneofElement | oneofElement oneofElement::= oneofOptionDecl | oneofFieldDecl | oneofGroupDecl oneofFieldDecl::= oneofElementTypeIdent identifier '=' _INT_LIT semicolon | oneofElementTypeIdent identifier '=' _INT_LIT compactOptions semicolon | oneofElementTypeIdent identifier semicolon | oneofElementTypeIdent identifier compactOptions semicolon oneofGroupDecl::= _GROUP identifier '=' _INT_LIT '{' messageBody '}' | _GROUP identifier '=' _INT_LIT compactOptions '{' messageBody '}' | _GROUP identifier '{' messageBody '}' | _GROUP identifier compactOptions '{' messageBody '}' mapFieldDecl::= mapType identifier '=' _INT_LIT semicolons | mapType identifier '=' _INT_LIT compactOptions semicolons | mapType identifier semicolons | mapType identifier compactOptions semicolons mapType::= _MAP '<' mapKeyType ',' typeName '>' mapKeyType::= _INT32 | _INT64 | _UINT32 | _UINT64 | _SINT32 | _SINT64 | _FIXED32 | _FIXED64 | _SFIXED32 | _SFIXED64 | _BOOL | _STRING extensionRangeDecl::= _EXTENSIONS tagRanges ';' semicolons | _EXTENSIONS tagRanges compactOptions semicolons tagRanges::= tagRange | tagRanges ',' tagRange tagRange::= _INT_LIT | _INT_LIT _TO _INT_LIT | _INT_LIT _TO _MAX enumValueRanges::= enumValueRange | enumValueRanges ',' enumValueRange enumValueRange::= enumValueNumber | enumValueNumber _TO enumValueNumber | enumValueNumber _TO _MAX enumValueNumber::= _INT_LIT | '-' _INT_LIT msgReserved::= _RESERVED tagRanges ';' semicolons | reservedNames enumReserved::= _RESERVED enumValueRanges ';' semicolons | reservedNames reservedNames::= _RESERVED fieldNameStrings semicolons | _RESERVED fieldNameIdents semicolons fieldNameStrings::= stringLit | fieldNameStrings ',' stringLit fieldNameIdents::= identifier | fieldNameIdents ',' identifier enumDecl::= _ENUM identifier '{' enumBody '}' semicolons enumBody::= semicolons | semicolons enumElements enumElements::= enumElements enumElement | enumElement enumElement::= optionDecl | enumValueDecl | enumReserved enumValueDecl::= enumValueName '=' enumValueNumber semicolons | enumValueName '=' enumValueNumber compactOptions semicolons messageDecl::= _MESSAGE identifier '{' messageBody '}' semicolons messageBody::= semicolons | semicolons messageElements messageElements::= messageElements messageElement | messageElement messageElement::= messageFieldDecl | enumDecl | messageDecl | extensionDecl | extensionRangeDecl | messageGroupDecl | optionDecl | oneofDecl | mapFieldDecl | msgReserved messageFieldDecl::= fieldCardinality notGroupElementTypeIdent identifier '=' _INT_LIT semicolons | fieldCardinality notGroupElementTypeIdent identifier '=' _INT_LIT compactOptions semicolons | msgElementTypeIdent identifier '=' _INT_LIT semicolons | msgElementTypeIdent identifier '=' _INT_LIT compactOptions semicolons | fieldCardinality notGroupElementTypeIdent identifier semicolons | fieldCardinality notGroupElementTypeIdent identifier compactOptions semicolons | msgElementTypeIdent identifier semicolons | msgElementTypeIdent identifier compactOptions semicolons extensionDecl::= _EXTEND typeName '{' extensionBody '}' semicolons extensionBody::= /*%empty*/ | extensionElements extensionElements::= extensionElements extensionElement | extensionElement extensionElement::= extensionFieldDecl | groupDecl extensionFieldDecl::= fieldCardinality notGroupElementTypeIdent identifier '=' _INT_LIT semicolon | fieldCardinality notGroupElementTypeIdent identifier '=' _INT_LIT compactOptions semicolon | extElementTypeIdent identifier '=' _INT_LIT semicolon | extElementTypeIdent identifier '=' _INT_LIT compactOptions semicolon serviceDecl::= _SERVICE identifier '{' serviceBody '}' semicolons serviceBody::= semicolons | semicolons serviceElements serviceElements::= serviceElements serviceElement | serviceElement serviceElement::= optionDecl | methodDecl methodDecl::= _RPC identifier methodMessageType _RETURNS methodMessageType semicolons | _RPC identifier methodMessageType _RETURNS methodMessageType '{' methodBody '}' semicolons methodMessageType::= '(' _STREAM typeName ')' | '(' mtdElementTypeIdent ')' methodBody::= semicolons | semicolons methodElements methodElements::= methodElements methodElement | methodElement methodElement::= optionDecl msgElementName::= _NAME | _SYNTAX | _EDITION | _IMPORT | _WEAK | _PUBLIC | _PACKAGE | _TRUE | _FALSE | _INF | _NAN | _DOUBLE | _FLOAT | _INT32 | _INT64 | _UINT32 | _UINT64 | _SINT32 | _SINT64 | _FIXED32 | _FIXED64 | _SFIXED32 | _SFIXED64 | _BOOL | _STRING | _BYTES | _MAP | _TO | _MAX | _SERVICE | _RPC | _STREAM | _RETURNS extElementName::= _NAME | _SYNTAX | _EDITION | _IMPORT | _WEAK | _PUBLIC | _PACKAGE | _OPTION | _TRUE | _FALSE | _INF | _NAN | _DOUBLE | _FLOAT | _INT32 | _INT64 | _UINT32 | _UINT64 | _SINT32 | _SINT64 | _FIXED32 | _FIXED64 | _SFIXED32 | _SFIXED64 | _BOOL | _STRING | _BYTES | _ONEOF | _MAP | _EXTENSIONS | _TO | _MAX | _RESERVED | _ENUM | _MESSAGE | _EXTEND | _SERVICE | _RPC | _STREAM | _RETURNS enumValueName::= _NAME | _SYNTAX | _EDITION | _IMPORT | _WEAK | _PUBLIC | _PACKAGE | _TRUE | _FALSE | _INF | _NAN | _REPEATED | _OPTIONAL | _REQUIRED | _DOUBLE | _FLOAT | _INT32 | _INT64 | _UINT32 | _UINT64 | _SINT32 | _SINT64 | _FIXED32 | _FIXED64 | _SFIXED32 | _SFIXED64 | _BOOL | _STRING | _BYTES | _GROUP | _ONEOF | _MAP | _EXTENSIONS | _TO | _MAX | _ENUM | _MESSAGE | _EXTEND | _SERVICE | _RPC | _STREAM | _RETURNS oneofElementName::= _NAME | _SYNTAX | _EDITION | _IMPORT | _WEAK | _PUBLIC | _PACKAGE | _TRUE | _FALSE | _INF | _NAN | _DOUBLE | _FLOAT | _INT32 | _INT64 | _UINT32 | _UINT64 | _SINT32 | _SINT64 | _FIXED32 | _FIXED64 | _SFIXED32 | _SFIXED64 | _BOOL | _STRING | _BYTES | _ONEOF | _MAP | _EXTENSIONS | _TO | _MAX | _RESERVED | _ENUM | _MESSAGE | _EXTEND | _SERVICE | _RPC | _STREAM | _RETURNS notGroupElementName::= _NAME | _SYNTAX | _EDITION | _IMPORT | _WEAK | _PUBLIC | _PACKAGE | _OPTION | _TRUE | _FALSE | _INF | _NAN | _REPEATED | _OPTIONAL | _REQUIRED | _DOUBLE | _FLOAT | _INT32 | _INT64 | _UINT32 | _UINT64 | _SINT32 | _SINT64 | _FIXED32 | _FIXED64 | _SFIXED32 | _SFIXED64 | _BOOL | _STRING | _BYTES | _ONEOF | _MAP | _EXTENSIONS | _TO | _MAX | _RESERVED | _ENUM | _MESSAGE | _EXTEND | _SERVICE | _RPC | _STREAM | _RETURNS mtdElementName::= _NAME | _SYNTAX | _EDITION | _IMPORT | _WEAK | _PUBLIC | _PACKAGE | _OPTION | _TRUE | _FALSE | _INF | _NAN | _REPEATED | _OPTIONAL | _REQUIRED | _DOUBLE | _FLOAT | _INT32 | _INT64 | _UINT32 | _UINT64 | _SINT32 | _SINT64 | _FIXED32 | _FIXED64 | _SFIXED32 | _SFIXED64 | _BOOL | _STRING | _BYTES | _GROUP | _ONEOF | _MAP | _EXTENSIONS | _TO | _MAX | _RESERVED | _ENUM | _MESSAGE | _EXTEND | _SERVICE | _RPC | _RETURNS identifier::= _NAME | _SYNTAX | _EDITION | _IMPORT | _WEAK | _PUBLIC | _PACKAGE | _OPTION | _TRUE | _FALSE | _INF | _NAN | _REPEATED | _OPTIONAL | _REQUIRED | _DOUBLE | _FLOAT | _INT32 | _INT64 | _UINT32 | _UINT64 | _SINT32 | _SINT64 | _FIXED32 | _FIXED64 | _SFIXED32 | _SFIXED64 | _BOOL | _STRING | _BYTES | _GROUP | _ONEOF | _MAP | _EXTENSIONS | _TO | _MAX | _RESERVED | _ENUM | _MESSAGE | _EXTEND | _SERVICE | _RPC | _STREAM | _RETURNS //Tokens _BOOL ::= "bool" _BYTES ::= "bytes" _DOUBLE ::= "double" _EDITION ::= "edition" _ENUM ::= "enum" _EXTEND ::= "extend" _EXTENSIONS ::= "extensions" _FALSE ::= "false" _FIXED32 ::= "fixed32" _FIXED64 ::= "fixed64" _FLOAT ::= "float" _GROUP ::= "group" _IMPORT ::= "import" _INF ::= "inf" _INT32 ::= "int32" _INT64 ::= "int64" _MAP ::= "map" _MAX ::= "max" _MESSAGE ::= "message" _NAN ::= "nan" _ONEOF ::= "oneof" _OPTIONAL ::= "optional" _OPTION ::= "option" _PACKAGE ::= "package" _PUBLIC ::= "public" _REPEATED ::= "repeated" _REQUIRED ::= "required" _RESERVED ::= "reserved" _RETURNS ::= "returns" _RPC ::= "rpc" _SERVICE ::= "service" _SFIXED32 ::= "sfixed32" _SFIXED64 ::= "sfixed64" _SINT32 ::= "sint32" _SINT64 ::= "sint64" _STREAM ::= "stream" _STRING ::= "string" _SYNTAX ::= "syntax" _TO ::= "to" _TRUE ::= "true" _UINT32 ::= "uint32" _UINT64 ::= "uint64" _WEAK ::= "weak"
The text was updated successfully, but these errors were encountered:
No branches or pull requests
I've just added this project grammar to https://mingodad.github.io/parsertl-playground/playground/ an
Yacc/Lex
compatible online editor/tester (selectProtocompile parser
fromExamples
then clickParse
to see a parse tree for the content inInput Source
), it also generate anEBNF
understood by (IPV4) https://rr.red-dove.com/ui or (IPV6) https://www.bottlecaps.de/rr/ui to generate a nice navigable railroad diagram (see instruction bellow at the top).I hope it can help develop/debug/document this project grammar.
The text was updated successfully, but these errors were encountered: