Skip to content

Grammar railroad diagram #344

@mingodad

Description

@mingodad

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions