-
Notifications
You must be signed in to change notification settings - Fork 24
Open
Description
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).
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"
Metadata
Metadata
Assignees
Labels
No labels